Заголовок сообщения: Использование джойстика от приставки Wii nunchuck.
Добавлено: 18 мар 2011, 11:31
Зарегистрирован: 03 янв 2011, 20:51 Сообщения: 27
Разобрался с подключением нунчак(джойстика) от приставки Wii В общем подключив его имеем пульт управления с 3х осевым акселерометром, 2х осевой миниджойстик, 2х кнопки. Для наглядности:
Подключаем нунчак по протоколу I2C, к SDA SCL
Питание в идеале надо 3,3в, но как показали многочисленные форумы, работает и от 5в, от самой Ардуины. В некоторых схемах используют питание и землю с аналоговых выходов самой Ардуины.
// read the extension type from the register block Wire.beginTransmission(0x52); Wire.send(0xFA); // extension type register Wire.endTransmission(); Wire.beginTransmission(0x52); Wire.requestFrom(0x52, 6); // request data from controller for (cnt = 0; cnt < 6; cnt++) { if (Wire.available()) { ctrlr_type[cnt] = Wire.receive(); // Should be 0x0000 A420 0101 for Classic Controller, 0x0000 A420 0000 for nunchuck } } Wire.endTransmission(); delay(1);
Кодов с использованием нунчак полно, главное не забываем менять строку инициализации.
Вот один из примеров.
Код:
//======================================== /* * 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 <Wire.h>
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"); }
// read the extension type from the register block Wire.beginTransmission(0x52); Wire.send(0xFA); // extension type register Wire.endTransmission(); Wire.beginTransmission(0x52); Wire.requestFrom(0x52, 6); // request data from controller for (cnt = 0; cnt < 6; cnt++) { if (Wire.available()) { ctrlr_type[cnt] = Wire.receive(); // Should be 0x0000 A420 0101 for Classic Controller, 0x0000 A420 0000 for nunchuck } } Wire.endTransmission(); delay(1);
// 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;
// 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; } //========================================
frwind, оформите код тэгом [code] - невозможно такие портянки читать
_________________ Проект [[Open Robotics]] - универсальные модули для построения роботов Модули Open Robotics можно приобрести в магазине shop.roboforum.ru Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!
И в этой же папке создаем файл с именем nunchuck_funcs_m.h в него записываем вот это
Код:
//=======nunchuck_funcs_m.h================== /* * Nunchuck functions -- Talk to a Wii Nunchuck * * This library is from the Bionic Arduino course : * http://todbot.com/blog/bionicarduino/ * * 2007 Tod E. Kurt, http://todbot.com/blog/ * * The Wii Nunchuck reading code originally from Windmeadow Labs * http://www.windmeadow.com/node/42 ** ** fixed Mark, for china low cost Wii Nunchuk */
#include <WProgram.h>
static uint8_t nunchuck_buf[6]; // array to store nunchuck data,
// initialize the I2C system, join the I2C bus, // and tell the nunchuck we're talking to it static void nunchuck_init() {
// read the extension type from the register block Wire.beginTransmission(0x52); Wire.send(0xFA); // extension type register Wire.endTransmission(); Wire.beginTransmission(0x52); Wire.requestFrom(0x52, 6); // request data from controller for (cnt21 = 0; cnt21 < 6; cnt21++) { if (Wire.available()) { ctrlr_type[cnt21] = Wire.receive(); // Should be 0x0000 A420 0101 for Classic Controller, 0x0000 A420 0000 for nunchuck } } Wire.endTransmission(); delay(1);
// Send a request for data to the nunchuck // was "send_zero()" static void nunchuck_send_request() { Wire.beginTransmission(0x52);// transmit to device 0x52 Wire.send(0x00);// sends one byte Wire.endTransmission();// stop transmitting }
// Encode data to format that most wiimote drivers except // only needed if you use one of the regular wiimote drivers static char nunchuk_decode_byte (char x) { x = (x ^ 0x17) + 0x17; return x; }
// Receive data back from the nunchuck, // returns 1 on successful read. returns 0 on failure static 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 }
// returns value of x-axis joystick static int nunchuck_joyx() { return nunchuck_buf[0]; }
// returns value of y-axis joystick static int nunchuck_joyy() { return nunchuck_buf[1]; }
// returns value of x-axis accelerometer static int nunchuck_accelx() { return nunchuck_buf[2]; // FIXME: this leaves out 2-bits of the data }
// returns value of y-axis accelerometer static int nunchuck_accely() { return nunchuck_buf[3]; // FIXME: this leaves out 2-bits of the data }
// returns value of z-axis accelerometer static int nunchuck_accelz() { return nunchuck_buf[4]; // FIXME: this leaves out 2-bits of the data } //========================================
Strijar, отправили по запарке наверно, бывает. но лучше брать у тех, у кого страна (пока ещё?) не в исключениях. хлопот меньше. этот на данный момент самый недорогой при штучном заказе http://cgi.ebay.com/New-nunchuk-nunchuck-controller-remote-Nintendo-Wii-/280644087525?pt=Video_Games_Accessories&hash=item4157b0eee5 (поиск по "Wii nunchuck" с включённым "Buy It Now" и сортировкой "Price + Shipping: lowest first") П.С. еще есть "wii wireless nunchuck", значительно дороже (редко за 7..10, обычно 10..20), но штука крайне приятная. дешевле можно, но в основном это если торговаться на аукционе.
Заголовок сообщения: Re: Использование джойстика от приставки Wii nunchuck.
Добавлено: 01 апр 2011, 09:32
скрытый хозяин вселенной :)
Зарегистрирован: 18 сен 2006, 12:26 Сообщения: 18018 Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич
на молотке проводной за 250р. беспроводной за 500р.
_________________ <telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode> Всё уже придумано до нас!
на молотке большинство нунчак с ибея, только быстрей приедет и немного дороже. оригинальные стоят в разы дороже. и под видом оригиналов многие торгуют именно аналогами.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения