Hallo
Nun sind die Servos angeschlossen und werden wahlweise (Umschaltung mit Z/C) mit dem analogen Stick oder den Beschleunigungssensoren gesteuert:
Bild hier
http://www.youtube.com/watch?v=gIlwGfXJxvM
Trotz minimalem Rechenaufwand kann man schon erkennen, das hier etwas funktioniert :) Allerdings noch sehr "zappelig" und ungenau. Ich vermute auch, dass mit den eingelesenen Werten etwas nicht ganz stimmt.
Das inzwischen gewachsene Programm kann nun den Nunchuk abfragen, Servos steuern, auf dem LCD ausgeben und die Tasten meines LCDs einlesen. Erstaunlich wie einfach das alles mit Bascom funktioniert:
Beim Durchlesen ist mir aufgefallen, dass ich dem servo()-Array die 10-bit Werte der Beschleunigungssensoren zuweise. Leider finde ich in der Bascom-Hilfe keinen Hinweis wieviele Bits servo() speichert. Es gibt noch viel zu erforschen...Code:'WII-Nunchuk mit Bascom auslesen. Grundgerüst des Codes von Linux_80 5.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 Config Servos = 2 , Servo1 = Porta.0 , Servo2 = Porta.1 , Reload = 10 Servo(1) = 90 Servo(2) = 85 Config Porta.0 = Output Config Porta.1 = Output Enable Interrupts Dim A As Byte Dim Tmp As Byte Dim Pos_x As Byte Dim Pos_y As Byte Dim Acc_x As Word Dim Acc_y As Word Dim Acc_z As Word Dim Buttons As Byte Dim Tasten As Byte Dim Stick 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" Lcd "acceleration values: " Stick = 1 Do '( Gosub Getkeys Locate 1 , 1 Lcd Bin(tasten) ') 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 = 0 Then Lcd "C" Else Lcd "c" End If Locate 3 , 1 Lcd "Accs X: " ; Hex(acc_x) ; " y: " ; Acc_y; Locate 4 , 6 Lcd "Z: " ; Acc_z ') Locate 2 , 1 Lcd "X: " ; Bin(acc_x) Locate 3 , 1 Lcd "Y: " ; Bin(acc_y) Locate 4 , 1 Lcd "Z: " ; Bin(acc_z) If Buttons.0 = 1 Then Stick = 0 If Buttons.1 = 0 Then Stick = 1 If Stick = 0 Then Servo(1) = Acc_y Servo(2) = Acc_x Else Servo(1) = Pos_y - 30 Servo(2) = Pos_x - 30 End If 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: Dim Buffer(6) As Byte 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 * 4 Acc_x = Acc_x And &HFFC Tmp = Buffer(4) Eor &H17 Tmp = Tmp + &H17 Acc_y = Tmp * 4 Acc_y = Acc_y And &HFFC Tmp = Buffer(5) Eor &H17 Tmp = Tmp + &H17 Acc_z = Tmp * 4 Acc_z = Acc_z And &HFFC Tmp = Buffer(6) Eor &H17 Tmp = Tmp + &H17 Buttons = Tmp If Buttons.2 = 1 Then Set Acc_x.0 ' Die acc-LSB einlesen If Buttons.3 = 1 Then Set Acc_x.1 If Buttons.4 = 1 Then Set Acc_y.0 If Buttons.5 = 1 Then Set Acc_y.1 If Buttons.6 = 1 Then Set Acc_z.0 If Buttons.7 = 1 Then Set Acc_z.1 Return Getkeys: ' Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6 Tasten = 0 'Disable Interrupts Config Pinc.4 = Input Config Pinc.5 = Input Config Pinb.7 = Input Config Pinb.1 = Input Config Pinc.6 = Input Set Portc.4 Set Portc.5 Set Portb.7 Set Portb.1 Set Portc.6 If Pinc.4 = 0 Then Set Tasten.3 If Pinc.5 = 0 Then Set Tasten.2 If Pinb.7 = 0 Then Set Tasten.1 If Pinb.1 = 0 Then Set Tasten.0 If Pinc.6 = 0 Then Set Tasten.4 Reset Portc.4 Reset Portc.5 Reset Portb.7 Reset Portb.1 Reset Portc.6 Config Pinc.4 = Output Config Pinc.5 = Output Config Pinb.7 = Output Config Pinb.1 = Output Config Pinc.6 = Output 'Enable Interrupts Return
Gruß
mic







Zitieren

Lesezeichen