Мнозина имаха тази играчка в детството; ние я контролирахме с две въртящи се копчета. Още тогава беше възможно да се прикачат към него два постоянни мотора със зъбни колела и да се управляват от бутоните. И сега за това стана възможно адаптирането на джойстиците. Което прави авторът на Instructables под псевдонима millerman4487.
Всички компоненти
домашно той постави върху лист картон:
Но трябваше да бъдат отпечатани две еднакви части - това са адаптери за свързване на предавки към дръжките на Magic Screen. Изглежда като всеки от адаптерите:
И така се свързва към скоростната кутия (може би това ще изисква леко затопляне на адаптера със сешоар):
STL файл.
Електрическата схема е показана по-долу:
В него има само един неразбираем компонент - чипът L293D. Той съдържа два така наречени Н-моста, всеки от които може да обърне свързания към него мотор. Под дъската е показано кои изводи
Arduino Свържете кой от щифтовете на конектора на джойстика на Wii Nunchuck. Скицата по-долу може да бъде пренаписана, за да работи с всякакви други видове джойстици, в сегашния й вид ще се изисква.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # определи Wire.write (x) Wire.send (x)
// # определи Wire.read () Wire.receive ()
# endif
статичен uint8_t nunchuck_buf [6]; // масив за съхранение на nunchuck данни,
// Използва порта C (аналогов в) щифтове като захранване и заземяване за Nunchuck
статичен void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
забавяне (100); // изчакайте да се стабилизират нещата
}
// инициализирайте I2C системата, присъединете се към шината I2C,
// и кажи на nunchuck, че говорим с него
static void nunchuck_init () {
Wire.begin (); // присъединете се към i2c bus като master
Wire.beginTransmission (0x52); // предаване на устройство 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // изпраща адрес за памет
Wire.write ((uint8_t) 0x00); // изпраща изпратени нула.
#else
Wire.send ((uint8_t) 0x40); // изпраща адрес за памет
Wire.send ((uint8_t) 0x00); // изпраща изпратени нула.
# endif
Wire.endTransmission (); // спиране на предаването
}
// Изпратете заявка за данни до нунчака
// беше „send_zero ()“
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // предаване на устройство 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // изпраща един байт
#else
Wire.send ((uint8_t) 0x00); // изпраща един байт
# endif
Wire.endTransmission (); // спиране на предаването
}
// Кодирайте данни, за да форматирате повечето драйвери на wiimote, освен
// нужен е само ако използвате един от обикновените драйвери на wiimote
stat char char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
връщане x;
}
// Получаване на данни от нунчука,
// връща 1 при успешно прочетено. връща 0 при неуспех
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // искане на данни от nunchuck
докато (Wire.available ()) {
// получаване на байт като цяло число
#if (ARDUINO & gt; = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.receive ());
# endif
cnt ++;
}
nunchuck_send_request (); // изпрати заявка за следващия полезен товар
// Ако получихме 6-те байта, след това отидете да ги отпечатаме
ако (cnt>> = 5) {
връщане 1; // успех
}
връщане 0; // провал
}
// Отпечатваме получените входни данни
// данните за ускорение са дълги 10 бита
// така четем 8 бита, след което трябва да добавим
// за последните 2 бита. Ето защо аз
// умножете ги по 2 * 2
static void nunchuck_print_data () {
статичен 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]
ако ((nunchuck_buf [5] & gt; 0) & 1)
z_button = 1;
ако ((nunchuck_buf [5] & gt; 1) & 1)
c_button = 1;
ако ((nunchuck_buf [5] & gt; 2) & 1)
accel_x_axis + = 1;
ако ((nunchuck_buf [5] & gt; 3) & 1)
accel_x_axis + = 2;
ако ((nunchuck_buf [5] & gt; 4) & 1)
accel_y_axis + = 1;
ако ((nunchuck_buf [5] & gt; 5) & 1)
accel_y_axis + = 2;
ако ((nunchuck_buf [5] & gt; 6) & 1)
accel_z_axis + = 1;
ако ((nunchuck_buf [5] & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("радост:");
Сериен.принт (joy_x_axis, DEC);
Serial.print (",");
Сериен.принт (joy_y_axis, DEC);
Serial.print ("\ t");
Serial.print ("acc:");
Сериен.принт (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 ("но:");
Serial.print (z_button, DEC);
Serial.print (",");
Сериен печат (c_button, DEC);
Serial.print ("\ r \ n"); // нов ред
i ++;
}
// връща състояние на zbutton: 1 = натиснато, 0 = не се натиска
static int nunchuck_zbutton () {
връщане ((nunchuck_buf [5] & gt; 0) & 1)? 0: 1; // вуду
}
// връща състояние на zbutton: 1 = натиснато, 0 = не се натиска
static int nunchuck_cbutton () {
връщане ((nunchuck_buf [5] & gt; 1) & 1)? 0: 1; // вуду
}
// връща стойността на x-джойстика
static int nunchuck_joyx () {
връщане nunchuck_buf [0];
}
// връща стойността на джойстика на оста y
static int nunchuck_joyy () {
връщане nunchuck_buf [1];
}
// връща стойността на x-ос акселерометър
static int nunchuck_accelx () {
връщане nunchuck_buf [2]; // FIXME: това изключва 2 бита на данните
}
// връща стойността на ускорител на ос y
static int nunchuck_accely () {
връщане nunchuck_buf [3]; // FIXME: това изключва 2 бита на данните
}
// връща стойността на z-ос акселерометър
static int nunchuck_accelz () {
връщане nunchuck_buf [4]; // FIXME: това изключва 2 бита на данните
}
int loop_cnt = 0;
байт joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (карта (джойкс, 15, 221, 0, 255));
Serial.print ("\ tY радост:");
Serial.println (карта (радост, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
настройка за невалидност () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // изпрати ръкостискане за инициализация
Serial.println ("Wii Nunchuck Ready");
pinMode (3, изход);
pinMode (5, изход);
pinMode (6, изход);
pinMode (9, изход);
// type ();
}
void loop () {
ако (loop_cnt & gt; 10) {// на всеки 100 секунди получават нови данни
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
ако (zbut == 1) {
тип ();
zbut = 0;
}
друго {
ако (joyx & gt; (joyx1 + 20)) {
int speed1 = карта (joyx - joyx1, 0, 80, 40, 255);
скорост1 = ограничение (скорост1, 0, 255);
analogWrite (6, 0);
analogWrite (9, скорост1);
}
иначе ако (joyx
След включване правилно сглобеното устройство започва да работи веднага. Nunchuck е аналогов джойстик, така че можете да контролирате не само посоката, но и скоростта на движение. Arduino поема контрола на скоростта на PWM. Ако движението по някоя от осите се случи в обратна посока, съответният двигател трябва да се обърне. Поставяйки курсора приблизително в средата на екрана и натискайки бутона Z, можете да накарате устройството да напише автоматично думата HI.