This example is for Wiring version 1.0 build 0100+. If you have a previous version, use the examples included with your software. If you see any errors or have comments, please let us know.
Reading the Nintendo nunchuck
This example demonstrates how to read a Nintendo nunchuck.
This example demonstrates how to read a Nintendo nunchuck.
#include <Wire.h> uint8_t outbuf[6]; // array to store wiring output int cnt = 0; int ledPin = 13; void setup() { Serial.begin(115200); 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.write(0x40); // sends memory address Wire.write((byte)0x00); // sends sent a zero. Wire.endTransmission(); // stop transmitting } void send_zero() { Wire.beginTransmission(0x52); // transmit to device 0x52 Wire.write((byte)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.read()); // 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 "); Serial.print(joy_x_axis, DEC); Serial.print(" "); Serial.print("joy_y "); Serial.print(joy_y_axis, DEC); Serial.print("\r\n"); Serial.print("accel_x "); Serial.print(accel_x_axis, DEC); Serial.print(" "); Serial.print("accel_y "); Serial.print(accel_y_axis, DEC); Serial.print(" "); Serial.print("accel_z "); Serial.print(accel_z_axis, DEC); Serial.print("\r\n"); Serial.print("z_button "); Serial.print(z_button, DEC); Serial.print(" "); Serial.print("c_button "); Serial.print(c_button, DEC); Serial.print("\r\n"); delay(1000); } // 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; }