Mnozí měli tuto hračku v dětství, ovládali jsme ji pomocí dvou otočných knoflíků. I tehdy bylo možné k němu připojit dva stejnosměrné motory s převody a ovládat je pomocí tlačítek. A nyní je možné přizpůsobit joysticky. Což je to, co udělal autor Instructables pod přezdívkou millerman4487.
Musely však být vytištěny dvě stejné části - jedná se o adaptéry pro připojení ozubených kol k úchytům Magic Screen. Vypadá to jako kterýkoli z adaptérů:
A tak se připojuje k převodovce (možná to bude vyžadovat mírné zahřátí adaptéru fénem):
STL soubor.
Je na něm pouze jedna nepochopitelná součást - čip L293D. Obsahuje dva takzvané H-můstky, z nichž každý může reverzovat připojený motor. Pod tabulí je uvedeno, jaké závěry
Připojte který z kolíků konektoru joysticku Wii Nunchuck. Náčrt níže lze přepsat tak, aby pracoval s jakýmkoli jiným typem joysticků, v jeho aktuální podobě bude vyžadován.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
statický uint8_t nunchuck_buf [6]; // pole pro ukládání dat nunchucku,
// Používá piny C (analogové vstupy) jako napájení a zem pro Nunchuck
static void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
zpoždění (100); // počkejte, až se věci stabilizují
}
// inicializovat systém I2C, připojit se ke sběrnici I2C,
// a řekni nunchucku, že s ním mluvíme
static void nunchuck_init () {
Wire.begin (); // připojte se ke sběrnici i2c jako master
Wire.beginTransmission (0x52); // přenos do zařízení 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // odešle adresu paměti
Wire.write ((uint8_t) 0x00); // odešle odesláno nulu.
#else
Wire.send ((uint8_t) 0x40); // odešle adresu paměti
Wire.send ((uint8_t) 0x00); // odešle odesláno nulu.
#endif
Wire.endTransmission (); // zastavení přenosu
}
// Zašlete požadavek na data do nunchucku
// bylo "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // přenos do zařízení 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // odešle jeden bajt
#else
Wire.send ((uint8_t) 0x00); // odešle jeden bajt
#endif
Wire.endTransmission (); // zastavení přenosu
}
// Zakódujte data do formátu, který většina ovladačů wiimote kromě
// je potřeba, pouze pokud používáte jeden z běžných ovladačů wiimote
static char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
návrat x;
}
// Příjem dat zpět z nunchucku,
// vrátí 1 při úspěšném čtení. vrátí 0 při selhání
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // žádost o data od nunchuck
while (Wire.available ()) {
// přijímat bajt jako celé číslo
#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 (); // poslat žádost o další datové užitečné zatížení
// Pokud jsme obdrželi 6 bajtů, pak je vytiskněte
if (cnt> 5) {
návrat 1; // úspěch
}
návrat 0; // selhání
}
// Vytiskněte vstupní data, která jsme obdrželi
// accel data jsou 10 bitů dlouhá
// takže jsme si přečetli 8 bitů, pak musíme přidat
// na posledních 2 bitech. Proto jsem já
// vynásobte je 2 * 2
static void nunchuck_print_data () {
statické 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] obsahuje bity pro tlačítka zac
// obsahuje také nejméně významné bity pro data z akcelerometru
// takže musíme zkontrolovat každý bit 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 + = 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 ++;
}
// vrací stav zbuttonu: 1 = stisknuto, 0 = nestlačeno
static int nunchuck_zbutton () {
návrat ((nunchuck_buf [5]>> 0) & 1)? 0-1 // voodoo
}
// vrací stav zbuttonu: 1 = stisknuto, 0 = nestlačeno
static int nunchuck_cbutton () {
návrat ((nunchuck_buf [5]> 1) & 1)? 0-1 // voodoo
}
// vrací hodnotu joysticku na ose x
static int nunchuck_joyx () {
návrat nunchuck_buf [0];
}
// vrací hodnotu joysticku na ose y
static int nunchuck_joyy () {
návrat nunchuck_buf [1];
}
// vrací hodnotu akcelerometru na ose x
static int nunchuck_accelx () {
návrat nunchuck_buf [2]; // FIXME: toto vynechá 2-bitová data
}
// vrací hodnotu akcelerometru na ose y
static int nunchuck_accely () {
návrat nunchuck_buf [3]; // FIXME: toto vynechá 2-bitová data
}
// vrací hodnotu akcelerometru na ose z
static int nunchuck_accelz () {
návrat nunchuck_buf [4]; // FIXME: toto vynechá 2-bitová data
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (mapa (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (mapa (radost, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
neplatné nastavení () {
Serial.egegin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // pošlete 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 () {
if (loop_cnt> 10) {// každých 100 ms získává nová data
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;
}
jinde {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = mapa (joyx - joyx1, 0, 80, 40, 255);
speed1 = omezení (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, speed1);
}
jinak if (joyx <(joyx1 - 20)) {
int speed2 = mapa (joyx1 - joyx, 0, 90, 40, 255);
speed2 = omezení (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
jinde {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = mapa (joyy - joyy1, 0, 80, 40, 255);
speed3 = omezení (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
jinak pokud (joyy <
Po zapnutí začne správně sestavené zařízení pracovat okamžitě. Nunchuck je analogový joystick, takže můžete ovládat nejen směr, ale také rychlost pohybu. Arduino převezme řízení rychlosti PWM. Dojde-li k pohybu po kterékoli z os v opačném směru, musí být odpovídající motor obrácen. Umístěním kurzoru přibližně do středu obrazovky a stisknutím tlačítka Z můžete zařízení automaticky zapsat slovo HI.