Mnogi su ovu igračku imali u djetinjstvu, upravljali smo je s dva okretna gumba. Već tada je bilo moguće na njega spojiti dva istosmjerna motora s zupčanicima i upravljati njima pomoću gumba. A sada je za to postalo moguće prilagoditi upravljačke palice. Što je autor Instructables pod nadimkom millerman4487.
Sve komponente
domaći stavio na list kartona:
Ali dva identična dijela morala su biti ispisana - to su adapteri za spajanje zupčanika na ručke Magic Screena. Izgleda kao bilo koji od adaptera:
I tako se spaja na prijenosnik (možda će ovo zahtijevati malo zagrijavanje adaptera sušilom za kosu):
STL datoteka.
Dijagram električnog kruga prikazan je dolje:
Na njemu se nalazi samo jedna nerazumljiva komponenta - L293D čip. Sadrži dva takozvana H-mostova, od kojih svaki može preokrenuti motor spojen na njega. Ispod ploče prikazano je koje zaključke
Težak Spojite koji je iglica priključka Wii Nunchuck upravljačke palice. Skica ispod može se prepisati za rad s bilo kojom drugom vrstom džojstika, u sadašnjem obliku će biti potrebna.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # definiraj Wire.write (x) Wire.send (x)
// # definiraj Wire.read () Wire.receive ()
#endif
statički uint8_t nunchuck_buf [6]; // niz za pohranu podataka o nunchucku,
// Koristi igle za priključak C (analogni in) kao snagu i tlo za Nunchuck
statički void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
kašnjenje (100); // čekati da se stvari stabiliziraju
}
// inicijalizirati I2C sustav, pridružiti se I2C magistrali,
// i reci nunchucku s kojim razgovaramo
static void nunchuck_init () {
Wire.begin (); // pridruži se i2c busu kao masteru
Wire.beginTransmission (0x52); // prenijeti na uređaj 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // šalje memorijsku adresu
Wire.write ((uint8_t) 0x00); // šalje poslano nulu.
#else
Wire.send ((uint8_t) 0x40); // šalje memorijsku adresu
Wire.send ((uint8_t) 0x00); // šalje poslano nulu.
#endif
Wire.endTransmission (); // zaustaviti prijenos
}
// Pošaljite nunchuck zahtjev za podacima
// bio je "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // prenijeti na uređaj 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // šalje jedan bajt
#else
Wire.send ((uint8_t) 0x00); // šalje jedan bajt
#endif
Wire.endTransmission (); // zaustaviti prijenos
}
// Kodirajte podatke da bi se oblikovao najveći oblik pokretača osim wiimotea
// potreban je samo ako koristite jednog od redovnih upravljačkih programa za wiimote
statički char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
vratiti x;
}
// primanje podataka natrag od nunchucka,
// vraća 1 na uspješno čitanje. vraća 0 na neuspjeh
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // zatražite podatke iz nunchucka
dok (Wire.available ()) {
// primiti bajt kao cijeli broj
#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 (); // poslati zahtjev za naredni teret podataka
// Ako smo primili 6 bajtova, idite ih ispisati
ako je (cnt>> 5) {
povratak 1; // uspjeh
}
vratiti 0; // neuspjeh
}
// Ispis ulaznih podataka koje smo dobili
// podaci accel dugački su 10 bita
// pa čitamo 8 bita, a zatim moramo dodati
// na zadnja 2 bita. Zato i ja
// pomnoži ih sa 2 * 2
static void nunchuck_print_data () {
statički 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] sadrži bite za gumbe z i c
// sadrži i najmanje značajne bite za podatke akcelerometra
// tako da moramo provjeriti svaki zalogaj bajta [5]
ako ((nunchuck_buf [5] & gt; 0) i 1)
z_button = 1;
ako ((nunchuck_buf [5] & gt; 1) & 1)
c_button = 1;
ako ((nunchuck_buf [5] & gt; 2) i 1)
accel_x_axis + = 1;
ako ((nunchuck_buf [5] & gt; 3) i 1)
accel_x_axis + = 2;
ako ((nunchuck_buf [5] & gt; 4) i 1)
accel_y_axis + = 1;
ako ((nunchuck_buf [5] & gt; 5) i 1)
accel_y_axis + = 2;
ako ((nunchuck_buf [5] & gt; 6) i 1)
accel_z_axis + = 1;
ako ((nunchuck_buf [5] & gt; 7) i 1)
accel_z_axis + = 2;
Serijski otisak (i, DEC);
Serijski.print ("\ t");
Serijski.print ("radost:");
Serijski.print (joy_x_axis, DEC);
Serijski.print (",");
Serijski.print (joy_y_axis, DEC);
Serijski.print ("\ t");
Serial.print ("acc:");
Serijski.print (accel_x_axis, DEC);
Serijski.print (",");
Serijski.print (accel_y_axis, DEC);
Serijski.print (",");
Serijski.print (accel_z_axis, DEC);
Serijski.print ("\ t");
Serial.print ("ali:");
Serijski ispis (z_button, DEC);
Serijski.print (",");
Serijski ispis (c_button, DEC);
Serijski.print ("\ r \ n"); // novi redak
i ++;
}
// vraća stanje zbutton: 1 = pritisnut, 0 = nije pritisnut
static int nunchuck_zbutton () {
povratak ((nunchuck_buf [5] & gt; 0) & 1)? 0: 1; // vudu
}
// vraća stanje zbutton: 1 = pritisnut, 0 = nije pritisnut
static int nunchuck_cbutton () {
povratak ((nunchuck_buf [5] & gt; 1) & 1)? 0: 1; // vudu
}
// vraća vrijednost upravljačke palice x-osi
statički int nunchuck_joyx () {
return nunchuck_buf [0];
}
// vraća vrijednost upravljačke palice y-osi
static int nunchuck_joyy () {
return nunchuck_buf [1];
}
// vraća vrijednost akcelerometra x osi
static int nunchuck_accelx () {
return nunchuck_buf [2]; // FIXME: ovo izostavlja 2 bita podataka
}
// vraća vrijednost y-osi akcelerometra
static int nunchuck_accely () {
return nunchuck_buf [3]; // FIXME: ovo izostavlja 2 bita podataka
}
// vraća vrijednost akcelerometra z osi z
static int nunchuck_accelz () {
vratiti nunchuck_buf [4]; // FIXME: ovo izostavlja 2 bita podataka
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Radost:");
Serijski.print (karta (joyx, 15, 221, 0, 255));
Serijski.print ("\ tY Radost:");
Serijski.println (karta (veselje, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
poništavanje postave () {
Serijski počet (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // poslati inicijacijski stisak
Serial.println ("Wii Nunchuck Ready");
pinMode (3, IZLAZ);
pinMode (5, IZLAZ);
pinMode (6, IZLAZ);
pinMode (9, IZLAZ);
// upisati ();
}
void petlja () {
ako (loop_cnt> 10) {// svakih 100 msec dobije nove podatke
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
ako je (zbut == 1) {
tip ();
zbut = 0;
}
drugo {
ako (joyx & gt; (joyx1 + 20)) {
int speed1 = karta (joyx - joyx1, 0, 80, 40, 255);
brzina1 = ograničenje (brzina1, 0, 255);
analogWrite (6, 0);
analogWrite (9, brzina1);
}
drugo ako (joyx
Nakon uključivanja, pravilno sastavljen uređaj počinje s radom odmah. Nunchuck je analogna upravljačka palica, tako da možete kontrolirati ne samo smjer, već i brzinu kretanja. Arduino preuzima kontrolu brzine PWM-a. Ako se kretanje po bilo kojoj osi odvija u suprotnom smjeru, odgovarajući motor mora se preokrenuti. Ako postavite pokazivač otprilike na sredinu zaslona i pritisnete gumb Z, možete učiniti da uređaj automatski napiše riječ HI.