Ejemplo UNO+ MotorShield+2 motores DC+2 servos+WiiChuck

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.

Componentes.jpg

Conector WiChuck.jpg

Conexión motores.JPG

Conexión servos.JPG

Conexión WiiChuck.JPG

Todo conectado.JPG

Amplia la idea con esquemas y mas información y presentalo en Documentación.
Este foro es cuando tienes dudas y ya que lo tuyo es un aporte, complétalo y luego lo mueves a Documentación.
Pidele al moderador que lo haga. O bien lo copias y creas un hilo nuevo.