Pages: [1]   Go Down
Author Topic: Wii Nunchuck - Sensordaten werden im Serial Monito  (Read 1298 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

habe folgenden Anleitung Zum Anschluss des Wii-Nunchuck Kontrollers genommen und von dort auch den folgenden Code bezogen:

___________________________________________________________________________________
/*
* NunchuckPrint
*
* 2007 Tod E. Kurt, http://todbot.com/blog/
*
* The Wii Nunchuck reading code is taken from Windmeadow Labs
* http://www.windmeadow.com/node/42
*/

#include

void setup()
{
Serial.begin(19200);
nunchuck_setpowerpins(); // use analog pins 2&3 as fake gnd & pwr
nunchuck_init(); // send the initilization handshake
Serial.print ("Finished setup\n");
}

void loop()
{
nunchuck_get_data();
nunchuck_print_data();
delay(100);
}

//
// Nunchuck functions
//

static uint8_t nunchuck_buf[6]; // array to store nunchuck data,

// Uses port C (analog in) pins as power & ground for Nunchuck
static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
}

// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it
void nunchuck_init()
{
Wire.begin(); // join i2c bus as master
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x40); // sends memory address
Wire.send(0x00); // sends sent a zero.
Wire.endTransmission(); // stop transmitting
}

// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x00); // sends one byte
Wire.endTransmission(); // stop transmitting
}

// Receive data back from the nunchuck,
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ()) {
// receive byte as an integer
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
cnt++;
}
nunchuck_send_request(); // send request for next data payload
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
return 1; // success
}
return 0; //failure
}

// 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 nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;

int z_button = 0;
int c_button = 0;

// byte nunchuck_buf[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 ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;
if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;

if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;
if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;
if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;

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

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

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

Serial.print("acc:");
Serial.print(accel_x_axis, DEC);
Serial.print(",");
Serial.print(accel_y_axis, DEC);
Serial.print(",");
Serial.print(accel_z_axis, DEC);
Serial.print("\t");

Serial.print("but:");
Serial.print(z_button, DEC);
Serial.print(",");
Serial.print(c_button, DEC);

Serial.print("\r\n"); // newline
i++;
}

// 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;
}

______________________________________________________________________________________

Wenn ich Im Arduino Programm nun den "Serial Monitor" öffne, kann ich die Bewegungen des Joystics und auch die Bewegungen des Beschleunigungssensors erkennen... Hier folgende Bilder:

neutralstellung:


Joystick nach links:
http://www.supercue.de/daten/wii_nunchuck/joy_links.jpg

joystick nach rechts:




Jetzt zum Problem: Wie bekomme ich diese Werte in Pure Data rein?
Hier nochmal die Grafik, wie der Wii Nunchuck Controller am Arduino hängt:
wii nunchuck

Also es werden alle Werte über 2 analoge inputs eingelesen... X&Y - Joystickachsen und X, Y & Z Achse des Beschleunigungssensors... Es handelt sich ja nun nicht mehr um "normal" digitalisierte werte, die man mit PDuino einlesen kann...

Hat wer einen Rat?

Logged

CH
Offline Offline
God Member
*****
Karma: 19
Posts: 703
Book Writer "Arduino Praxiseinstieg"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Also es werden alle Werte über 2 analoge inputs eingelesen.
Die Kommunikation mit dem Nunchuk erfolgt über den I2C-Bus. Standardmässig werden dabei auf dem Arduino die Analogport A4 und A5 verwendet.
« Last Edit: June 03, 2010, 06:35:30 am by webmeister » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das Problem ist jetzt nur: Was ist dass für ein Format? Im Seriel Monitor der Arduino-Software kommen ja die Werte an (wie auf den Bilden zu erkennen)...

Aber wenn ich die Werte mit PDUINO in Pure Data empfangen will, da kriege ich nichts rein...
Logged

CH
Offline Offline
God Member
*****
Karma: 19
Posts: 703
Book Writer "Arduino Praxiseinstieg"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist kein definiertes Format. Das Beispiel schreibt die Daten in lesbarer Form auf die serielle Schnittstelle. Auf diese Weise kann man im seriellen Monitor überprüfen ob sich bei der Bewegung des Nunchuk oder bei der Nutzung der Buttons oder Joystick die entsprechenden Werte verändern.

Ich würde zuerst nur einen Wert ausgeben, beispielsweise eine Achse vom Joystick, und diesen dann versuchen mit Pure Data einzulesen.
Logged

Pages: [1]   Go Up
Jump to: