Motion +

ciao a tutti
sto iniziando il progetto di un quadricottero cosi sono andato a comprare il Wii Motion + e dopo aver tolto il connettore e saldato i cavi e montati seguendo queste indicazioni

provo a caricare questo programma

#include <Wire.h>

byte data[6];          //six data bytes
int yaw, pitch, roll;  //three axes
int yaw0, pitch0, roll0;  //calibration zeroes

void wmpOn(){
  Wire.beginTransmission(0x53);    //WM+ starts out deactivated at address 0x53
  Wire.send(0xfe);                 //send 0x04 to address 0xFE to activate WM+
  Wire.send(0x04);
  Wire.endTransmission();          //WM+ jumps to address 0x52 and is now active
}

void wmpSendZero(){
  Wire.beginTransmission(0x52);    //now at address 0x52
  Wire.send(0x00);                 //send zero to signal we want info
  Wire.endTransmission();
}

void calibrateZeroes(){
  for (int i=0;i<10;i++){
    wmpSendZero();
    Wire.requestFrom(0x52,6);
    for (int i=0;i<6;i++){
      data[i]=Wire.receive();
    }
    yaw0+=(((data[3]>>2)<<8)+data[0])/10;        //average 10 readings for each zero
    pitch0+=(((data[4]>>2)<<8)+data[1])/10;
    roll0+=(((data[5]>>2)<<8)+data[2])/10;
  }
  Serial.print("Yaw0:");
  Serial.print(yaw0);
  Serial.print("  Pitch0:");
  Serial.print(pitch0);
  Serial.print("  Roll0:");
  Serial.println(roll0);
}

void receiveData(){
  wmpSendZero();                   //send zero before each request (same as nunchuck)
  Wire.requestFrom(0x52,6);        //request the six bytes from the WM+
  for (int i=0;i<6;i++){
    data[i]=Wire.receive();
  }
  yaw=((data[3]>>2)<<8)+data[0]-yaw0;        //see http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus
  pitch=((data[4]>>2)<<8)+data[1]-pitch0;    //for info on what each byte represents
  roll=((data[5]>>2)<<8)+data[2]-roll0;      
}

void setup(){
  Serial.begin(115200);
  Serial.println("WM+ tester");
  Wire.begin();
  wmpOn();                        //turn WM+ on
  calibrateZeroes();              //calibrate zeroes
  delay(1000);
}

void loop(){
  receiveData();                  //receive data and calculate yaw pitch and roll
  Serial.print("yaw:");           //see diagram on randomhacksofboredom.blogspot.com
  Serial.print(yaw);              //for info on which axis is which
  Serial.print("  pitch:");
  Serial.print(pitch);
  Serial.print("  roll:");
  Serial.println(roll);
  delay(100);
}

ed ottengo questo output da seriale

WM+ tester
Yaw0:0  Pitch0:0  Roll0:0
yaw:0  pitch:0  roll:0
yaw:0  pitch:0  roll:0
yaw:0  pitch:0  roll:0
yaw:0  pitch:0  roll:0
yaw:0  pitch:0  roll:0

come se non fosse collegato nessun VM+ >:(

qualcuno puo darmi una mano? grazie

c

a quanto alimenti il WM+? sai che va alimentato a 3.3v ottimale ma lavora anche con 5? anche io sto facendo un progetto di quadricottero configurazione a X e ti consiglio di prendere un software già fatto.. ad ogni modo hai provato a invertire clock e data? li colleghi ai pin analogici 4 e 5? le masse sonno collegate in comune con arduino?

puoi fare uno schema di come hai collegato il tutto?

si lo alimento a 3.3v ed ho gia provato ad invertire scle sda ma nulla .. si esatto a4 e a5 che sono i due piedini i2c.
non ce molto da fare lo schema .. quello che nella foto e vcc e messo a 3.3 scl ad a5 sda ad a4 e gnd alla gnd di arduino :frowning:

c

non è che alimenti l'arduino a 5V e il motion a 3,3?
prova alimentando tutto a 3,3v, oppure H I F I D U I N O: Implemented 5V to 3.3V I2C level Shifting

e ovvio che l'arduino lo alimento a 5, non funziona a 3.3v il mirco ..

certo che funziona a 3,3V da specifiche atmega, poi chela fequeza non lo supporti :-X
anzi da manuale atmega: operating voltage:
1.8-5.5V@max 4mhz
2.7-5.5V@max 10mhz
4.5-5.5V@max 20mhz
e ti assicuro che funziona bene anche se non rispetti le specifiche, il mio ha fatto girare schetch a 3,3V@16mhz per qualche periodo :slight_smile: ::slight_smile:

be ma comunque a tutti alimentandolo a 5v funziona non capisco perche a me no >:(

le masse sono collegate tutte insieme vero? il wm+ lo alimenti con le uscite a 3.3 e GND dell'arduino o a parte? (magari l'UBEC che metti sul quadri)

non che il 3v3 non abbia abbastanza mA?

ha bisogno di solo 3mA quindi credo riesca, comunque si tutte le masse in comune e si alimentato direttamente ai 3,3v del arduino, c'e collegato solo il WM+ ad arduino :-?