PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wii Nunchuck I2C an Raspberry Pi



wassy92x
27.01.2015, 15:24
Hallo,
ich teste momentan die Verbindung zwischen einem Wii Nunchuck und dem Raspberry Pi.
Hierfür habe ich den Nunchuck per I2C an meinen Raspberry Pi angeschlossen.
Leider konnte ich bisher keine fertigen Libraries für den Raspberry Pi in C finden.
Aus diesem Grund habe ich mich daran gemacht, die gefundenen Libraries auf den Pi zu portieren.
Leider klappt die Kommunikation nicht zu 100%.
Anfangs bekam ich von meinem Controller nur die Werte 0xFF zurück, was ein Fehler vermuten lies.
Nach einigem Testen konnte ich dieses Problem weitgehend fixen.
Jedoch klappt leider die Kommunikation noch nicht zu 100%.
Ich vermute ein Timing-Problem.
Ich habe die Baudrate schon wie in den anderen gefundenen Libraries auf 19200 reduziert, dies führte jedoch zu einem anderen Fehler.
Dabei kamen es zu dem Phänomen, dass mir für die X-Position des Joysticks der Wert 0x4 zurück geliefert wurde. Bewegte ich den Joystick, so wurden die Werte jedoch etwas plausibler.
Jedoch durch den "komischen" Standardwert von 0x4 nicht wirklich auswertbar.
Also setzte ich die Baudrate auf den Standardwert von 100000.
Dabei kommt es seit heute morgen jedoch zu einem anderen Problem.
Immer wieder bekomme ich den Wert 0x00 zurückgeliefert, was ebenfalls auf einen Fehler schließen lässt.
Gestern Abend hatte das selbe Programm mit selber Baudrate noch funktioniert.
Am Besten ich zeige euch einmal meinen Testquellcode.


#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

void main(void) {
int controller = wiringPiI2CSetup(0x52);
unsigned char data[6];
int button_c, button_z;
int j = 1;
wiringPiI2CWriteReg8(controller,0x40,0x00);
delay(50);
wiringPiI2CWrite(controller,0x00);
delay(200);
while(1) {
system("clear");
printf("j=%i\n",j);
for(int i = 0; i < 6; i++) {
data[i] = (wiringPiI2CRead(controller) ^ 0x17) + 0x17;
printf("data=%x\n",data[i]);
}
button_c = !(data[5]&0x02);
button_z = !(data[5]&0x01);
printf("button_c=%i,button_z=%i\n\n",button_c,button_z);
wiringPiI2CWrite(controller,0x00);
j++;
delay(200);
}
}

Die unterschiedlichen Delays wurden schon mehrfach sowohl erhöht, als auch erniedrigt, was jedoch zu keiner wirklichen Verbesserung führte.
Vielleicht hat einer von euch schon ein Mal mit dem Wii Nunchuck und dem Raspberry Pi in C experimentiert und kann mir helfen.
Oder vielleicht kennt einer eine fertige Library für den Pi, die in C geschrieben ist.

Schon ein Mal vielen Dank im Voraus.
Fabian


EDIT:

Ich habe das obige Programm durch eine if-Abfrage erweitert.


if(wiringPiI2CWrite(controller,0x00) < 0) {
fprintf(stderr, "Failure - Can't write 1 Byte\n");
exit(1);
}


Hierdurch konnte ich nun feststellen, dass der Fehler augenscheinlich auf Grund eines fehlerhaften Schreiben auftritt.