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);
}