Hii everyone,
I have both nunchuk and wii motion plus and I am working on to build a cheap 6DOF IMU board. I have tried using Nunchuk alone with arduino to get the data and it was success after using different initialization sequence proving that i have a clone.
But , when I connect in similar way wii motion plus with arduino, I am not getting the proper values in serial monitor. The values are struck at 3 ie yaw=pitch=roll=3. I am uploading the screenshot of serial monitor as attachment, and here's the code I am using
/*
Make Projects
Arduino Wii Motion Plus Data Reader
This code is used for the Make Projects: Wii Motion Plus on the Arduino.
Miles code did not include a license however we would like to thank him for posting it!
Author: Miles Moody
Home Page:
http://randomhacksofboredom.blogspot.com/2009/07/motion-plus-and-nunchuck-together-on.html
*/
#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);
}
/*
Additional Reading:
The wii motion plus's initialization sequence was pull from here:
http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus
The data format is well documented here:
http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Data_Format_.28Wii_Motion_Plus.29
More pinout diagrams can be found here:
http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Hardware_.28Wii_Motion_Plus.29
*/
I have extracted the pcb from the WMP and have soldered correctly with proper pinouts. I have a promini 5v version, So powering WMP with 2.95v from voltage divider circuit. When I didn't get the desired result, I connected WMP directly to 5v and got some fair values but they all were 16 bit values which i found as strange as I was hoping to get the values ranging same as those in this link Hacking the Wii MotionPlus to Talk to the Arduino - Make:. Goto step 3 for that image. After trying for few more times i once eventually got result ranging from 1 to 3 but it went away soon. =(
I then again powered it with 2.95v but the values are struck at 3 no matter how I place them.. Now I am not even getting those 16 bit values now.
Please help with this, I tried almost everything before posting it here :~