Last active
March 23, 2018 01:02
-
-
Save ansarid/919ca0fa712e0dc79a3eefaf51dba7d0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Wire.h> | |
static uint8_t nunchuck_buf[6]; // array to store nunchuck data, | |
void setup(){ | |
Serial.begin(115200); | |
nunchuck_setpowerpins(); // use analog pins 2&3 as fake gnd & pwr | |
nunchuck_init(); // send the initilization handshake | |
} | |
void loop(){ | |
nunchuck_get_data(); | |
// map nunchuk data to a servo data point | |
int x_axis = map(nunchuck_buf[0], 23, 222, 180, 0); | |
int y_axis = map(nunchuck_buf[1], 32, 231, 0, 180); | |
nunchuck_print_data(); | |
} | |
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.write(0x40); // sends memory address | |
Wire.write(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.write(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.read()); | |
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 z_button = 1; | |
int c_button = 1; | |
// 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 = 0; | |
if ((nunchuck_buf[5] >> 1) & 1) | |
c_button = 0; | |
Serial.print("joy:"); | |
Serial.print(joy_x_axis, DEC); | |
Serial.print(","); | |
Serial.print(joy_y_axis, DEC); | |
Serial.print(" \t"); | |
Serial.print("c:"); | |
Serial.print(c_button, DEC); | |
Serial.print(" \t"); | |
Serial.print("z:"); | |
Serial.print(z_button, DEC); | |
Serial.print("\r\n"); | |
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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment