poolmicha
05.08.2009, 17:26
Ich würde gern die wii motion plus (WMP) an meinen ATmega8 anschließen und die Daten auslesen, programmiert in Bascom.
Links:
Wii-Nunchuk Code für Arduino (http://www.windmeadow.com/node/42)
Wii-Motion-Plus Code für Arduino (http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html)
Wiibrew.org – Wii-Motion-Plus Infos und Datenformat (http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus)
Forum-Beitrag Nunchuk-Programmierung in Bascom (https://www.roboternetz.de/phpBB2/viewtopic.php?p=389190)
Für das Arduino wurde bereits ein Programm geschrieben, welches die Daten der WMP ausliest.
Analog zu dem Bascom-Programm für das Nunchuk, habe ich versucht ein Programm in Bascom zu schreiben.
Die Nunchuk-Initialiserung ist auskommentiert, da ich erstmal nur die WMP anschließen möchte.
$regfile = "m8def.dat" ' Mega8
$crystal = 14745600 ' takt mit 14.745600 MHz
$lib "i2c.lbx"
Config Scl = Portb.5 ' Ports fuer I2C-Bus
Config Sda = Portb.4
Config Twi = 400000
I2cinit
Twcr = &B00000100 ' I2C-Einstellung
Enable Interrupts
Dim Buffer(6) As Byte
Dim Send1 As Byte
Dim Send2 As Byte
Gosub Wmp_init
'Gosub Nunchuk_init
Waitms 1000
Do
Gosub Read_data
Loop
Wmp_init:
I2cstart
I2cwbyte &HA6
I2cwbyte &HFE ' sends memory address
I2cwbyte &H04 ' sends sent a zero.
I2cstop
Gosub Send_zero
Return
Nunchuk_init:
I2cstart
I2cwbyte &HA4
I2cwbyte &H40 ' sends memory address
I2cwbyte &H00 ' sends sent a zero.
I2cstop
Gosub Send_zero
Return
Send_zero:
I2cstart
I2cwbyte &HA4
I2cwbyte &H00 ' sends one byte
I2cstop
Waitms 1
Return
Read_data:
Buffer(1) = 0
I2creceive &HA4 , Buffer(1) , 0 , 6 ' empfängt 6 Bytes
Send1 = Buffer(2) ' wird später gesendet
Send2 = Buffer(3) ' wird später gesendet
Gosub Send_zero
Return
Wie das Arduino Programm soll mit WMP_init die WMP initialisiert werden, indem es 0x04 an 0xA600FE sendet und dann wird bevor Daten gelesen werden, immer eine 0 an 0xA4 gesendet (wie beim Nunchuk) und dann 6 Bytes mit I2CReceive aus 0xA4 ausgelesen.
Die Platine ist ein Eigenbau, angeschlossen sind sowohl WMP als auch das Nunchuk (direkt an der WMP) und an beiden Erweiterungen liegen 5V an. Der Code funktioniert für das Nunchuk, wenn nunchuk_init ausgeführt wird und wmp_init nicht. Wenn beide Initialisierungen ausgeführt werden, funktioniert auch das Nunchuk nicht. Bei wiibrew.org steht, dass sich die Slaveadresse von 0xA6 zu 0xA4 ändert, sobald die wmp initialisert wird, das könnte der Grund für das ausfallen des Nunchuk sein, da beide dann dieselbe Adresse haben.
Ich habe noch keine Daten von der WMP erhalten können. Weiß jemand, woran das liegen kann?
Hat das schon mal jemand versucht?
Links:
Wii-Nunchuk Code für Arduino (http://www.windmeadow.com/node/42)
Wii-Motion-Plus Code für Arduino (http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html)
Wiibrew.org – Wii-Motion-Plus Infos und Datenformat (http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus)
Forum-Beitrag Nunchuk-Programmierung in Bascom (https://www.roboternetz.de/phpBB2/viewtopic.php?p=389190)
Für das Arduino wurde bereits ein Programm geschrieben, welches die Daten der WMP ausliest.
Analog zu dem Bascom-Programm für das Nunchuk, habe ich versucht ein Programm in Bascom zu schreiben.
Die Nunchuk-Initialiserung ist auskommentiert, da ich erstmal nur die WMP anschließen möchte.
$regfile = "m8def.dat" ' Mega8
$crystal = 14745600 ' takt mit 14.745600 MHz
$lib "i2c.lbx"
Config Scl = Portb.5 ' Ports fuer I2C-Bus
Config Sda = Portb.4
Config Twi = 400000
I2cinit
Twcr = &B00000100 ' I2C-Einstellung
Enable Interrupts
Dim Buffer(6) As Byte
Dim Send1 As Byte
Dim Send2 As Byte
Gosub Wmp_init
'Gosub Nunchuk_init
Waitms 1000
Do
Gosub Read_data
Loop
Wmp_init:
I2cstart
I2cwbyte &HA6
I2cwbyte &HFE ' sends memory address
I2cwbyte &H04 ' sends sent a zero.
I2cstop
Gosub Send_zero
Return
Nunchuk_init:
I2cstart
I2cwbyte &HA4
I2cwbyte &H40 ' sends memory address
I2cwbyte &H00 ' sends sent a zero.
I2cstop
Gosub Send_zero
Return
Send_zero:
I2cstart
I2cwbyte &HA4
I2cwbyte &H00 ' sends one byte
I2cstop
Waitms 1
Return
Read_data:
Buffer(1) = 0
I2creceive &HA4 , Buffer(1) , 0 , 6 ' empfängt 6 Bytes
Send1 = Buffer(2) ' wird später gesendet
Send2 = Buffer(3) ' wird später gesendet
Gosub Send_zero
Return
Wie das Arduino Programm soll mit WMP_init die WMP initialisiert werden, indem es 0x04 an 0xA600FE sendet und dann wird bevor Daten gelesen werden, immer eine 0 an 0xA4 gesendet (wie beim Nunchuk) und dann 6 Bytes mit I2CReceive aus 0xA4 ausgelesen.
Die Platine ist ein Eigenbau, angeschlossen sind sowohl WMP als auch das Nunchuk (direkt an der WMP) und an beiden Erweiterungen liegen 5V an. Der Code funktioniert für das Nunchuk, wenn nunchuk_init ausgeführt wird und wmp_init nicht. Wenn beide Initialisierungen ausgeführt werden, funktioniert auch das Nunchuk nicht. Bei wiibrew.org steht, dass sich die Slaveadresse von 0xA6 zu 0xA4 ändert, sobald die wmp initialisert wird, das könnte der Grund für das ausfallen des Nunchuk sein, da beide dann dieselbe Adresse haben.
Ich habe noch keine Daten von der WMP erhalten können. Weiß jemand, woran das liegen kann?
Hat das schon mal jemand versucht?