Stap 4: De Software
Nu voor de echte pret: I2C communicatie!
Wii Nunchuks communiceren via een taal, genaamd I2C, die is niet waanzinnig ingewikkeld, maar we hebben een bibliotheek van de Arduino te behandelen dat de draad bibliotheek.
Hier is mijn code, maakt wat u zal hiervan!
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
#include //include de draad bibliotheek
#include
Servo LR; Servo voor links-rechts beweging
Servo UD; Servo voor beweging omhoog / omlaag
Servo bang; Servo voor elastiekjes schieten
char nunchuck = 0xA4 >> 1; nunchuck adres ingesteld als 0xA4 (operationeel 0x52)
uint8_t nunData [6]; voor het opslaan van gegevens
int chunk; voor het bijhouden van de byte grootte brokken vangegevens
int joyX;
int joyY;
int accelX; Zorg ervoor dat het toevoegen van twee bits vanwege de nunchuck verpakking protocol
int accelY;
int accelZ;
byte Zbutt; de laatste stukje van de isolaten van numData [5]
byte Cbutt;
VOID Setup {}
LR.attach(9);
UD.attach(10);
bang.attach(11);
Serial.begin(19200);
Wire.begin(); I2C communicatie begint
Initialize(); stelt de nunchuck
delay(100);
}
ongeldig initialize() {}
Wire.beginTransmission (0x52); verzenden naar apparaat 0x52
Wire.send (0x40); stuurt geheugenadres
Wire.send (0x00); stuurt verzonden een nul.
Wire.endTransmission (); stoppen met het verzenden van
}
void loop {}
Wire.requestFrom (nunchuck, 6); me die gegevens verzenden!
stuk = 0;
while(Wire.available()) {//while er is gegevens moeten worden verzonden
nunData [stuk] = decode(Wire.receive()); slaat gegevens op waarde 'chunk' van nunData, evenals het decodeert het
Brok ++;
}
makeVars();
Convert(); pakket de sensorgegevens
delay(50);
}
VOID convert() {//tells nunchuck "inpakken" de sensorgegevens
Wire.beginTransmission(nunchuck); vertellen nunchuck te luisteren
Wire.send(0x00); stuurt nul
Wire.endTransmission(); STOP
}
ongeldig makeVars() {}
int joyX = nunData [0];
int joyY = nunData [1];
int accelX = nunData [2] * 2 * 2; Zorg ervoor dat het toevoegen van twee bits vanwege de nunchuck verpakking protocol
int accelY = nunData [3] * 2 * 2;
int accelZ = nunData [4] * 2 * 2;
byte Zbutt = (nunData [5] >> 0) & 1; de laatste stukje van de isolaten van numData [5]
byte Cbutt = (nunData [5] >> 1) & 1;
accelX = accelX + (nunData [5] >> 2) + 2 * (nunData [5] >> 3); de twee ontbrekende stukjes voegt aan elke waarde van de accel (ontbrekende stukjes gevonden in 6e Byte)
accelY = accelY + (nunData [5] >> 4) + 2 * (nunData [5] >> 5);
accelZ = accelZ + (nunData [5] >> 6) + 2 * (nunData [5] >> 7);
int horiz = kaart (joyX, 23, 230, 102, 78); maakt het dus er is een klein gebied in het midden waar de joystick niet zal iets (X-richting actuate)
Als (abs (horiz - 90) < = 2) {}
HORIZ = 90;
}
anders als (horiz > 90) {}
HORIZ-= 2;
}
anders als (horiz < 90) {}
HORIZ += 2;
}
int vert = kaart (joyY, 28, 231, 80, 100); maakt het dus er is een klein gebied in het midden waar de joystick niet zal iets (Y-richting actuate)
Als (abs (vert - 90) < = 2) {}
Vert = 90;
}
anders als (vert > 90) {}
Vert-= 2;
}
anders als (vert < 90) {}
Vert += 2;
}
int schieten = 90; creëert schieten servo waarde
Als ((Zbutt == 0) & & (Cbutt! = 0)) {//if Z wordt gedrukt, draaien langzaam vooruit servo schieten
schieten = 95;
}
Als ((Cbutt == 0) & & (Zbutt! = 0)) {//if C wordt gedrukt, draaien snel achteruit servo schieten
schieten = 82;
}
LR.send(horiz); alle waarden van de servo verzenden
UD.send(vert);
bang.send(shoot);
}
char decoderen (byte x) {//decodes sensor waarde (waarnaar wordt verwezen door een eerdere verklaring)
x = (x ^ 0x17) + 0x17; Ik heb geen idee wat dit betekent...
return x;
}
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]