Forum: Mikrocontroller und Digitale Elektronik Vom WiiNunchuk lesen (Arduino)


von Florian R. (rager)


Lesenswert?

Hallo,
ich will mir einen acht beinigen Roboter bauen und diesen mit dem 
WiiNunchuk steuern.

manche von euch kennen vielleicht den Code zum WiiNunchuk lesen von 
Windmeadow:

http://www.windmeadow.com/node/42
1
#include <Wire.h>
2
#include <string.h>
3
4
#undef int
5
#include <stdio.h>
6
7
uint8_t outbuf[6];    // array to store arduino output
8
int cnt = 0;
9
int ledPin = 13;
10
11
void
12
setup ()
13
{
14
  beginSerial (19200);  //----------------------------------------<<< Das hier scheint falsch zu sein
15
  Serial.print ("Finished setup\n");
16
  Wire.begin ();    // join i2c bus with address 0x52
17
  nunchuck_init (); // send the initilization handshake
18
}
19
20
void
21
nunchuck_init ()
22
{
23
  Wire.beginTransmission (0x52);  // transmit to device 0x52
24
  Wire.send (0x40);    // sends memory address
25
  Wire.send (0x00);    // sends sent a zero.  
26
  Wire.endTransmission ();  // stop transmitting
27
}
28
29
void
30
send_zero ()
31
{
32
  Wire.beginTransmission (0x52);  // transmit to device 0x52
33
  Wire.send (0x00);    // sends one byte
34
  Wire.endTransmission ();  // stop transmitting
35
}
36
37
void
38
loop ()
39
{
40
  Wire.requestFrom (0x52, 6);  // request data from nunchuck
41
  while (Wire.available ())
42
    {
43
      outbuf[cnt] = nunchuk_decode_byte (Wire.receive ());  // receive byte as an integer
44
      digitalWrite (ledPin, HIGH);  // sets the LED on
45
      cnt++;
46
    }
47
48
  // If we recieved the 6 bytes, then go print them
49
  if (cnt >= 5)
50
    {
51
      print ();
52
    }
53
54
  cnt = 0;
55
  send_zero (); // send the request for next bytes
56
  delay (100);
57
}
58
59
// Print the input data we have recieved
60
// accel data is 10 bits long
61
// so we read 8 bits, then we have to add
62
// on the last 2 bits.  That is why I
63
// multiply them by 2 * 2
64
void
65
print ()
66
{
67
  int joy_x_axis = outbuf[0];
68
  int joy_y_axis = outbuf[1];
69
  int accel_x_axis = outbuf[2] * 2 * 2;
70
  int accel_y_axis = outbuf[3] * 2 * 2;
71
  int accel_z_axis = outbuf[4] * 2 * 2;
72
73
  int z_button = 0;
74
  int c_button = 0;
75
76
 // byte outbuf[5] contains bits for z and c buttons
77
 // it also contains the least significant bits for the accelerometer data
78
 // so we have to check each bit of byte outbuf[5]
79
  if ((outbuf[5] >> 0) & 1)
80
    {
81
      z_button = 1;
82
    }
83
  if ((outbuf[5] >> 1) & 1)
84
    {
85
      c_button = 1;
86
    }
87
88
  if ((outbuf[5] >> 2) & 1)
89
    {
90
      accel_x_axis += 2;
91
    }
92
  if ((outbuf[5] >> 3) & 1)
93
    {
94
      accel_x_axis += 1;
95
    }
96
97
  if ((outbuf[5] >> 4) & 1)
98
    {
99
      accel_y_axis += 2;
100
    }
101
  if ((outbuf[5] >> 5) & 1)
102
    {
103
      accel_y_axis += 1;
104
    }
105
106
  if ((outbuf[5] >> 6) & 1)
107
    {
108
      accel_z_axis += 2;
109
    }
110
  if ((outbuf[5] >> 7) & 1)
111
    {
112
      accel_z_axis += 1;
113
    }
114
115
  Serial.print (joy_x_axis, DEC);
116
  Serial.print ("\t");
117
118
  Serial.print (joy_y_axis, DEC);
119
  Serial.print ("\t");
120
121
  Serial.print (accel_x_axis, DEC);
122
  Serial.print ("\t");
123
124
  Serial.print (accel_y_axis, DEC);
125
  Serial.print ("\t");
126
127
  Serial.print (accel_z_axis, DEC);
128
  Serial.print ("\t");
129
130
  Serial.print (z_button, DEC);
131
  Serial.print ("\t");
132
133
  Serial.print (c_button, DEC);
134
  Serial.print ("\t");
135
136
  Serial.print ("\r\n");
137
}
138
139
// Encode data to format that most wiimote drivers except
140
// only needed if you use one of the regular wiimote drivers
141
char
142
nunchuk_decode_byte (char x)
143
{
144
  x = (x ^ 0x17) + 0x17;
145
  return x;
146
}




Ich habe ihn versucht (und viele andere Versionen, welche in den 
Kommentaren modifiziert wurden) und nix funktioniert...
Die Arduino Software zeigt immer den fehlercode:

o: In function `setup':
C:\Users\Florian\AppData\Local\Temp\build5836836406551647758.tmp/sketch_ 
mar29a.c
pp:46: undefined reference to `beginSerial'

Ich habe "beginSerial in Serial.begin geändert.
Der Fehler ist weg, aaaaaber es funktioniert immernoch nichts.
Nur der "finished setup" taucht in der konsole auf, sonst nichts.

Der "finished setup" kommt auch nur wenn der nunchuk nicht mit dem 
Arduino verbunden ist.
Ich benutze 5V und zwei 1.5K(ich habe auch 1.65K versucht) von SDK und 
SCK nach 5V.


Ich habe ein wenig an der "tiwi.h" rumprobiert.
In arduino 18 ist kein "tiwi.o." zum löschen oder?


Hat jemand eine idee um mir zu helfen?

Sonst bin ich verloren.....

Florian

von gtf (Gast)


Lesenswert?

Kenne mich mit C zwar gar nicht aus, aber ich kann dir nur empfehlen 
einen IIC- Sniffer wie den von PeterD. nachzubauen.  Somit kannst dann 
auch sehen was dein µController am Bus treibt.

    Bei mir klappt es mit der folgender IIC- Sequenz bestens:
1)Start|0xA4(SLA+W)|0x40|0x00|Stop     - Nuchuck init
2)Delay(approx 20ms)
3)Start|0xA4(SLA+W)|0x00|Stop     – Nunchuck pointer set
4)Delay(approx 20ms)
5)Start|0xA5(SLA+R)|6xByte|Stop         - Nunchuck parameter request
6)Go to 2)

von Nullahn (Gast)


Lesenswert?

Evtl.   Serial.begin

von Florian R. (rager)


Lesenswert?

Ich versteh leider selbst nicht zu viel von C ( aber immernoch mehr als 
adere Sprachen)

@gtf
haha ich habe leider keine ahnung was du mir sagen wollstet. ;)

@Nullahn
wie geschrieben habe ich das schon geändert.
was mich wundert ist, dass viele Leute die den Code zu ihren gunsten 
modelliert haben, beginSerial so gelassen haben.
Kennt jemand den befehl beginSerial?

von gtf (Gast)


Lesenswert?

Florian Roesner schrieb:
> @gtf
> haha ich habe leider keine ahnung was du mir sagen wollstet. ;)

Hmm. Schade.
Ich habe momentan zwei Nunchucks am AVR hängen.
Als hobby Bastler hab ich so 3 Wochen inklusive XMEGA Einarbeitung 
gebraucht.

Hier mal paar recht nützliche Grundlagen:
http://www.cc-zwei.de/wiki/index.php/Wii-Nunchuk_Hintergrundwissen
http://wiibrew.org/wiki/Wiimote

Wie weit bist du mim Bot? Gibt’s Bilder?
Ich finde den RISE von BostonDynamics recht interessant.
http://www.youtube.com/watch?v=2hIhZ-QCWIg

gruß gtf

von Florian R. (rager)


Lesenswert?

Hey danke :)
Leider bin ich nicht gut genug um mir selbst was draus zu machen. Das 
hab ich jetzt gemerkt... ich werd das wohl verschieben müssen, wenn mir 
keiner einen Code schreibt (wo ich nicht von ausgehen kann)

Aber der Roboter wird trotzdem cool!!
Wird acht Beine haben, mit jeweils 4DOF. Er soll sehr sehr 
spinnenähnlich werden. Nur wird er sich von Solarenergie ernähren und 
auch selbständig diese beschaffen. Schaltkreise hab ich schon erstellt. 
muss nurnoch schau'n ob dabei auch alles klappt wie es soll.

Die Spinne wird wohl insgesamt 41x Atmega328's besitzen welche alle 
untereinander mit I²C komunizieren können.

Ich wollt zusätzlich dann machen das die Spinne dann auch über ein 
Kabelloses Nunchuk gesteuert werden kann. (eines meiner Probleme)

Das größte Problem ist aber vorallem der Preis von 32 Servos welcher 
echt s****ß hoch ist. ( ein weiteres großes Problem :P )

Wenn Bilder kommen werd ich diese gerne zeigen :)



LG,
Florian

von gtf (Gast)


Lesenswert?

>Leider bin ich nicht gut genug um mir selbst was draus zu machen. Das
>hab ich jetzt gemerkt... ich werd das wohl verschieben müssen, wenn mir
>keiner einen Code schreibt (wo ich nicht von ausgehen kann)

Es ist sehr wichtig die Programmierung von µControllern zwischen gut und 
besser als gut zu beherrschen. Ein HEXABOT ist ein ziemlich 
wissenshungriges Projekt.

Ich bin seit knapp 3 Jahren nebenberuflich am erlernen von Elektronik 
Grundlagen :- ). Davon knapp 1-Jahr aktiv im AVR µController Bereich. 
Erst jetzt traue ich’s mir zu mit RP5 anzufangen.

Es nützt dir nichts, wenn jemand für dich die Software erstellt, da 
musst du selber durch.
Einen guten BOT auf die Beine zu bringen, erfordert viel Erfahrung.
Spätesten beim Programmieren des Bewegungsablaufs wirst du feststellen, 
dass ein Nunchuck verhältnismäßig Kinderkram ist.

Was ist oder sind 4DOF ?

>Nur wird er sich von Solarenergie ernähren...

Solarzelle und 32 Servos,  kann recht knapp werden, ist keine so gute 
Idee. Außer du zapfst die Solarzellen von Dach eines Nachbarn an:- ) 
Spaß beiseite.
Nimm lieber einen LiPo mit reichlich Kapazität.
Mal angenommen die 32 Servo sind zeitgleich aktiv. Bei einem nicht 
einmal so unrealistischen Stromverbrauch von 500mA kommst du auf knapp 
16Ampere.
Dazu kommen noch deine 41 AVR’s und wahrscheinlich weitere Bauelemente 
wie Funk. Ich würde an deiner Stelle die Solarzellen weglassen.

Wozu brauchst du 41 AVR’s ?
Denk mal an die PCB kosten!

Ich schätze mal für Servosignale. Es gibt hier Codebeispiele, die es 
ermöglichen bis zu 20 Servokäle in Software mit einem mega8 zu 
generieren. Oder du holst dir einen fertigen Controller von Roboternetz. 
Die eleganteste Lösung wird wohl ein XMEGA A1 sein, mit dem könntest du 
bis zu 24 Servokäle in Hardware betreiben.

>Das größte Problem ist aber vorallem der Preis von 32 Servos welcher
>echt s****ß hoch ist. ( ein weiteres großes Problem :P )

Die Servos kosten in der tat richtig Asche. Wenn ich da an die Servos 
von Hitec denke omg.
Quali ist zwar Top, aber knapp 100€ Stückpreis ist echt heavy für einen 
Hobbyisten.

Schau dich mal bei Roboternetz und Youtube um. Da kannst du dir so 
einige Inspirationen holen.

gruß gtf

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.