viernes, 30 de diciembre de 2011

Detector de mentiras conArduinoNunchuk y servo

Este proyecto sirve para probar el manejo del Nunchuk de la Wii. Según se gire en el aire el Nunchukse le envía al servo la orden de giro.

La chorradita del cartel de Mentira y Verdad ha sido para divertir a mi hija pequeña y a una amiga suya.

Estuve sopesando algunas librerías para manejar el Nunchuk y al final me he decantado por http://www.gabrielbianconi.com/projects/arduinonunchuk/

Como adaptador para conectar el nunchuk a Arduino he usado el WiiChuck http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/



Código fuente:

/*
 * Detector de mentiras conArduinoNunchuk y servo
 *
 * Copyleft 2011 Antonio Garcia Figueras
 *
 * Usando libreria de Gabriel Bianconi, http://www.gabrielbianconi.com/
 *
 * Project URL: http://www.gabrielbianconi.com/projects/arduinonunchuk/
 *
 */

#include <Wire.h>
#include "ArduinoNunchuk.h"
#include <Servo.h>

#define BAUDRATE 19200

ArduinoNunchuk nunchuk = ArduinoNunchuk();

Servo myservo;

 int minX;
 int maxX;
 int minY;
 int maxY;
 int minZ;
 int maxZ;
 int contador;
 float razonX;
 int posXServo;

void setup() {
  Serial.begin(BAUDRATE);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo.write(90);  // lo colocamos centrado
  Serial.println("Inicio incializacion");
  nunchuk.init();
  Serial.println("Final incializacion");
  calibraAccel();
 
//Calculo de la razon para calcular el valor del servo (0-180)
//en funcion del movimiento del nunchucku
  razonX = (float)180/(maxX - minX);
  Serial.print("Razon:");
  Serial.println(razonX, DEC);
}

void loop() {
     nunchuk.update();
   
     // Al multiplicar la posicion del nunckuk por la razon
     // lo convertimos a valores entre cero y 180 para el servo
     posXServo = (int)(nunchuk.accelX - (maxX - minX)) * razonX;
     Serial.print("accelX:");
     Serial.println(nunchuk.accelX, DEC);
   
     Serial.print("posXServo:");
     Serial.println(posXServo, DEC);
     if (posXServo > 180) posXServo=180; //por si por los decimales da un valor superior
     if (posXServo < 0) posXServo=0;
   
     myservo.write(posXServo);
   
     delay(10); //Para dar tiempo a que se coloque el servo
 
 
 
//  nunchuk.update();
//
//  Serial.print(nunchuk.analogX, DEC);
//  Serial.print(' ');
//  Serial.print(nunchuk.analogY, DEC);
//  Serial.print(' ');
//  Serial.print(nunchuk.accelX, DEC);
//  Serial.print(' ');
//  Serial.print(nunchuk.accelY, DEC);
//  Serial.print(' ');
//  Serial.print(nunchuk.accelZ, DEC);
//  Serial.print(' ');
//  Serial.print(nunchuk.zButton, DEC);
//  Serial.print(' ');
//  Serial.println(nunchuk.cButton, DEC);
}


// Calibra todos los acelerometros para saber sus
// valores minimos y maximos
void calibraAccel()  {
 nunchuk.update();
 minX = nunchuk.accelX;
 maxX = nunchuk.accelX;
 minY = nunchuk.accelY;
 maxY = nunchuk.accelY;
 minZ = nunchuk.accelZ;
 maxZ = nunchuk.accelZ;
 contador=0;

 Serial.println("Inicio calibracion");

 while (contador<=200){
     Serial.print("Paso=");
     Serial.println(contador);
     nunchuk.update();
     if (nunchuk.accelX < minX){
       minX=nunchuk.accelX;
     }
     if (nunchuk.accelX > maxX){
       maxX=nunchuk.accelX;
     }
   
     if (nunchuk.accelY < minY){
       minY=nunchuk.accelY;
     }
     if (nunchuk.accelY > maxY){
       maxY=nunchuk.accelY;
     }

     if (nunchuk.accelZ < minZ){
       minX=nunchuk.accelZ;
     }
     if (nunchuk.accelZ > maxZ){
       maxZ=nunchuk.accelZ;
     }   
     delay(10);
     contador++;
 }
 Serial.print("Resultado calibracion X. MinX=");
 Serial.print(minX, DEC);
 Serial.print(" MaxX=");
 Serial.print(maxX, DEC);
 Serial.print(" Diferencia=");
 Serial.println(maxX - minX);

 Serial.print("Resultado calibracion Y. MinY=");
 Serial.print(minY, DEC);
 Serial.print(" MaxY=");
 Serial.print(maxY, DEC);
 Serial.print(" Diferencia=");
 Serial.println(maxY - minY);

 Serial.print("Resultado calibracion Z. MinZ=");
 Serial.print(minZ, DEC);
 Serial.print(" MaxZ=");
 Serial.print(maxZ, DEC);
 Serial.print(" Diferencia=");
 Serial.println(maxZ - minZ);
}

No hay comentarios:

Publicar un comentario