Paso 4: El código
Primero debe probar el Wii motion Plus, si funciona entonces sólo tiene que conectar el nunchuck de la Wii y va a trabajar también.Nota: tengo el código original de esta página web:
http://Arduino.CC/Forum/index.php/Topic, 8507.0.html
No hago el código que fija sólo para ser capaces de funcionar en el nuevo IDE de Arduino 1.0.2. y he añadido el nuevo código para la
LED, todos los créditos son para knuckles904.
OK, primero necesitas ir a tu librería de arduino y encontrar la alfombra de alambre después de ir a la utilidad y buscar abrir el archivo twi.h
con wordpad y borrar las líneas de //#define ATMEGA8 #endinf y pegar estas líneas en su lugar:
#define ATMEGA8
#ifndef CPU_FREQ ^ M
#define CPU_FREQ L 16000000
#endif
#ifndef TWI_FREQ ^ M
#define TWI_FREQ 100000L
#endif
Guardar el archivo de twi.h y ahora abre tu arduino IDE y copia y pega el código:
#include < Wire.h >
datos del octeto [6]; bytes de datos de seis
int yaw, pitch, roll; tres ejes
int yaw0, pitch0, roll0; calibración de ceros
void wmpOn() {}
Wire.beginTransmission(0x53); WM + comienza desactivado en la dirección 0x53
Wire.Write(0xFE); enviar 0 x 04 a dirección 0xFE para activar el WM +
Wire.Write(0x04);
Wire.endTransmission(); WM + salta a la dirección 0x52 y ahora está activado
}
void wmpSendZero() {}
Wire.beginTransmission(0x52); ahora en la dirección 0x52
Wire.Write(0x00); enviar cero para indicar que queremos información
Wire.endTransmission();
}
void calibrateZeroes() {}
para (int i = 0; i < 10; i ++) {}
wmpSendZero();
Wire.requestFrom(0x52,6);
para (int i = 0; i < 6; i ++) {}
Data[i]=WIRE.Read();
}
yaw0 += (((datos [3] >> 2) << 8) + datos [0]) / 10; promedio de 10 lecturas
pitch0 += (((datos [4] >> 2) << 8) + datos [1]) / 10;
roll0 += (((datos [5] >> 2) << 8) + datos [2]) / 10;
}
Serial.Print("Yaw0:");
Serial.Print(yaw0);
Serial.Print ("Pitch0:");
Serial.Print(pitch0);
Serial.Print ("Roll0:");
Serial.println(roll0);
}
void receiveData() {}
wmpSendZero(); enviar cero antes de cada solicitud (igual como nunchuck)
Wire.requestFrom(0x52,6); solicitar los seis bytes desde el WM +
para (int i = 0; i < 6; i ++) {}
Data[i]=WIRE.Read();
}
desvío = ((datos [3] >> 2) << 8) + datos [0]-yaw0;
pitch = ((datos [4] >> 2) << 8) + datos [1]-pitch0;
rodillo = ((datos [5] >> 2) << 8) + datos [2]-roll0;
}
Ver http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus
para información sobre lo que representa cada byte
void setup() {}
Serial.Begin(115200);
Serial.println ("WM + probador");
Wire.Begin();
wmpOn(); encender WM +
calibrateZeroes(); calibrar los ceros
Delay(1000);
pinMode (11, salida);
pinMode (12, salida);
pinMode (10, salida);
pinMode (9, salida);
pinMode (8, salida);
pinMode (7, salida);
}
void loop() {}
receiveData(); recibir datos y calcular pitch yaw roll
Serial.Print ("yaw:"); //see diagrama de randomhacksofboredom.blogspot.com
Serial.Print(Yaw); para información sobre que eje es que
Serial.Print ("pitch:");
Serial.Print(pitch);
Serial.Print ("roll:");
Serial.println(roll);
Delay(100);
Si (pitch > = 1000) {}
digitalWrite(12,HIGH);
}
else if (pitch < = -1000) {}
digitalWrite(11,HIGH);
}
else if (yaw > = 1000) {}
digitalWrite(10,HIGH);
}
else if (yaw < = -1000) {}
digitalWrite(9,HIGH);
}
else if (roll > = 1000) {}
digitalWrite(8,HIGH);
}
else if (rollo < = -1000) {}
digitalWrite(7,HIGH);
}
Else {}
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
}
}