Por si a alguien le sirve, este ejemplo permite el control del giro y la velocidad de dos motores DC y la posición de dos servos con el mando Nunchuk de la Nintendo Wii:
Componentes:
- Arduino UNO R3
- Arduino MotorShield
- Mando WII Nunckuk
- Dos servos
- Dos motores DC
- 6 cables con terminales macho-hembra
- 4 cables con terminales macho-macho
- 2 clemas
Conexión WiChuck-Arduino:
- Clock a SCL
- GND a GND
- 3.3V a 3.3V
- Data a SDA
Conexión servos a conectores TinkerKit naranjas del MotorShield:
- 5V en pin más cercano al borde de la placa
- Señal en pin central
- GND en pin más lejano al borde de la placa.
/* Control con un WiiChuck, conectado por 12c,
del sentido de giro y la velocidad de dos motores DC mediante Roll y Pitch
y dos servos mediante JoyX y JoyY, conectados al Arduino Motor Shield.
Los motores funcionarán si el botón Z está pulsado.
Los servos funcionarán si el botón C está pulsado.
Para calibrar correctamente, observar los límites de Pitch, Roll, JoyX y JoyY,
enviando previamente las lecturas por el monitor serie. */
#include "Wire.h"
#include "WiiChuck.h"
#include <Servo.h>
WiiChuck chuck = WiiChuck();
Servo myServoA;
Servo myServoB;
int servoA;
int servoB;
int pitch;
int roll;
int velA;
int velB;
void setup() {
pinMode(12, OUTPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
pinMode(8, OUTPUT);
myServoA.attach(5); // Servo A en OUT5 del Arduino Motor Shield
myServoB.attach(6); // Servo B en OUT6 del Arduino Motor Shield
chuck.begin();
chuck.update();
}
void loop() {
delay(20);
chuck.update();
if (chuck.buttonC == HIGH) { // Si botón C pulsado,
servoA = map(chuck.readJoyX(), -105, 105, 0, 180); // Mapea JoyX
myServoA.write(servoA); // mueve servo A en JoyX
servoB = map(chuck.readJoyY(), 90, -100, 0, 180); // Mapea JoyY
myServoB.write(servoB); // mueve servo B en JoyX
}
if (chuck.buttonZ == LOW) { // Si botón Z no pulsado,
digitalWrite(9, HIGH); // frena motor A
digitalWrite(8, HIGH); // frena motor B
}
else { // si botón Z pulsado,
pitch = chuck.readPitch(); // lee Pitch
if (pitch < 35) pitch = 35; // límite Pitch adelante
if (pitch > 115) pitch = 115; // límite Pitch atrás
roll = chuck.readRoll(); // lee Roll
if (roll < -90) pitch = -90; // límite Roll izquierda
if (roll > 90) pitch = 90; // límite Roll derecha
if (pitch < 70) { // si Pitch adelante,
velA = map(pitch, 35, 70, 255, 0); // mapea velocidad motor A adelante
velB = velA; // velocidad motor B = motor A
if (roll < -10) { // si Roll izquierdo,
velA = velA - map(roll, -90, -10, 0, 255); // disminuye velocidad motor A
}
if (roll > 10) { // Si Roll derecho,
velB = velB - map(roll, 10, 90, 255, 0); // disminuye velocidad motor B
}
digitalWrite(12, HIGH); // motor A adelante
digitalWrite(9, LOW); // quita freno motor A
analogWrite(3, velA); // velocidad motor A
digitalWrite(13, HIGH); // motor B adelante
digitalWrite(8, LOW); // quita freno motor B
analogWrite(11, velB); // velocidad motor B
}
if (pitch > 80) { // si Pitch atrás,
velA = map(pitch, 80, 115, 0, 255); // mapea velocidad motor A atrás
velB = velA; // velocidad motor B = motor A
if (roll < -10) { // Si Roll izquierdo,
velA = velA - map(roll, -90, -10, 0, 255); // disminuye velocidad motor A
}
if (roll > 10) { // Si Roll derecho,
velB = velB - map(roll, 10, 90, 255, 0); // disminuye velocidad motor B
}
digitalWrite(12, LOW); // motor A atrás
digitalWrite(9, LOW); // quita freno motor A
analogWrite(3, velA); // velocidad motor A
digitalWrite(13, LOW); // motor B atrás
digitalWrite(8, LOW); // quita freno motor B
analogWrite(11, velB); // velocidad motor B
}
if (pitch >= 70 && pitch <=80) { // Si Pitch al centro,
digitalWrite(9, HIGH); // frena motor A
digitalWrite(8, HIGH); // frena motor B
}
}
}
Saludos.





