PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wii-Motion-Plus in Bascom ansteuern



poolmicha
05.08.2009, 16: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?

linux_80
05.08.2009, 20:01
Hi,

Du verwendest hier Software-I2C, deswegen ist das mit dem TWCR und Config TWI unnötig. Wie schnell der AVR dann den I2C taktet, weiss ich ned, er versucht, glaub ich, 100kHz hinzubekommen.
Wenn Du die orig TWI-Pins frei hast, würd ich aber die nehmen, dann gehts auch besser mit dem 400kHz Takt.

Du könntest in der Do..Loop Schleife mal das Array ausgeben, um zu sehen ob wie bzw. was kommt, umrechnen (Bitschieberei) kann man später immer noch.
Grundsätzlich würd ich mal so auf die Schnelle meinen schauts ned so Schlecht aus.

Den Nunchuck den ich hab, ging mit 5V nicht richtig, erst mit 3,3V lief er dauerhaft, evtl. ist es beim WM+ auch so :-k

Ich kenn das WM+ nicht, aber ist es von der Wii vorgesehen, dass man beide gleichzeitig verwendet ?

poolmicha
05.08.2009, 21:55
Die TWI-Pins habe ich noch frei und werde es mal mit den Pins versuchen. Ich habe die Daten auch schon via UART geschickt - nur Nullen. Ich habe es aus dem Post rausgelassen zwecks Übersichtlichkeit. Habe leider gerade nicht die Möglichkeit auf 3,3V herabzugehen. Mit dem Arduino-Board läuft die WM+ bei 5V.

Es gibt Spiele, die Nunchuk und WM+ gleichzeitig nutzen. Wahrscheinlich werden Nunchuk und WM+ abwechselnd aktiviert/inaktiviert und dann ausgelesen.

Ich Vermute, dass das Problem bei der Adressierung liegt, das liegt aber vermutlich daran, dass ich nicht alles verstehe, was auf wiibrew.org (http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus) steht.


A status report (0x20) will automatically be sent...
ist 0x20 eine Adresse oder muss ich 0x20 senden um den Report zu erhalten?

The Wii Motion Plus reports its information as 6 bytes of data, readable at 0x(4)a40008 and streamable using Data Reporting Modes...
0xA4 ist die Slave Adresse von der ich die 6 Bytes empfange. wofür steht die 08? Sind Data reporting Modes etwas Wii-internes?

Erstmal genug Fragen. Ich bastel ein wenig.

poolmicha
05.08.2009, 23:07
Ich habe es mit den Standard TWI-Pins versucht. Die TWCR-Definition ist auch auskommentiert. Außerdem habe ich es sowohl mit 400 als auch 100 kHz TWI-Frequenz und auch ohne die Frequenz zu definieren (das müssten dann 400 kHz sein) versucht.

Das gleiche Ergebnis: Nunchuk funktioniert und gibt Sinnvolle Daten zurück, die WM+ führt nur zu Nullen. Die WM+ ist auch noch funktionsfähig (hab gerade Frisbee gespielt).

linux_80
05.08.2009, 23:27
Sicherheitshalber mal nachfragen: Hast Du die i2c-twi.lbx eingebunden, damit auch die TWI-Hardware benutzt wird ?

Um zu sehen ob sich die WM+ nach der ersten Kontaktaufnahme auch meldet, könntest Du mal in der Wmp_init ERR Abfragen (Print Err), gleich nach dem Senden der Slave-Adresse, sollte dann eine 0 rauskommen.
Wenn da aber eine 1 steht, meldet sich die WM+ garnicht !

Ist die WM+ alleine am Bus bei den Tests ?

poolmicha
06.08.2009, 10:13
Sicherheitshalber mal nachfragen: Hast Du die i2c-twi.lbx eingebunden, damit auch die TWI-Hardware benutzt wird ?

nein ... und wenn ich es reinnehme, empfange ich sinnvolle Daten!!

Vielen Dank!

Ich werde jetzt noch die Bytes hin und herschieben und die Daten ausgeben! Ich schreibe später nochmal

poolmicha
07.08.2009, 16:54
So jetzt Funktioniert es so wie es soll:


' Wii-Motion-Plus for Bascom
'
' Here I´ve found nearly everything I needed for it:
' http://www.windmeadow.com/node/42
' http://randomhacksofboredom.blogspot.com/2009/06/wii-motion-plus-arduino-love.html
' http://wiibrew.org/wiki/Wiimote/Extension_Controllers#Wii_Motion_Plus
' https://www.roboternetz.de/phpBB2/viewtopic.php?p=389190
'

$regfile = "M8def.dat" ' Mega8
$crystal = 14745600 ' 14.745600 MHz
$baud = 9600 ' Baud 9600

$lib "I2C_TWI.LBX"
Config Scl = Portc.5 ' Ports for I2C-Bus
Config Sda = Portc.4
Config Twi = 100000
I2cinit

Dim Buffer(6) As Byte

On Ovf1 Ontimer
Timsk.toie1 = 1
Tccr1a = &B00000000
Tccr1b = &B00000010

Enable Interrupts

Dim Yaw As Word
Dim Yaw0 As Byte At Yaw + 1 Overlay
Dim Yaw1 As Byte At Yaw Overlay

Dim Roll As Word
Dim Roll0 As Byte At Roll + 1 Overlay
Dim Roll1 As Byte At Roll Overlay

Dim Pitch As Word
Dim Pitch0 As Byte At Pitch + 1 Overlay
Dim Pitch1 As Byte At Pitch Overlay

Gosub Wmp_init

Waitms 1000

Do

Loop

Ontimer:
Timer1 = 28672 '~50 Hz
Gosub Read_data
Printbin Yaw '
Printbin Roll ' Output
Printbin Pitch
Return

Wmp_init:
I2cstart
I2cwbyte &HA6 ' sends memory address
I2cwbyte &HFE ' WM+ activation
I2cwbyte &H04 . ' Now Adress changes to &HA4
I2cstop
Return

Send_zero:
I2cstart
I2cwbyte &HA4 ' sends memory address
I2cwbyte &H00 ' sends zero before receiving
I2cstop
Waitms 1
Return

Read_data:
Gosub Send_zero ' sends zero before receiving
I2creceive &HA4 , Buffer(1) , 0 , 6 ' receive 6 bytes
Yaw1 = Buffer(1)
Roll1 = Buffer(2) ' Low Bytes
Pitch1 = Buffer(3)
Shift Buffer(4) , Right , 2 : Yaw0 = Buffer(4)
Shift Buffer(5) , Right , 2 : Roll0 = Buffer(5) ' High Bytes
Shift Buffer(6) , Right , 2 : Pitch0 = Buffer(6)
Return

Ich hatte auch noch versucht das Nunchuk zu aktivieren, aber dazu muss man offenischtlich die Wii Motion Plus zuvor noch deaktivieren und das hat jetzt noch nicht funktioniert:

Danke nochmal für die Hilfe

dvh
31.01.2010, 17:35
Ich habe kürzlich eine WM+ zerlegt. Auf der Platine sind nun ISZ-650 (einachsig) und idg-650 (zweiachsig) die Platine hat eine Aufschrift V1.2. Wenn ich die bislang verwendeten I2c Adressen und verwende (0x53, 0xfe,0x04 und dann 0x52,0x00 bekomme ich nur die Daten des ISZ-650. Die sind zwar schön temperaturkompensiert aber der idg-650 schickt offenbar nur Konstanten. Es könnte beim Messen was kaputt gegangen sein oder aber das System braucht eine andere Initialisierung. Hat jemand v1.2 in Gebrauch?

Jaecko
31.01.2010, 17:47
Zur TWI-Frequenz: Ich bin auch gerade am Auslesen eines Nunchuk.
Hier hab ich aber mit den 400 kHz Probleme, d.h. es scheint, als würde sich der Nunchuk aufhängen. Mit 100 kHz gehts problemlos.

dvh
31.01.2010, 17:56
Die Auslese des ISZ-650 geht bei mir mit 400000 (keine Besserung beim IDG-650 bei niedrigeren Frequenzen.
Ein Nunchuk habe ich mit 100000 ohne Probleme am Laufen (ich glaube 400000 ging nicht)