PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wii Motion Plus mit Arduino auslesen



freesmile@bluewin.ch
13.01.2012, 15:46
Hallo zusammen

Bin neu hier und muss als erstes euer Forum loben!!! Echt TOP!!!

Ich versuche grade krampfhaft an mein Arduino Werte aus dem Wii Motion Plus heraus zu bringen.

Dazu suchte ich einen Code der nur den Winkel ausgibt. Da ich noch keine Erfahrungen mit I2C habe, versuche ich so es langsam zu verstehen.

Dabei fand ich folgenden Code:

#include <SoftwareSerial.h>
#include <Wire.h>

byte data[6];
int gier; //Daten vom AD-Wandler
int roll;
int nick;

void setup()
{
Serial.begin(9600);
Wire.begin(); //WiiMo ein
Wire.beginTransmission(0x53); //WiiMo starten und Adresse 0x53 deaktivieren
Wire.send(0xFE); //0x04 zur Addresse 0xFE senden zur Aktivierung
Wire.send(0x04);
Wire.endTransmission(); //WiiMo jetzt Addresse 0x52 aktiv
delay(30);
}

void loop()
{
//roll, nick und gier einlesen
Wire.beginTransmission(0x52); //Null senden
Wire.send(0x00);
Wire.endTransmission();

Wire.requestFrom(0x52,6); //6 Bytes lesen
for (int i=0;i<6;i++)
{
data[i]=Wire.receive();
}

//zusammensetzen
gier = ((data[3] / 4)<<8) + data[0];
roll = ((data[4] / 4)<<8) + data[1];
nick = ((data[5] / 4)<<8) + data[2];

//ausgeben
Serial.print(roll);
Serial.print(" ");
Serial.print(nick);
Serial.print(" ");
Serial.print(gier);
Serial.println();
delay(10);
}



Dabei kam aber immer einen Fehler raus, sodass ich den Code gar nicht auf Arduino laden konnte


Dieser sah folgenermassen aus:


/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=100 -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/variants/eightanaloginputs -I/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial -I/Applications/Arduino.app/Contents/Resources/Java/libraries/Wire /var/folders/vn/5hwp46ws6qsgpzwkxxvwrrd40000gn/T/build1082119935771231009.tmp/sketch_jan13c.cpp -o/var/folders/vn/5hwp46ws6qsgpzwkxxvwrrd40000gn/T/build1082119935771231009.tmp/sketch_jan13c.cpp.o
sketch_jan13c.cpp: In function 'void setup()':
sketch_jan13c:26: error: 'class TwoWire' has no member named 'send'

As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for consistency with other libraries.

sketch_jan13c:28: error: 'class TwoWire' has no member named 'send'

As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for consistency with other libraries.

sketch_jan13c.cpp: In function 'void loop()':
sketch_jan13c:46: error: 'class TwoWire' has no member named 'send'

As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for consistency with other libraries.

sketch_jan13c:58: error: 'class TwoWire' has no member named 'receive'

As of Arduino 1.0, the Wire.receive() function was renamed to Wire.read() for consistency with other libraries.



Ich komme nicht weiter :(

hab mir jetzt schon ein Buch bestellt das mir weiterhelfen soll. Jedoch dauert das noch ne weile... Habe jedoch im Moment Ferien und würde gerne bei meinem Projekt weiter kommen.

Kann mir jemand helfen???

Besten Dank
gruss freesmile


P.S. ich hoffe ich habe es am richtigen Ort gepostet

m.a.r.v.i.n
13.01.2012, 15:58
Hallo,
dein Post ist zwar im falschen Forum gelandet, antworte dir aber trotzdem.

Du verwendest die neue Arduino Version 1.0. Dort haben sich einige Befehle und Funktionen geändert. Deshalb funktionieren viele alte Sketche nicht.

Wire.send heisst jetzt Wire.write
Wire.receive heisst jetzt Wire.read

Das steht alles auch schon so in den Fehlermeldungen drin.

Grüße

freesmile@bluewin.ch
13.01.2012, 16:29
Besten Dank für die Info, suche demnächst mal ne Lieste mit allen Änderungen zur Version 1.0

Habe nun alle Befehle geändert, jedoch kommt nochmal ein Fehler :/

Der korrigierte Sketche:

#include <SoftwareSerial.h>

#include <Wire.h>



byte data[6];

int gier; //Daten vom AD-Wandler

int roll;

int nick;



void setup()

{

Serial.begin(9600);

Wire.begin(); //WiiMo ein

Wire.beginTransmission(0x53); //WiiMo starten und Adresse 0x53 deaktivieren

Wire.write(0xFE); //0x04 zur Addresse 0xFE senden zur Aktivierung

Wire.write(0x04);

Wire.endTransmission(); //WiiMo jetzt Addresse 0x52 aktiv

delay(30);

}



void loop()

{

//roll, nick und gier einlesen

Wire.beginTransmission(0x52); //Null senden

Wire.write(0x00);

Wire.endTransmission();



Wire.requestFrom(0x52,6); //6 Bytes lesen

for (int i=0;i<6;i++)

{

data[i]=Wire.read();

}



//zusammensetzen

gier = ((data[3] / 4)<<8) + data[0];

roll = ((data[4] / 4)<<8) + data[1];

nick = ((data[5] / 4)<<8) + data[2];



//ausgeben

Serial.print(roll);

Serial.print(" ");

Serial.print(nick);

Serial.print(" ");

Serial.print(gier);

Serial.println();

delay(10);

}


Die Fehlermeldung:

/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=100 -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino -I/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/variants/eightanaloginputs -I/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial -I/Applications/Arduino.app/Contents/Resources/Java/libraries/Wire /var/folders/vn/5hwp46ws6qsgpzwkxxvwrrd40000gn/T/build1082119935771231009.tmp/sketch_jan13c.cpp -o/var/folders/vn/5hwp46ws6qsgpzwkxxvwrrd40000gn/T/build1082119935771231009.tmp/sketch_jan13c.cpp.o
sketch_jan13c.cpp: In function 'void loop()':
sketch_jan13c:46: error: call of overloaded 'write(int)' is ambiguous
/Applications/Arduino.app/Contents/Resources/Java/libraries/Wire/Wire.h:55: note: candidates are: virtual size_t TwoWire::write(uint8_t)
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:49: note: size_t Print::write(const char*)



Ich hoffe wenn ich das Buch bekommen habe, werde ich etwas konstruktievere Beiträge erfassen. Bitte um entschuldigung...

grüssse freesmile

m.a.r.v.i.n
14.01.2012, 13:44
Hallo,

du solltest dir angewöhnen, Code Beispiele in die entsprechenden Code tags (# symbol im Visu Editor) zu setzen. Das macht das Ganze besser lesbar.
Hier mal dein Beispiel, das sich fehlerfrei unter Arduino 1.0 übersetzen läßt.


#include <inttypes.h>
#include <SoftwareSerial.h>
#include <Wire.h>

byte data[6];
int gier; //Daten vom AD-Wandler
int roll;
int nick;

void setup()
{
Serial.begin(9600);
Wire.begin(); //WiiMo ein
Wire.beginTransmission(0x53); //WiiMo starten und Adresse 0x53 deaktivieren
Wire.write(0xFE); //0x04 zur Addresse 0xFE senden zur Aktivierung
Wire.write(0x04);
Wire.endTransmission(); //WiiMo jetzt Addresse 0x52 aktiv
delay(30);
}

void loop()
{
//roll, nick und gier einlesen
Wire.beginTransmission(0x52); //Null senden
Wire.write((byte)0x00);
Wire.endTransmission();

Wire.requestFrom(0x52,6); //6 Bytes lesen
for (int i=0;i<6;i++)
{
data[i]=Wire.read();
}

//zusammensetzen
gier = ((data[3] / 4)<< + data[0]);
roll = ((data[4] / 4)<< + data[1]);
nick = ((data[5] / 4)<< + data[2]);

//ausgeben
Serial.print(roll);
Serial.print(" ");
Serial.print(nick);
Serial.print(" ");
Serial.print(gier);
Serial.println();
delay(10);
}

Der Fehler lag in der Zeile

Wire.write(0x00);


weis der Kuckuck warum der Compiler gerade hier über die 0x00 stolpert, weil er meint das sei ein integer Wert.