Mnohí mali túto hračku v detstve, kontrolovali sme ju dvoma otočnými gombíkmi. Aj potom bolo možné pripojiť dva jednosmerné motory s prevodmi a ovládať ich pomocou tlačidiel. A teraz je možné prispôsobiť joysticky. Čo urobil autor Instructables pod prezývkou millerman4487.
Museli sa však vytlačiť dve rovnaké časti - jedná sa o adaptéry na pripojenie ozubených kolies k úchytkám Magic Screen. Vyzerá to ako ktorýkoľvek z adaptérov:
A tak sa pripája k prevodovke (pravdepodobne to bude vyžadovať mierne zahriatie adaptéra s fénom):
STL súbor.
Je na ňom iba jeden nepochopiteľný komponent - čip L293D. Obsahuje dva takzvané H-mostíky, z ktorých každý môže reverzovať pripojený motor. Pod doskou je znázornené, ktoré závery
Pripojte, ktorý z kolíkov konektora joysticku Wii Nunchuck. Náčrt uvedený nižšie môže byť prepísaný tak, aby pracoval s akýmkoľvek iným typom joystickov, v jeho aktuálnej podobe bude potrebný.
#include
#if (ARDUINO> = 100)
#include
#else
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
statický uint8_t nunchuck_buf [6]; // pole na ukladanie údajov nunchucku,
// Používa port C (analógové) kolíky ako napájanie a zem pre Nunchuck
static void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
oneskorenie (100); // počkajte, kým sa veci stabilizujú
}
// inicializovať systém I2C, pripojiť sa k zbernici I2C,
// a povedz nunchuckovi, že s ním hovoríme
static void nunchuck_init () {
Wire.begin (); // pripojte sa k zbernici i2c ako Master
Wire.beginTransmission (0x52); // prenos do zariadenia 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x40); // odošle adresu pamäte
Wire.write ((uint8_t) 0x00); // pošle odoslanú nulu.
#else
Wire.send ((uint8_t) 0x40); // odošle adresu pamäte
Wire.send ((uint8_t) 0x00); // posiela nulu.
#endif
Wire.endTransmission (); // zastavenie prenosu
}
// Pošlite požiadavku na údaje na nunchuck
// bol "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // prenos do zariadenia 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x00); // odošle jeden bajt
#else
Wire.send ((uint8_t) 0x00); // odošle jeden bajt
#endif
Wire.endTransmission (); // zastavenie prenosu
}
// Zakódujte údaje do formátu, ktorý najviac ovládače wiimote okrem
// potrebné iba ak používate jeden z bežných ovládačov wiimote
static char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
návrat x;
}
// Príjem dát späť z nunchucku,
// vráti 1 pri úspešnom prečítaní. vráti 0 pri poruche
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // údaje o požiadavkách od nunchuck
while (Wire.available ()) {
// prijíma bajt ako celé číslo
#if (ARDUINO> = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.receive ());
#endif
cnt ++;
}
nunchuck_send_request (); // poslať požiadavku na ďalšie užitočné dáta
// Ak sme dostali 6 bajtov, vytlačte ich
ak (cnt> 5) {
návrat 1; // úspech
}
návrat 0; // zlyhanie
}
// Vytlačte vstupné údaje, ktoré sme dostali
// accel dáta sú 10 bitov dlhé
// takže čítame 8 bitov, potom musíme pridať
// na posledných 2 bitoch. Preto ja
// vynásobte ich 2 * 2
static void nunchuck_print_data () {
statická hodnota 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] obsahuje bity pre tlačidlá zac
// obsahuje tiež najmenej významné bity pre údaje z akcelerometra
// takže musíme skontrolovať každý kúsok bytov [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 + = 1;
if ((nunchuck_buf [5]> 3) & 1)
accel_x_axis + = 2;
if ((nunchuck_buf [5]> 4) & 1)
accel_y_axis + = 1;
if ((nunchuck_buf [5]> 5) & 1)
accel_y_axis + = 2;
if ((nunchuck_buf [5]> 6) & 1)
accel_z_axis + = 1;
if ((nunchuck_buf [5]>> 7) & 1)
accel_z_axis + = 2;
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 ("ale:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // newline
i ++;
}
// vráti stav zbutton: 1 = stlačený, 0 = nestlačený
static int nunchuck_zbutton () {
return ((nunchuck_buf [5]>> 0) & 1)? 0: 1; // voodoo
}
// vráti stav zbutton: 1 = stlačený, 0 = nestlačený
static int nunchuck_cbutton () {
return ((nunchuck_buf [5]>> 1) & 1)? 0: 1; // voodoo
}
// vráti hodnotu joysticku na osi x
static int nunchuck_joyx () {
return nunchuck_buf [0];
}
// vráti hodnotu joysticku na osi y
static int nunchuck_joyy () {
return nunchuck_buf [1];
}
// vráti hodnotu akcelerometra na osi x
static int nunchuck_accelx () {
return nunchuck_buf [2]; // FIXME: toto vynechá 2-bitové údaje
}
// vráti hodnotu akcelerometra na osi y
static int nunchuck_accely () {
return nunchuck_buf [3]; // FIXME: toto vynechá 2-bitové údaje
}
// vráti hodnotu akcelerometra na osi z
static int nunchuck_accelz () {
return nunchuck_buf [4]; // FIXME: toto vynechá 2-bitové údaje
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Sériová tlač (mapa (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (mapa (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
neplatné nastavenie () {
Serial.egegin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // pošlite inicializačný handshake
Serial.println („Wii Nunchuck Ready“);
pinMode (3, VÝSTUP);
pinMode (5, VÝSTUP);
pinMode (6, VÝSTUP);
pinMode (9, VÝSTUP);
// type ();
}
void loop () {
ak (loop_cnt> 10) {// každých 100 ms získa nové údaje
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
if (zbut == 1) {
typ ();
zbut = 0;
}
else {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = mapa (joyx - joyx1, 0, 80, 40, 255);
speed1 = constrain (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, speed1);
}
inak ak (joyx <(joyx1 - 20)) {
int speed2 = mapa (joyx1 - joyx, 0, 90, 40, 255);
speed2 = constrain (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
else {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20))) {
int speed3 = mapa (radosť - radosť1, 0, 80, 40, 255);
speed3 = constrain (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
inak ak (joyy <
Po zapnutí začne správne zostavené zariadenie pracovať okamžite. Nunchuck je analógový joystick, takže môžete ovládať nielen smer, ale aj rýchlosť pohybu. Arduino preberá riadenie rýchlosti PWM. Ak dôjde k pohybu v ktorejkoľvek z osí opačným smerom, musí sa zodpovedajúci motor obrátiť. Umiestnením kurzora približne do stredu obrazovky a stlačením tlačidla Z môžete zariadeniu automaticky napísať slovo HI.