/* * NunchuckPrint * * 2007 Tod E. Kurt, http://todbot.com/blog/ * * Код для считывания Wii-Нунчака взят из Windmeadow Labs * http://www.windmeadow.com/node/42 */ #include void setup() { Serial.begin(19200); nunchuck_init(); // инициализация соединения Serial.print ("Finished setup\n"); } void loop() { nunchuck_get_data(); nunchuck_print_data(); delay(100); } // // Функции Нунчака // static uint8_t nunchuck_buf[6]; // массив для хранения данных нунчака, // запустить систему I2C, подсоединиться к шине I2C, // и сообщить нунчаку, что мы с ним разговариваем void nunchuck_init() { Wire.begin(); // подключиться к i2c как ведущий Wire.beginTransmission(0x52); // передать на устройство 0x52 Wire.send(0x40); // передать адрес в памяти Wire.send(0x00); // передать нуль Wire.endTransmission(); // остановить передачу } // Посылает нунчаку запрос о данных // было "send_zero()" void nunchuck_send_request() { Wire.beginTransmission(0x52); // передать на устройство 0x52 Wire.send(0x00); // передать один байт Wire.endTransmission(); // остановить передачу } // Получить данные от нунчака, int nunchuck_get_data() { int cnt=0; Wire.requestFrom (0x52, 6); // запросить данные у нунчака while (Wire.available ()) { // получить байт как целое число nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive()); cnt++; } nunchuck_send_request(); // послать запрос о следующей // порции данных // Если мы получили 6 байтов, тогда напечатаем их if (cnt >= 5) { return 1; // успех } return 0; //неудача } // 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; // байт nunchuck_buf[5] содержит биты для кнопок z и c // также содержит младшие биты для с данными акселерометра // так что посмотрим каждый бит байта 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"); // новая срока i++; } // Перекодировать данные в формат, который принимают // большинство драйверов wiimote. Нужно только, если // используете один из стандартных драйверов wiimote char nunchuk_decode_byte (char x) { x = (x ^ 0x17) + 0x17; return x; }