Arduino+Wii Motion Plus

EvgenDRV
Offline
Зарегистрирован: 11.09.2011

Доброго времени суток! Подскажите пожалуйста как подключить несколько (два или три) WMP к одной Arduino? Один подключить можно к 4 и 5 ноге анал-о входа, но как нужно подправить скетч чтобы можно было подключить ещё WMP допустим к 3 и 2 ноге?

#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
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; 
pitch=((data[4]>>2)<<8)+data[1]-pitch0; 
roll=((data[5]>>2)<<8)+data[2]-roll0; 
}
//see http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus
//for info on what each byte represents
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("\r\n");
Serial.print(pitch);
Serial.print("\r\n");
Serial.println(roll);
delay(100);
}

 

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Этот контроллер жестко будет привязан к этим ногам, так как подключение I2C

leshak
Offline
Зарегистрирован: 29.09.2011

 к 2, 3 ноге нельзя. WMP общается по шине I2C (он же TWI в терминологии Amtel). Реализован аппаратно. На определенных ногах процессора (которым жестко соответсвуют пины ардуины).

Соотвественно если вы хотите использовать другие ноги, то протокол прийдется реализовывать програмно (не знаю есть ли такие решения).

Но возможно этого не потребуется. I2C шина поддерживает до 127 устройст одновременно. То есть второй WMP тоже нужно подключать на 4,5. И говорить шине какое по номеру устройство вы хотите опросить.

Обычно устройста отличают по адрессу, но это "просто" когда устройства не идентичны. Попробуйте погуглить как идентефицировать идентичные устройства на шине I2C.

 

Legsas
Offline
Зарегистрирован: 29.10.2011

leshak пишет:

Но возможно этого не потребуется. I2C шина поддерживает до 127 устройст одновременно. То есть второй WMP тоже нужно подключать на 4,5. И говорить шине какое по номеру устройство вы хотите опросить.

Обычно устройста отличают по адрессу, но это "просто" когда устройства не идентичны. Попробуйте погуглить как идентефицировать идентичные устройства на шине I2C.

А какая разница, идентичны они или нет, если адреса разные у этих устройств.

leshak
Offline
Зарегистрирован: 29.09.2011

>если адреса разные у этих устройств

А если нет? идентичность как раз и подразумевает что адреса одинаковы. 

Legsas
Offline
Зарегистрирован: 29.10.2011

leshak пишет:

>если адреса разные у этих устройств

А если нет? идентичность как раз и подразумевает что адреса одинаковы. 

Как вы будете отличать на шине I2C устройства с одинаковым адресом, не зависимо идентичны они или нет? Или я чего то не понимаю.

leshak
Offline
Зарегистрирован: 29.09.2011

 Именно так как я и написал: гуглить как это делается. общий подход - использование дополнительного селектора. но для каждого устройства могут быть детали, нужно его даташит смотреть.