Paso 4: El Software
Ahora para la verdadera diversión: comunicación I2C!
Wii Nunchuks comunicarse a través de un lenguaje llamado I2C, que no es increíblemente complicado, pero tenemos una biblioteca de Arduino para lidiar con esto, la biblioteca de hilos.
Aquí está mi código, hacer lo que se quiere de él!
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
#include //include la biblioteca de alambre
#include
Servo LR; servo para el movimiento de izquierda a derecha
Servo UD; servo para el movimiento de arriba-abajo
Bang del servo; servo para tirar las gomas
char el nunchuck = 0xA4 >> 1; establece la dirección nunchuck como 0xA4 (operacionalmente 0x52)
nunData uint8_t [6]; para el almacenamiento de datos
pedazo de int; para hacer el seguimiento de los trozos de tamaño de byte de datos
int joyX;
int joyY;
int accelX; no se olvide de añadir dos pedacitos debido a protocolo de empaquetado de la nunchuck
int accelY;
int accelZ;
byte Zbutt; último bit aislamientos de numData [5]
byte Cbutt;
void setup() {}
LR.attach(9);
UD.attach(10);
Bang.Attach(11);
Serial.Begin(19200);
Wire.Begin(); inicia la comunicación I2C
Initialize(); configura el nunchuck
Delay(100);
}
{} void initialize()
Wire.beginTransmission (0x52); transmitir al dispositivo 0x52
Wire.Send (0 x 40); envía la dirección de memoria
Wire.Send (0 x 00); envía envía un cero.
Wire.endTransmission (); interrumpir la transmisión
}
void loop() {}
Wire.requestFrom (nunchuck, 6); Enviame esos datos!
trozo = 0;
while(Wire.Available()) {//while allí es los datos a enviar
nunData [fragmento] = decode(Wire.receive()); almacena los datos en valor 'trozo' de nunData como descodifica
pedazo ++;
}
makeVars();
Convert(); paquete de los datos del sensor
Delay(50);
}
convert() {//tells nunchuck para "empaquetar" los datos del sensor de vacío
Wire.beginTransmission(nunchuck); Dile nunchuck para escuchar
Wire.Send(0x00); envía cero
Wire.endTransmission(); PARADA
}
void makeVars() {}
joyX int = nunData [0];
joyY int = nunData [1];
int accelX = nunData [2] * 2 * 2; no se olvide de añadir dos pedacitos debido a protocolo de empaquetado de la nunchuck
int accelY = nunData [3] * 2 * 2;
int accelZ = nunData [4] * 2 * 2;
byte Zbutt = (nunData [5] >> 0) y 1; último bit aislamientos de numData [5]
byte Cbutt = (nunData [5] >> 1) y 1;
accelX = accelX + (nunData [5] >> 2) + 2 * (nunData [5] >> 3); suma los dos bits faltantes a cada valor de la aceleración (faltan bits encontradas 6 bytes)
accelY = accelY + (nunData [5] >> 4) + 2 * (nunData [5] >> 5);
accelZ = accelZ + (nunData [5] >> 6) + 2 * (nunData [5] >> 7);
int horiz = mapa (joyX, 230, 23, 78, 102); es así que hay una pequeña área en el centro donde no accionar la palanca de mando nada (X sentido)
Si (abs (horiz - 90) < = 2) {}
horiz = 90;
}
else if (horiz > 90) {}
horiz-= 2;
}
else if (horiz < 90) {}
horiz += 2;
}
vert int = mapa (joyY, 28, 231, 80, 100); es así que hay una pequeña área en el centro donde no accionar la palanca de mando cualquier cosa (Y dirección)
Si (abs (vert - 90) < = 2) {}
Vert = 90;
}
else if (vert > 90) {}
Vert-= 2;
}
else if (vert < 90) {}
Vert += 2;
}
sesión de int = 90; crea valor de servo tiro
Si ((Zbutt == 0) & & (Cbutt! = 0)) {//if Z se presiona, gire el tiro delantero servo lentamente
tirar = 95;
}
Si ((Cbutt == 0) & & (Zbutt! = 0)) {//if C se presiona, girar tiro servo hacia atrás rápidamente
tirar = 82;
}
LR.send(horiz); enviar todos los valores de servo
UD.send(vert);
Bang.Send(Shoot);
}
decodificación de Char (byte x) {//decodes valor del sensor (contemplada en una declaración anterior)
x = (x ^ 0x17) + 0x17; No tengo ni idea lo que esto significa...
return x;
}
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]