Hallo
Spannender als die Knöpfe und der analoge Stick sind wohl die Beschleunigungssensoren. Um es Vorweg zu nehmen, die funktionieren prima. Was man vom Abfilmen des LC-Displays nicht sagen kann:
Bild hier
http://www.youtube.com/watch?v=nzs39xchhN4
Die zweiseitige Platine für den Adapter habe ich übrigens aus einer alten ISA-Karte (Paradise Accelerator24 mit EEprom von 1994...)rausgebissen.
Der obere Balken ist Neigen links/rechts, der untere Balken Kippen vor/zurück. Es werden nur 8-Bit ausgewertet, aber mit 20 Zeichen/Zeile kann man das nicht vernünftig auflösen. Die LSB im 6ten Datenbyte sind extrem empfindlich. Ich werde mal eine kleine Anwendung mit Servos dazu basteln. Fahren wäre schwieriger weil ich erst die Bascom-Motorroutinen für den RP6 schreiben müßte.
Das Initialisieren funktioniert jetzt, wichtig scheint zudem eine kurze Pause zwischen dem Senden der "0" und der Abfrage der Bytes zu sein. Der Code sieht nun so aus:
Code:
'WII-Nunchuk mit Bascom auslesen. Grundgerüst des Codes von Linux_80 4.8.08 mic
'https://www.roboternetz.de/phpBB2/viewtopic.php?p=389309
'$regfile = "M8def.dat" ' the used chip
'$crystal = 16000000 ' frequency used
'$baud = 9600
$regfile = "M32def.dat" ' RP6 mit Mega32
$crystal = 8000000 ' taktet mit 8MHz
$baud = 38400 ' Loader-Baud
$lib "i2c_twi.lbx" ' Für Hardware TWI
'Config Scl = Portc.5 ' Ports fuer IIC-Bus
'Config Sda = Portc.4
Config Scl = Portc.0 ' Ports fuer IIC-Bus
Config Sda = Portc.1
Config Twi = 400000 ' Init TWBR und TWSR
I2cinit
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen
'Const Nunchuck_write = &H52 ' Slaveadresse
'Const Nunchuck_read = &H53
Const Nunchuck_write = &HA4 ' Slaveadresse
Const Nunchuck_read = &HA5
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6
Config Lcd = 20 * 4
Deflcdchar 0 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63
Cls 'clear the LCD display
Cursor Off Noblink
Lcd " RP6 ROBOT SYSTEM" 'display this at the top line
Dim Buffer(6) As Byte
Dim B As Byte
Dim Tmp As Byte
Dim Pos_x As Byte
Dim Pos_y As Byte
Dim Acc_x As Byte
Dim Acc_y As Byte
Dim Acc_z As Byte
Dim Buttons As Byte
' Startausgabe
Print
Print "I2C-TWI Demo mit Wii Nunchuck"
Print "Ausgabe auf dem LCD beachten"
Waitms 1000
Gosub Nunchuck_init
Cls
Lcd " WII-Nunchuk am RP6"
Do
Gosub Nunchuk_read
'Print Hex(pos_x) ; " " ; Hex(pos_y)
Locate 2 , 1
Lcd Hex(pos_x)
Lcd " "
Lcd Hex(pos_y)
Locate 2 , 19
If Buttons.0 = 1 Then
Lcd "Z"
Else
Lcd "z"
End If
If Buttons.1 = 1 Then
Lcd "c"
Else
Lcd "C"
End If
Locate 3 , 1
Tmp = Acc_x / 10
For B = 1 To Tmp
Lcd Chr(0)
Next
For B = Tmp To 19
Lcd " "
Next
Locate 4 , 1
Tmp = Acc_y / 10
For B = 1 To Tmp
Lcd Chr(0)
Next
For B = Tmp To 19
Lcd " "
Next
Waitms 100
Loop
End
Nunchuck_init:
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H40 ' sends memory address
I2cwbyte &H00 ' sends sent a zero.
I2cstop
Return
Nunchuk_read:
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H00 ' sends one byte
I2cstop
Waitms 1
Buffer(1) = 0
I2creceive Nunchuck_read , Buffer(1) , 0 , 6
Tmp = Buffer(1) Eor &H17
'Tmp = Tmp + &H17
Pos_x = Tmp
Tmp = Buffer(2) Eor &H17
'Tmp = Tmp + &H17
Pos_y = Tmp
Tmp = Buffer(3) Eor &H17
'Tmp = Tmp + &H17
Acc_x = Tmp
Tmp = Buffer(4) Eor &H17
'Tmp = Tmp + &H17
Acc_y = Tmp
Tmp = Buffer(5) Eor &H17
'Tmp = Tmp + &H17
Acc_z = Tmp
Tmp = Buffer(6) Eor &H17
Tmp = Tmp + &H17
Buttons = Tmp
Return
Die &H17-Addition braucht man zwingend beim 6tem Byte und wenn man mehr als die hochwertigen 8 Bit der Beschleunigungsmesser auswerten möchte ;) Die blockierenden Funktionen gefallen mir noch nicht besonders, soweit ich weiß, kann TWI auch einen Interrupt auslösen. Muss ich mich aber erst etwas einlesen...
Gruß
mic
Lesezeichen