- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Wii-Motion-Plus in Bascom ansteuern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2009
    Beiträge
    6

    Wii-Motion-Plus in Bascom ansteuern

    Anzeige

    E-Bike
    Ich würde gern die wii motion plus (WMP) an meinen ATmega8 anschließen und die Daten auslesen, programmiert in Bascom.
    Links:

    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.

    Code:
    $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?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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

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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2009
    Beiträge
    6
    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 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.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2009
    Beiträge
    6
    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).

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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 ?

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2009
    Beiträge
    6
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2009
    Beiträge
    6
    So jetzt Funktioniert es so wie es soll:

    Code:
    ' Wii-Motion-Plus for Bascom
    '
    ' Here I´ve found nearly everything I needed for it:
    ' http://www.windmeadow.com/node/42
    ' http://randomhacksofboredom.blogspot...uino-love.html
    ' http://wiibrew.org/wiki/Wiimote/Exte...ii_Motion_Plus
    ' https://www.roboternetz.de/phpBB2/vi...c.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

  8. #8
    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?

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    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.
    #ifndef MfG
    #define MfG

  10. #10
    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)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests