Molti hanno avuto questo giocattolo durante l'infanzia; l'abbiamo controllato con due manopole rotanti. Anche allora, era possibile collegare due motori DC con ingranaggi e controllarli dai pulsanti. E ora per questo è diventato possibile adattare i joystick. Questo è ciò che l'autore di Instructables ha fatto con il soprannome millerman4487.
Ma dovevano essere stampate due parti identiche: si tratta di adattatori per il collegamento di ingranaggi alle maniglie di Magic Screen. Sembra uno degli adattatori:
E così si collega al cambio (forse questo richiederà un leggero riscaldamento dell'adattatore con un asciugacapelli):
File STL.
C'è solo un componente incomprensibile su di esso: il chip L293D. Contiene due cosiddetti ponti H, ognuno dei quali può invertire il motore ad esso collegato. Sotto il tabellone viene mostrato quali conclusioni
Collega quale dei pin del connettore del joystick Wii Nunchuck. Lo schizzo seguente può essere riscritto per funzionare con qualsiasi altro tipo di joystick, nella sua forma attuale sarà richiesto.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
static uint8_t nunchuck_buf [6]; // array per archiviare dati nunchuck,
// Utilizza pin della porta C (ingresso analogico) come alimentazione e terra per Nunchuck
vuoto statico nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
ritardo (100); // aspetta che le cose si stabilizzino
}
// inizializza il sistema I2C, unisciti al bus I2C,
// e dì al nunchuck che stiamo parlando
void statico nunchuck_init () {
Wire.begin (); // entra nel bus i2c come master
Wire.beginTransmission (0x52); // trasmette al dispositivo 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // invia l'indirizzo di memoria
Wire.write ((uint8_t) 0x00); // invia inviato uno zero.
#else
Wire.send ((uint8_t) 0x40); // invia l'indirizzo di memoria
Wire.send ((uint8_t) 0x00); // invia inviato uno zero.
#endif
Wire.endTransmission (); // interrompe la trasmissione
}
// Invia una richiesta di dati al nunchuck
// era "send_zero ()"
vuoto statico nunchuck_send_request () {
Wire.beginTransmission (0x52); // trasmette al dispositivo 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // invia un byte
#else
Wire.send ((uint8_t) 0x00); // invia un byte
#endif
Wire.endTransmission (); // interrompe la trasmissione
}
// Codifica i dati per formattare la maggior parte dei driver Wiimote tranne
// necessario solo se si utilizza uno dei normali driver Wiimote
carattere statico nunchuk_decode_byte (carattere x) {
x = (x ^ 0x17) + 0x17;
ritorna x;
}
// Ricevi i dati dal nunchuck,
// restituisce 1 in caso di lettura corretta. restituisce 0 in caso di errore
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // richiedi dati da nunchuck
while (Wire.available ()) {
// riceve byte come intero
#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 (); // invia la richiesta per il prossimo payload di dati
// Se abbiamo ricevuto i 6 byte, vai a stamparli
if (cnt & gt; = 5) {
ritorno 1; // successo
}
ritorna 0; // fallimento
}
// Stampa i dati di input che abbiamo ricevuto
// i dati accel sono lunghi 10 bit
// quindi leggiamo 8 bit, quindi dobbiamo aggiungere
// sugli ultimi 2 bit. Questo è il motivo per cui io
// moltiplicali per 2 * 2
vuoto statico 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] contiene bit per i pulsanti z e c
// contiene anche i bit meno significativi per i dati dell'accelerometro
// quindi dobbiamo controllare ogni bit di byte outbuf [5]
if ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_button = 1;
if ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_button = 1;
if ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
if ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
if ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("gioia:");
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 ("but:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // newline
i ++;
}
// restituisce lo stato zbutton: 1 = premuto, 0 = non premuto
static int nunchuck_zbutton () {
return ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0: 1; // voodoo
}
// restituisce lo stato zbutton: 1 = premuto, 0 = non premuto
static int nunchuck_cbutton () {
return ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0: 1; // voodoo
}
// restituisce il valore del joystick dell'asse x
static int nunchuck_joyx () {
return nunchuck_buf [0];
}
// restituisce il valore del joystick sull'asse y
static int nunchuck_joyy () {
return nunchuck_buf [1];
}
// restituisce il valore dell'accelerometro dell'asse x
static int nunchuck_accelx () {
return nunchuck_buf [2]; // FIXME: questo esclude 2 bit dei dati
}
// restituisce il valore dell'accelerometro dell'asse y
static int nunchuck_accely () {
return nunchuck_buf [3]; // FIXME: questo esclude 2 bit dei dati
}
// restituisce il valore dell'accelerometro dell'asse z
static int nunchuck_accelz () {
return nunchuck_buf [4]; // FIXME: questo esclude 2 bit dei dati
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (mappa (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (mappa (gioiosa, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
void setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // invia l'handshake di inizializzazione
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}
void loop () {
if (loop_cnt & gt; 10) {// ogni 100 msec ottiene nuovi dati
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) {
type ();
zbut = 0;
}
altro {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = mappa (joyx - joyx1, 0, 80, 40, 255);
speed1 = vincolo (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, speed1);
}
else if (joyx & lt; (joyx1 - 20)) {
int speed2 = mappa (joyx1 - joyx, 0, 90, 40, 255);
speed2 = vincolo (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
altro {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = mappa (joyy - joyy1, 0, 80, 40, 255);
speed3 = vincolo (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
else if (joyy & lt; (joyy1 - 20)) {
int speed4 = map (joyy1 - joyy, 0, 90, 40, 255);
speed4 = vincolo (speed4, 0, 255);
analogWrite (3, speed4);
analogWrite (5, 0);
}
altro {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
ritardo (1);
}
void type () {
int rltime = 200;
// digitalWrite (6, 1); // origin
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// ritardo (1000);
// H ===============
// digitalWrite (3, 0); // wait
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// ritardo (250);
// digitalWrite (3, 0); // su
digitalWrite (5, 1);
ritardo (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (3, 1); // giù
// digitalWrite (5, 0);
ritardo (250);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
// digitalWrite (6, 0); // destra
digitalWrite (9, 1);
ritardo (rltime);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
// digitalWrite (3, 0); // su
digitalWrite (5, 1);
ritardo (250);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (3, 1); // giù
// digitalWrite (5, 0);
ritardo (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
// digitalWrite (6, 0); // destra
digitalWrite (9, 1);
ritardo (rltime);
// I ==========================
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (3, 0); // su
digitalWrite (5, 1);
ritardo (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (6, 0); // destra
digitalWrite (9, 1);
ritardo (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (6, 1); // left
digitalWrite (9, 0);
ritardo (rltime);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (6, 0); // destra
digitalWrite (9, 1);
ritardo (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (3, 1); // giù
digitalWrite (5, 0);
ritardo (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (6, 0); // destra
digitalWrite (9, 1);
ritardo (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
digitalWrite (6, 1); // left
digitalWrite (9, 0);
ritardo (rltime);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ritardo (250);
}
Dopo l'accensione, un dispositivo correttamente assemblato inizia a funzionare immediatamente. Nunchuck è un joystick analogico, quindi puoi controllare non solo la direzione, ma anche la velocità di movimento. Arduino assume il controllo della velocità PWM. Se il movimento lungo uno qualsiasi degli assi avviene nella direzione opposta, il motore corrispondente deve essere invertito. Posizionando il cursore approssimativamente al centro dello schermo e premendo il pulsante Z, è possibile fare in modo che il dispositivo scriva automaticamente la parola HI.