6 skott Arduino gummiband torn (Wii Nunchuck + Arduino) (4 / 5 steg)
Steg 4: Programvaran
Nu till roligt: I2C kommunikation!
Wii Nunchuks kommunicera genom ett språk kallas I2C, vilket inte är vansinnigt komplicerat, men vi har en Arduino-bibliotek för att hantera detta, Wire biblioteket.
Här är min kod, gör vad ni vill det!
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
#include //include tråd biblioteket
#include
Servo LR; servo för vänster-höger rörelse
Servo UD; servo för upp-/ rörelse
Servo bang; servo för skytte gummiband
char nunchuck = 0xA4 >> 1. anger nunchuck adress som 0xA4 (operativt 0x52)
uint8_t nunData [6]. för lagring av data
int bit; för att hålla reda på byte storlek bitar av data
int joyX;
int joyY;
int accelX; se till att lägga till två bitar pga den nunchuck förpackningar protokoll
int accelY;
int accelZ;
byte Zbutt; isolat sista biten av numData [5]
byte Cbutt;
void setup() {
LR.attach(9);
UD.attach(10);
Bang.attach(11);
Serial.BEGIN(19200);
Wire.BEGIN(); börjar I2C kommunikation
Initialize(); sätter upp nunchuck
Delay(100);
}
void initialize() {
Wire.beginTransmission (0x52); överföra till enhet 0x52
Wire.send (0x40); skickar minnesadress
Wire.send (0x00); skickar skickade en nolla.
Wire.endTransmission (); stoppa överföring
}
void loop() {
Wire.requestFrom (nunchuck, 6); Skicka mig dessa data!
bit = 0;
While(Wire.available()) {//while det är data att skicka
nunData [bit] = decode(Wire.receive()); lagrar data värde "bit" av nunData som avkodar det
bit ++;
}
makeVars();
Convert (); paketet sensordata
Delay(50);
}
Annullera Convert () {//tells nunchuck att "paketera" sensordata
Wire.beginTransmission(nunchuck); berätta för nunchuck att lyssna
Wire.send(0x00); skickar noll
Wire.endTransmission(); Stanna
}
void makeVars() {
int joyX = nunData [0];
int joyY = nunData [1].
int accelX = nunData [2] * 2 * 2. se till att lägga till två bitar pga den nunchuck förpackningar protokoll
int accelY = nunData [3] * 2 * 2.
int accelZ = nunData [4] * 2 * 2.
byte Zbutt = (nunData [5] >> 0) & 1; isolat sista biten av numData [5]
byte Cbutt = (nunData [5] >> 1) & 1;
accelX = accelX + (nunData [5] >> 2) + 2 * (nunData [5] >> 3); lägger till de två saknade bitarna till varje accel värde (saknas bitar finns i 6 Byte)
accelY = accelY + (nunData [5] >> 4) + 2 * (nunData [5] >> 5);
accelZ = accelZ + (nunData [5] >> 6) + 2 * (nunData [5] >> 7);
int vågrät = karta (joyX, 23, 230, 102, 78); gör det så finns det ett litet område i mitten där joysticken kommer inte att påverka något (X-riktningen)
om (abs (vågrät - 90) < = 2) {
vågrät = 90.
}
annars om (vågrät > 90) {
vågrät-= 2.
}
annars om (vågrät < 90) {
vågrät += 2.
}
int vert = karta (joyY, 28, 231, 80, 100); gör det så finns det ett litet område i mitten där joysticken kommer inte att påverka något (Y riktning)
om (abs (vert - 90) < = 2) {
Vert = 90.
}
annars om (vert > 90) {
Vert-= 2.
}
annars om (vert < 90) {
Vert + = 2;
}
int skjuta = 90. skytte värdeskapande servo
om ((Zbutt == 0) & & (Cbutt! = 0)) {//if Z trycks, rotera skytte framåt servo långsamt
skjuta = 95.
}
om ((Cbutt == 0) & & (Zbutt! = 0)) {//if C trycks, rotera skytte bakåt servo snabbt
skjuta = 82.
}
LR.send(horiz); Skicka alla servo värden
UD.send(vert);
Bang.send(shoot);
}
char avkoda (byte x) {//decodes sensor värde (som anges av ett tidigare uttalande)
x = (x ^ 0x17) + 0x17; Jag har ingen aning vad det betyder...
återvändande x;
}
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]