Molts tenien aquesta joguina a la infància, la controlem amb dos poms rotatius. Fins i tot llavors, era possible unir-hi dos motors de corrent continu amb engranatges i controlar-los des dels botons. I ara per això s’ha fet possible adaptar els joysticks. Això és el que va fer l’autor de Instructables amb el sobrenom de millerman4487.
Però s'havien d'imprimir dues parts idèntiques: es tracta d'adaptadors per connectar els engranatges a les nanses de la pantalla màgica. Sembla qualsevol dels adaptadors:
I així es connecta a la caixa de canvis (potser això requerirà un escalfament lleuger de l'adaptador amb assecador):
Fitxer STL.
Hi ha només un component incomprensible: el xip L293D. Conté dos anomenats ponts H, cadascun dels quals pot invertir el motor connectat a ell. A sota del tauler es mostra quines conclusions
Connecteu quins dels pins del connector de control de comandament Wii Nunchuck. Es pot reescriure l'esbós a continuació per treballar amb qualsevol altre tipus de joysticks, en la seva forma actual.
#incloure
#if (ARDUINO & gt; = 100)
#incloure
#else
#incloure
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
estàtic uint8_t nunchuck_buf [6]; // matriu per emmagatzemar dades nunchuck,
// Utilitza els pins del port C (analògic) com a potència i terra per a Nunchuck
static void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
retard (100); // esperar que les coses s’estabilitzin
}
// inicialitzar el sistema I2C, unir-se al bus I2C,
// i digueu-li al nunchuck que en parlem
static void nunchuck_init () {
Wire.begin (); // uniu-vos al bus i2c com a mestre
Wire.beginTransmission (0x52); // transmetre al dispositiu 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // envia una adreça de memòria
Wire.write ((uint8_t) 0x00); // envia un zero.
#else
Wire.send ((uint8_t) 0x40); // envia una adreça de memòria
Wire.send ((uint8_t) 0x00); // envia un zero.
#endif
Wire.endTransmission (); // deixar de transmetre
}
// Envia una sol·licitud de dades al nunchuck
// era "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // transmetre al dispositiu 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // envia un byte
#else
Wire.send ((uint8_t) 0x00); // envia un byte
#endif
Wire.endTransmission (); // deixar de transmetre
}
// Codifica les dades per formatar la majoria dels controladors wiimotes, excepte
// només cal si feu servir un dels controladors wiimotes habituals
static char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
retornar x;
}
// Rebre dades de nouchuck,
// retorna 1 en llegir correctament. retorna 0 en fallar
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // sol·licitar dades de nunchuck
while (Wire.available ()) {
// rebre un byte com un nombre enter
#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 (); // enviar sol·licitud de càrrega útil de properes dades
// Si hem rebut els 6 bytes, anem a imprimir-los
if (cnt & gt; = 5) {
retorn 1; // èxit
}
retornar 0; // fracàs
}
// Imprimeix les dades d’entrada que hem rebut
// Les dades d’acceleració tenen una longitud de 10 bits
// així que llegim 8 bits, llavors hem d’afegir
// als darrers dos bits. Per això jo
// multiplica-les per 2 * 2
static void nunchuck_print_data () {
int estàtic 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é bits per als botons z i c
// també conté els bits menys significatius per a les dades de l’acceleròmetre
// així que hem de revisar cada bit de sortida de byte [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 ("però:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // línia nova
i ++;
}
// retorna l'estat zbutton: 1 = premsat, 0 = notpressed
static int nunchuck_zbutton () {
tornar ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0-1 // vudú
}
// retorna l'estat zbutton: 1 = premsat, 0 = notpressed
static int nunchuck_cbutton () {
tornar ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0-1 // vudú
}
// retorna el valor del joystick de l'eix x
static int nunchuck_joyx () {
retornar nunchuck_buf [0];
}
// retorna el valor del comandament de l’eix Y
static int nunchuck_joyy () {
tornar nunchuck_buf [1];
}
// retorna el valor de l’acceleròmetre de l’eix x
static int nunchuck_accelx () {
tornar nunchuck_buf [2]; // FIXME: deixa fora de dos bits de les dades
}
// retorna el valor de l'acceleròmetre de l'eix Y
static int nunchuck_accely () {
tornar nunchuck_buf [3]; // FIXME: deixa fora de dos bits de les dades
}
// retorna el valor de l'acceleròmetre de l'eix Z
static int nunchuck_accelz () {
tornar nunchuck_buf [4]; // FIXME: deixa fora de dos bits de les dades
}
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 (alegre, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
void setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // envia un cop de mà d’iniciació
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// tipus ();
}
void loop () {
if (loop_cnt & gt; 10) {// cada 100 msecs obté dades noves
bucle_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
alegre = nunchuck_joyy (); // 29 - 229
_print ();
}
bucle_cnt ++;
if (zbut == 1) {
tipus ();
zbut = 0;
}
més {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = mapa (joyx - joyx1, 0, 80, 40, 255);
velocitat1 = restringir (velocitat1, 0, 255);
analogWrite (6, 0);
analogWrite (9, velocitat1);
}
else if (joyx & lt; (joyx1 - 20)) {
int speed2 = mapa (joyx1 - joyx, 0, 90, 40, 255);
velocitat2 = restringir (velocitat2, 0, 255);
analogWrite (6, velocitat2);
analogWrite (9, 0);
}
més {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (alegre & gt; (joyy1 + 20)) {
int speed3 = mapa (joyy - joyy1, 0, 80, 40, 255);
velocitat3 = restringir (velocitat3, 0, 255);
analogWrite (3, 0);
analogWrite (5, velocitat3);
}
else if (joyy & lt; (joyy1 - 20)) {
int speed4 = mapa (joyy1 - alegre, 0, 90, 40, 255);
speed4 = restringir (velocitat4, 0, 255);
analogWrite (3, velocitat4);
analogWrite (5, 0);
}
més {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
retard (1);
}
void type () {
int rltime = 200;
// digitalWrite (6, 1); // origen
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// retard (1000);
// H ===============
// digitalWrite (3, 0); // wait
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// retard (250);
// digitalWrite (3, 0); // up
digitalWrite (5, 1);
retard (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (3, 1); // down
// digitalWrite (5, 0);
retard (250);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
// digitalWrite (6, 0); // right
digitalWrite (9, 1);
retard (hora ràpida);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
// digitalWrite (3, 0); // up
digitalWrite (5, 1);
retard (250);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (3, 1); // down
// digitalWrite (5, 0);
retard (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
// digitalWrite (6, 0); // right
digitalWrite (9, 1);
retard (hora ràpida);
// I ==========================
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (3, 0); // up
digitalWrite (5, 1);
retard (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (6, 0); // dreta
digitalWrite (9, 1);
retard (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (6, 1); // left
digitalWrite (9, 0);
retard (hora ràpida);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (6, 0); // dreta
digitalWrite (9, 1);
retard (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (3, 1); // down
digitalWrite (5, 0);
retard (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (6, 0); // dreta
digitalWrite (9, 1);
retard (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
digitalWrite (6, 1); // left
digitalWrite (9, 0);
retard (hora ràpida);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
retard (250);
}
Després d’encendre’s, un dispositiu muntat correctament comença a funcionar immediatament. Nunchuck és un joystick analògic, de manera que podeu controlar no només la direcció, sinó també la velocitat del moviment. Arduino es fa càrrec del control de velocitat PWM. Si es desplaça cap dels eixos en el sentit contrari, cal invertir el motor corresponent. Col·locant el cursor aproximadament a la meitat de la pantalla i prement el botó Z, podeu fer que el dispositiu escrigui automàticament la paraula HI.