Muitos tiveram esse brinquedo na infância, nós o controlamos com dois botões rotativos. Mesmo assim, era possível conectar dois motores DC com engrenagens e controlá-los a partir dos botões. E agora, para isso, tornou-se possível adaptar os joysticks. Foi o que o autor de Instructables fez com o apelido millerman4487.
Mas duas peças idênticas tiveram que ser impressas - são adaptadores para conectar as engrenagens às alças do Magic Screen. Parece com qualquer um dos adaptadores:
E, portanto, ele se conecta à caixa de velocidades (talvez isso exija um pouco de aquecimento do adaptador com um secador de cabelo):
Arquivo STL.
Existe apenas um componente incompreensível - o chip L293D. Ele contém duas chamadas pontes H, cada uma das quais pode reverter o motor conectado a ela. Abaixo do quadro, são mostradas as conclusões 
 Ligue qual dos pinos do conector do joystick do Wii Nunchuck. O esboço abaixo pode ser reescrito para funcionar com qualquer outro tipo de joysticks, na sua forma atual será necessário.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
estático uint8_t nunchuck_buf [6]; // array para armazenar dados nunchuck,
// Usa pinos da porta C (entrada analógica) como fonte de alimentação e terra para o Nunchuck
estático nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
 DDRC | = _BV (pwrpin) | _BV (gndpin);
 PORTC & = ~ _BV (gndpin);
 PORTC | = _BV (pwrpin);
 atraso (100); // aguarde que as coisas se estabilizem
}
// inicialize o sistema I2C, entre no barramento I2C,
// e diga ao nunchuck que estamos falando com ele
static void nunchuck_init () {
 Wire.begin (); // ingressa no barramento i2c como mestre
 Wire.beginTransmission (0x52); // transmite para o dispositivo 0x52
#if (ARDUINO & gt; = 100)
 Wire.write ((uint8_t) 0x40); // envia endereço de memória
 Wire.write ((uint8_t) 0x00); // envia enviado um zero.
#else
 Wire.send ((uint8_t) 0x40); // envia o endereço de memória
 Wire.send ((uint8_t) 0x00); // envia enviado um zero.
#endif
 Wire.endTransmission (); // para de transmitir
}
// Envia uma solicitação de dados para o nunchuck
// era "send_zero ()"
static void nunchuck_send_request () {
 Wire.beginTransmission (0x52); // transmite para o dispositivo 0x52
#if (ARDUINO & gt; = 100)
 Wire.write ((uint8_t) 0x00); // envia um byte
#else
 Wire.send ((uint8_t) 0x00); // envia um byte
#endif
 Wire.endTransmission (); // para de transmitir
}
// Codifica dados para formatar a maioria dos drivers wiimote, exceto
// necessário apenas se você usar um dos drivers normais do wiimote
char estático nunchuk_decode_byte (char x) {
 x = (x ^ 0x17) + 0x17;
 retornar x;
}
// Receba dados de volta do nunchuck,
// retorna 1 na leitura bem-sucedida. retorna 0 em caso de falha
static int nunchuck_get_data () {
 int cnt = 0;
 Wire.requestFrom (0x52, 6); // solicita dados do nunchuck
 while (Wire.available ()) {
   // recebe byte como um número inteiro
#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 (); // envia solicitação para a próxima carga útil de dados
 // Se recebemos os 6 bytes, imprima-os
 if (cnt & gt; = 5) {
   retornar 1; // sucesso
 }
 retornar 0; // falha
}
// Imprime os dados de entrada que recebemos
// os dados de aceleração têm 10 bits
// então lemos 8 bits, então temos que adicionar
// nos últimos 2 bits. É por isso que eu
// multiplique por 2 * 2
estático 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] contém bits para os botões z e c
 // também contém os bits menos significativos para os dados do acelerômetro
 // então temos que verificar cada bit de 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 ("alegria:");
 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"); // nova linha
 i ++;
}
// retorna o estado do botão z: 1 = pressionado, 0 = não pressionado
static int nunchuck_zbutton () {
 return ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0-1 // voodoo
}
// retorna o estado do botão z: 1 = pressionado, 0 = não pressionado
static int nunchuck_cbutton () {
 return ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0-1 // voodoo
}
// retorna o valor do joystick do eixo x
static int nunchuck_joyx () {
 return nunchuck_buf [0];
}
// retorna o valor do joystick do eixo y
static int nunchuck_joyy () {
 return nunchuck_buf [1];
}
// retorna o valor do acelerômetro do eixo x
static int nunchuck_accelx () {
 return nunchuck_buf [2]; // FIXME: isso exclui 2 bits dos dados
}
// retorna o valor do acelerômetro do eixo y
static int nunchuck_accely () {
 return nunchuck_buf [3]; // FIXME: isso exclui 2 bits dos dados
}
// retorna o valor do acelerômetro do eixo z
static int nunchuck_accelz () {
 return nunchuck_buf [4]; // FIXME: isso exclui 2 bits dos dados
}
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 (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
configuração nula () {
 Serial.begin (9600);
 nunchuck_setpowerpins ();
 nunchuck_init (); // envia o handshake de inicialização
 Serial.println ("Wii Nunchuck Ready");
 pinMode (3, SAÍDA);
 pinMode (5, SAÍDA);
 pinMode (6, SAÍDA);
 pinMode (9, SAÍDA);
 // type ();
}
loop vazio () {
 if (loop_cnt & gt; 10) {// a cada 100 msecs obtém novos dados
   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;
 }
 mais {
   if (joyx & gt; (joyx1 + 20)) {
     int speed1 = mapa (joyx - joyx1, 0, 80, 40, 255);
     velocidade1 = restrição (velocidade1, 0, 255);
     analogWrite (6,0);
     analogWrite (9, velocidade1);
   }
   caso contrário, se (joyx & lt; (joyx1 - 20)) {
     int speed2 = mapa (joyx1 - joyx, 0, 90, 40, 255);
     velocidade2 = restrição (velocidade2, 0, 255);
     analogWrite (6, velocidade2);
     analogWrite (9,0);
   }
   mais {
     analogWrite (6,0);
     analogWrite (9,0);
   }
   if (alegre & gt; (alegre1 + 20)) {
     int speed3 = mapa (joyy - joy1, 0, 80, 40, 255);
     velocidade3 = restrição (velocidade3, 0, 255);
     analogWrite (3, 0);
     analogWrite (5, velocidade3);
   }
   caso contrário, se (alegre & lt; (alegre 1-20)) {
     int speed4 = mapa (joyy1 - joyy, 0, 90, 40, 255);
     velocidade4 = restrição (velocidade4, 0, 255);
     analogWrite (3, velocidade4);
     analogWrite (5, 0);
   }
   mais {
     analogWrite (3, 0);
     analogWrite (5, 0);
   }
 }
 atraso (1);
}
tipo vazio () {
 int tempo = 200;
 // digitalWrite (6, 1); // origem
 // digitalWrite (9, 0);
 // digitalWrite (3, 1);
 // digitalWrite (5, 0);
 // delay (1000);
 // H ===============
 // digitalWrite (3, 0); // espera
 // digitalWrite (5, 0);
 // digitalWrite (6, 0);
 // digitalWrite (9, 0);
 // delay (250);
 // digitalWrite (3, 0); // up
 digitalWrite (5, 1);
 atraso (500);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (3, 1); // para baixo
 // digitalWrite (5, 0);
 atraso (250);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 // digitalWrite (6, 0); // direita
 digitalWrite (9, 1);
 atraso (tempo de espera);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 // digitalWrite (3, 0); // up
 digitalWrite (5, 1);
 atraso (250);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (3, 1); // para baixo
 // digitalWrite (5, 0);
 atraso (500);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 // digitalWrite (6, 0); // direita
 digitalWrite (9, 1);
 atraso (tempo de espera);
 // I ==========================
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (3, 0); // up
 digitalWrite (5, 1);
 atraso (500);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (6, 0); // direita
 digitalWrite (9, 1);
 atraso (100);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (6, 1); // esquerda
 digitalWrite (9,0);
 atraso (tempo de espera);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (6, 0); // direita
 digitalWrite (9, 1);
 atraso (100);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (3, 1); // para baixo
 digitalWrite (5, 0);
 atraso (500);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (6, 0); // direita
 digitalWrite (9, 1);
 atraso (100);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
 digitalWrite (6, 1); // esquerda
 digitalWrite (9,0);
 atraso (tempo de espera);
 digitalWrite (3, 0); // espera
 digitalWrite (5, 0);
 digitalWrite (6,0);
 digitalWrite (9,0);
 atraso (250);
}
Depois de ligar, um dispositivo montado corretamente começa a funcionar imediatamente. O Nunchuck é um joystick analógico, para que você possa controlar não apenas a direção, mas também a velocidade do movimento. O Arduino assume o controle de velocidade PWM. Se o movimento ao longo de qualquer um dos eixos ocorrer na direção oposta, o motor correspondente deverá ser revertido. Ao colocar o cursor aproximadamente no meio da tela e pressionar o botão Z, você pode fazer com que o dispositivo escreva automaticamente a palavra HI.