Forum: Mikrocontroller und Digitale Elektronik Wii Nunchuk I2C Problem ?


von Mani (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich hoffe dass Ihr mir hier helfen könnt und mal kurz über das 
aufgezeichnete I2C Protokoll drüberschaun.
Ich finde den Fehler einfach nicht.

Zum Thema:
Ich versuche momentan (wie viele Andere auch schon) ein Wii Nunchuk über 
I2C an einem Atmega16 einzulesen. Dafür verwende ich den Hardware I2C 
des Atmels mit 100kHz Clock. Der Atmel selbst läuft auf 16MHz.
Ich verwende im wesentlichen die I2C Bib von Peter Fleury, die ich für 
andere Sachen (EEprom, Portexpander, usw. ) auch schon eingesetzt habe.

Zur Initialisierung bin ich wie auf folgenden Links vorgegangen:
http://www.cc-zwei.de/wiki/index.php/Wii-Nunchuk_Hintergrundwissen
http://www.windmeadow.com/node/42

Pseudocode:
1
init_i2c(100kHz);
2
3
//Initialisierung Nunchuk
4
start(0xA4 + WRITE); //Adresse Nunchuck + 0
5
write(0x40);
6
write(0x00);
7
stop();
8
9
//Register auf 0 setzen für nächstes lesen
10
start(0xA4 + WRITE); //Adresse Nunchuck + 0
11
write(0x00);
12
stop();
13
14
start(0xA4 + READ); //Adresse Nunchuck + 1
15
16
for(i=0;i<5;i++)    //5 Werte mit ACK lesen
17
   {  
18
   data[i]= read_Ack();
19
   }
20
data[5]= read_Nak(); //Letzter Wert lesen
21
stop();


Was ich bis jetzt versucht habe:
* Verringern der Übertragungsgeschwindigkeit (20k-400k).
* Einfügen von Pausen zwischen einzelnen Werten.
* Verringern der Kabellänge (10cm - 1m ).
* Nach dem senden der 0x00 kein Stop sondern Repeatet Start.


Ich hoffe Ihr könnt mir hier mit ein paar Tipps weiterhelfen.

Grüße
Mani

von Mani (Gast)


Lesenswert?

Ach ja, das wichtigste hab ich vergessen :-D

Ich bekomme immer nur 0xFF als Antwort, also keine Reaktion des Nunchuk.

von Peter Z. (hangloose)


Lesenswert?

Bei mir funktioniert es so einwandfrei...
Allerdings mit Codevision und die i2c lib davon.
Vielleicht hilfts ja?!
1
//Init
2
i2c_start();
3
i2c_write(EEPROM_BUS_ADDRESS); 
4
i2c_write(0x40);
5
i2c_write(0x00);
6
i2c_stop();
7
8
//Read Nunchuk
9
i2c_start();
10
i2c_write(EEPROM_BUS_ADDRESS); 
11
i2c_write(0x00);
12
i2c_stop();
13
      
14
i2c_start();
15
i2c_write(EEPROM_BUS_ADDRESS); 
16
i2c_start();
17
i2c_write(EEPROM_BUS_ADDRESS | 1);
18
19
i2c_tx[0]=i2c_read(1);
20
i2c_tx[1]=i2c_read(1);
21
i2c_tx[2]=i2c_read(1);
22
i2c_tx[3]=i2c_read(1);
23
i2c_tx[4]=i2c_read(1);
24
i2c_tx[5]=i2c_read(0);        
25
i2c_stop();

von Mani (Gast)


Lesenswert?

Hallo Peter,

danke für die schnelle Antwort.
Leider hab ich grad kein Codevision zur Verfügung und kann es deshalb 
damit nicht testen, aber trotzdem danke.

Jetzt weis ich zumindest dass Du im Prinzip auch nichts anderes machst 
als ich.

Also Initialisierung mit 0x40 & 0x00, anschließend Register auf 0x00 
stellen und dann die 6 Byte auslesen.

Sollte eigentlich kein Hexenwerk sein, aber irgendwie will es trotzdem 
nicht.
Hast Du Hardwaremäßig noch irgendwelche Besonderheiten?
Glaube langsam dass es an der Hardware liegt (Verkabelung usw. ist 
allerdings Richtig)

Betreibe den ATMega mit 3,3V.
Der Nunchuck ist also direkt, d.h. ohne Levelshifter o.ä., an den ATMega 
angeschlossen.
Das Kabel hab ich durch ein altes Tastaturkabel ersetzt.
Als Pullup-Widerstände hab ich die Standarmäßigen 2x1,8k Ohm vom Nunchuk 
gelassen.


Die gemessenen I2C Datenströme sehen in meinen Augen auch gut aus.
Was meint Ihr?

Grüße
Mani

von Peter Z. (hangloose)


Lesenswert?

Mein Nunchuck ist auch direkt an 3,3V angeschlossen.
Pull Up sind bei mir wenn ich mich grad recht erinnere 10K
aber das sollte nicht das Problem sein.
Vielleicht ist dein Nunchuk defekt?!

von Peter Z. (hangloose)


Lesenswert?

probier mal vor dem...
1
start(0xA4 + READ); //Adresse Nunchuck + 1
nochmal ein
1
start(0xA4 + WRITE); //Adresse Nunchuck + 0
das ist der einzige unterschied der mir jetzt zu meinem Code auffällt

von Mani (Gast)


Lesenswert?

Peter Z. schrieb:
> probier mal vor dem...start(0xA4 + READ); //Adresse Nunchuck + 1
> nochmal einstart(0xA4 + WRITE); //Adresse Nunchuck + 0
> das ist der einzige unterschied der mir jetzt zu meinem Code auffällt

Ja, dass war mir auch gleich aufgefallen...macht leider aber keinen 
unterschied, immer nur 0xFF als Antwort.
Hab das auch noch nie so gesehen dass man zuerst sagt: "ich möchte 
schreiben" und dann ohne jeden weiteren Parameter "ich möchte lesen".

Aber ein Versuch wars Wert, danke !

Peter Z. schrieb:
> Pull Up sind bei mir wenn ich mich grad recht erinnere 10K

Das heist Du hast die vom Nunchuk ausgelötet oder Du hast nochmal 
zusätzliche vor dem uC welche eingebaut?
Denke ja mal dass die Pullup-Widerstände vom Nunchuk relativ niederohmig 
gehalten werden um die Länge der Anschlussleitung besser zu 
kompensieren.
1m I2C ist ja auch eher ungewöhnlich :-D

Grüße Mani

von Mani (Gast)


Lesenswert?

Hm, mal ne andere Frage...müsste nach dem ersten senden der 0x40 nicht 
ein ACK vom Nunchuk kommen?

von Mani (Gast)


Lesenswert?

Werde jetzt demnächst mal Versuchen ob ich eine Wii finde an der ich den 
Nunchuk auf Funktion prüfen kann...nicht dass das Ding einfach nur 
kaputt ist.
Melde mich dann nochmal.

Grüße Mani

von M. G. (looking)


Lesenswert?

Ich hatte erst das gleiche Problem.
Es hat sich dann herausgestellt, dass bei meinem Nunchuk (Nachbau, kein 
original) die Kabelfarben nicht standardmäßig verwendet wurden. SDA und 
GND waren farblich gesehen vertauscht.

Anhand dieser Steckerbelegung kann man das nachprüfen:
http://www.cc-zwei.de/wiki/index.php/Wii-Nunchuk_Hintergrundwissen#Steckerbelegung

von BenTu (Gast)


Lesenswert?

ATMega16 / 3,3V / 16MHz alles drei zusammen passt nicht.

Grüße

von Mani (Gast)


Lesenswert?

M. G. schrieb:
> dass bei meinem Nunchuk (Nachbau, kein original) die Kabelfarben nicht 
>standardmäßig verwendet wurden

Danke für den Hinweis. Bei mir ist das nicht der Fall. Platine ist 
beschriftet. Bekomme ja auch ein ACK wenn ich versuche den Nunchuk über 
seine Adresse anzusprechen. Verändere ich die Adresse bekomme ich keine 
Quittung mehr...das heißt der Nunchuk antwortet prinzipiell, leider nur 
nicht mit den Daten.


BenTu schrieb:
> ATMega16 / 3,3V / 16MHz alles drei zusammen passt nicht.

Du hast natürlich Recht. Gelaufen ist er trotzdem. USART geht ja auch.
Fuses sind auf externen Quarz gesetzt. Habs trotzdem mit 5V und 
Pegelwandler probiert...leider das gleiche Ergebnis.


Leider hab ich bis jetzt noch niemand auftreiben können der eine Wii 
besitzt.
Kauft überhaupt irgendjemand so ein Teil :-D

Für weitere Anregungen bin ich offen...

Grüße

von Mani (Gast)


Lesenswert?

Also, es scheint wirklich am Nunchuk zu liegen.
Neuer Nunchuk und es tut.
Komisch dass der "Defekte" aber trotzdem noch ein ACK sendet aber keine 
Daten.

Wie auch immer...zurück an den Absender.

Grüße
Mani

von Sebastian M. (sebastian_m)


Lesenswert?


von Sebastian E (Gast)


Lesenswert?

Vorab: OK, es ist ein alter Fred.
Aber ich habe genau das gleiche Problem wie der Starter (und viele 
andere auch).
Beim googlen bin ich gefühlte 20x auf diese Seite gestoßen.
Und mit der Lösung "Neuer Nunchuk und es tut" wollte ich mich nicht 
zufrieden geben.

Ein Lösung für das Problem habe ich hier gefunden: 
http://www.musclera.com/wii-nunchuk-demonstration/

Es scheint bei manchen China Controllern nicht mit der "Standart 
Initialisierung" zu klappen (0xA4, 0x40, 0x00).

Auf der oben genannten Seite wird folgendes gesendet:
START, 0xA4, 0xF0, 0x55, STOP, START, 0xA4, 0xFB, 0x00, STOP

Der nachfolgende Teil ist wieder gleich, mit einer Ausnahme:
Mit der Init-Sequenz wird die Verschlüsselung ausgeschaltet.

Mit diesem Hinweis lief dann auch endlich mein China Controller.

Auch noch interessant: Bei meinem Chinateil liefert der Analog-Stick 
bereits auf der halben Stellung, also zwischen 0 und Max, den digitalen 
Wert für Vollauschlag zurück (0 oder 255). Die Grundstellung steht zudem 
auf '138' und nicht auf '128'.
Dies scheint auch "normal" zu sein bei den ganz billigen controllern.

Mehr zum vergleich zwischen Original und billig aus England:
http://www.britishideas.com/2011/08/29/not-all-wii-nunchuks-are-created-equal/

Noch zur Info: Betrieb an Mega88 (8Mhz, 3.3V), 100kHz I2C Clock und I2C 
Lib von Peter


Gruß
 Sebastian

PS.: Ausgewühlt hab ich den Thread nur um zukünftigen Suchenden eine 
mögliche Lösung zu zeigen.

von Chris (Gast)


Lesenswert?

Hi,

ich weiß das der Fred hier schon alt ist aber hatte erst auch das 
Problem das der Nunchuk nur mit 0xFF antwortet. Nach langem rumprobieren 
stellte ich fest ,dass der Nunchuk zwischen einer Busfreigabe und 
erneuten Busübernahme ne zeit von 300 us braucht sonst hängt er sich auf 
und antwortet immer nur mit 0xFF. Wollte das nur noch dazuschreiben als 
mögliche Lösung.

von Oliver J. (skriptkiddy)


Lesenswert?

Chris schrieb:
> Hi,
>
> ich weiß das der Fred hier schon alt ist aber hatte erst auch das
> Problem das der Nunchuk nur mit 0xFF antwortet. Nach langem rumprobieren
> stellte ich fest ,dass der Nunchuk zwischen einer Busfreigabe und
> erneuten Busübernahme ne zeit von 300 us braucht sonst hängt er sich auf
> und antwortet immer nur mit 0xFF. Wollte das nur noch dazuschreiben als
> mögliche Lösung.

Dieser Tip war für mich goldrichtig.

Grüße Oliver

von Randy S. (Gast)


Lesenswert?

Hallo Leute,
vielleicht weiß jemand etwas zu meinen Problemen (siehe: ABER):

Habe mir in der Bucht ein Nunchuk gekauft und am Pic angeschlossen.
Programmierung:
- i2c-Scanner meldet erfolgreich alle Slaves
- slave-Scanner ließt erfolgreich alle Register vom Slave A4 (Nunchuck)
- Pitch, Roll, Z & C-Tasten, Joysticks können ausgewertet werden...ok

ABER:
- Kalibrierdaten stimmen nicht wirklich.
- eine Entschlüsselung musste nicht durchgeführt werden.
- Wenn ich die Adresse 0x00 lese fehlt immer byte0 (Joy X)
  Die Werte konnte ich dank slave-Scanner aber vollständig unter
  Adresse 0x10 (und Anderen) finden

Mein größtes Problem:
- Ich habe 2 weitere Nunchuks, die vor vielen Jahren gekauft wurden. 
Alle 3 habe ich gestern an der Wii getestet. Die 2 älteren geben absolut 
keine Reaktion. Der i2c-Scanner findet nicht mal die Adresse...

Hat jemand eine Idee?

Vielleicht noch zur Info ... Nunckuk1 läuft bei mir mit & und Pullups, 
im FAST mode.

Vielen Dank schon mal : )

von Oliver J. (skriptkiddy)


Lesenswert?

Randy S. schrieb:
> Hat jemand eine Idee?

Ich glaube mich zu erinnern, dass der Nunchuck das I2C-Clockstreching 
nutzt. Da hatte ich mit meiner Bitbangning-Lösung die das nicht beachtet 
hat große Probleme.

Ich hab festgestellt, dass es mitunter nicht zum Erfolg führt, wenn man 
die Bytes im Nunchuck sequentiell ausließt. Habe dann für die 
Kalibrierdaten jedes Byte einzeln ausgelesen. Das funktioniert für 
3-Verschiedene Nunchucks (einer Original/ zwei Chinaclone).

Grüße Oliver

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

hier meine Lösung für das Auslesen von WII-Controller (derzeit Classic 
und Nunchuck): https://github.com/boerge42/wii_controller

Die Geschichte funktioniert (bei mir) relativ stabil.

Grüße Uwe

von Markus (Gast)


Lesenswert?

Darf ich fragen, wozu Ihr einen Wii Nunchuk benutzt ? Oder ist das 
einfach nur just for fun?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Markus schrieb:
> Darf ich fragen, wozu Ihr einen Wii Nunchuk benutzt ?
als Eingabegerät für eine entsprechende Mikrocontrolleranwendung...?! 
Ich habe z.B. damit rumexperimentiert, um ein Tetris-Spiel auf einem 
ATmega zu implementieren. Da ist ein solches (professionelles) 
Eingabegerät 1000x besser, als irgend eine Lösung mit selbst 
zusammengestellten Tastern, für die man auch noch ein Gehäuse bauen 
muss. ...und es ist so wunderschön einfach an die Daten der 
WII-Controller via I2C zu kommen...


> Oder ist das
> einfach nur just for fun?
Was ist bei einem Hobby nicht "just for fun" ;-)?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.