www.mikrocontroller.net

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


Autor: Florian Roesner (rager)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <Wire.h>
#include <string.h>

#undef int
#include <stdio.h>

uint8_t outbuf[6];    // array to store arduino output
int cnt = 0;
int ledPin = 13;

void
setup ()
{
  beginSerial (19200);  //----------------------------------------<<< Das hier scheint falsch zu sein
  Serial.print ("Finished setup\n");
  Wire.begin ();    // join i2c bus with address 0x52
  nunchuck_init (); // send the initilization handshake
}

void
nunchuck_init ()
{
  Wire.beginTransmission (0x52);  // transmit to device 0x52
  Wire.send (0x40);    // sends memory address
  Wire.send (0x00);    // sends sent a zero.  
  Wire.endTransmission ();  // stop transmitting
}

void
send_zero ()
{
  Wire.beginTransmission (0x52);  // transmit to device 0x52
  Wire.send (0x00);    // sends one byte
  Wire.endTransmission ();  // stop transmitting
}

void
loop ()
{
  Wire.requestFrom (0x52, 6);  // request data from nunchuck
  while (Wire.available ())
    {
      outbuf[cnt] = nunchuk_decode_byte (Wire.receive ());  // receive byte as an integer
      digitalWrite (ledPin, HIGH);  // sets the LED on
      cnt++;
    }

  // If we recieved the 6 bytes, then go print them
  if (cnt >= 5)
    {
      print ();
    }

  cnt = 0;
  send_zero (); // send the request for next bytes
  delay (100);
}

// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits.  That is why I
// multiply them by 2 * 2
void
print ()
{
  int joy_x_axis = outbuf[0];
  int joy_y_axis = outbuf[1];
  int accel_x_axis = outbuf[2] * 2 * 2;
  int accel_y_axis = outbuf[3] * 2 * 2;
  int accel_z_axis = outbuf[4] * 2 * 2;

  int z_button = 0;
  int c_button = 0;

 // byte outbuf[5] contains bits for z and c buttons
 // it also contains the least significant bits for the accelerometer data
 // so we have to check each bit of byte outbuf[5]
  if ((outbuf[5] >> 0) & 1)
    {
      z_button = 1;
    }
  if ((outbuf[5] >> 1) & 1)
    {
      c_button = 1;
    }

  if ((outbuf[5] >> 2) & 1)
    {
      accel_x_axis += 2;
    }
  if ((outbuf[5] >> 3) & 1)
    {
      accel_x_axis += 1;
    }

  if ((outbuf[5] >> 4) & 1)
    {
      accel_y_axis += 2;
    }
  if ((outbuf[5] >> 5) & 1)
    {
      accel_y_axis += 1;
    }

  if ((outbuf[5] >> 6) & 1)
    {
      accel_z_axis += 2;
    }
  if ((outbuf[5] >> 7) & 1)
    {
      accel_z_axis += 1;
    }

  Serial.print (joy_x_axis, DEC);
  Serial.print ("\t");

  Serial.print (joy_y_axis, DEC);
  Serial.print ("\t");

  Serial.print (accel_x_axis, DEC);
  Serial.print ("\t");

  Serial.print (accel_y_axis, DEC);
  Serial.print ("\t");

  Serial.print (accel_z_axis, DEC);
  Serial.print ("\t");

  Serial.print (z_button, DEC);
  Serial.print ("\t");

  Serial.print (c_button, DEC);
  Serial.print ("\t");

  Serial.print ("\r\n");
}

// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char
nunchuk_decode_byte (char x)
{
  x = (x ^ 0x17) + 0x17;
  return x;
}
 




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

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Nullahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl.   Serial.begin

Autor: Florian Roesner (rager)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_H...
http://wiibrew.org/wiki/Wiimote

Wie weit bist du mim Bot? Gibt’s Bilder?
Ich finde den RISE von BostonDynamics recht interessant.
Youtube-Video "RiSE"

gruß gtf

Autor: Florian Roesner (rager)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.