Arduino+Wii Motion Plus
- Войдите на сайт для отправки комментариев
Втр, 13/09/2011 - 15:47
Доброго времени суток! Подскажите пожалуйста как подключить несколько (два или три) 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); }
Этот контроллер жестко будет привязан к этим ногам, так как подключение I2C
к 2, 3 ноге нельзя. WMP общается по шине I2C (он же TWI в терминологии Amtel). Реализован аппаратно. На определенных ногах процессора (которым жестко соответсвуют пины ардуины).
Соотвественно если вы хотите использовать другие ноги, то протокол прийдется реализовывать програмно (не знаю есть ли такие решения).
Но возможно этого не потребуется. I2C шина поддерживает до 127 устройст одновременно. То есть второй WMP тоже нужно подключать на 4,5. И говорить шине какое по номеру устройство вы хотите опросить.
Обычно устройста отличают по адрессу, но это "просто" когда устройства не идентичны. Попробуйте погуглить как идентефицировать идентичные устройства на шине I2C.
Но возможно этого не потребуется. I2C шина поддерживает до 127 устройст одновременно. То есть второй WMP тоже нужно подключать на 4,5. И говорить шине какое по номеру устройство вы хотите опросить.
Обычно устройста отличают по адрессу, но это "просто" когда устройства не идентичны. Попробуйте погуглить как идентефицировать идентичные устройства на шине I2C.
А какая разница, идентичны они или нет, если адреса разные у этих устройств.
>если адреса разные у этих устройств
А если нет? идентичность как раз и подразумевает что адреса одинаковы.
>если адреса разные у этих устройств
А если нет? идентичность как раз и подразумевает что адреса одинаковы.
Как вы будете отличать на шине I2C устройства с одинаковым адресом, не зависимо идентичны они или нет? Или я чего то не понимаю.
Именно так как я и написал: гуглить как это делается. общий подход - использование дополнительного селектора. но для каждого устройства могут быть детали, нужно его даташит смотреть.