Mange hadde dette leketøyet i barndommen, vi kontrollerte det med to dreieknapper. Selv da var det mulig å feste to likestrømsmotorer med gir og styre dem fra knappene. Og nå for dette har det blitt mulig å tilpasse styrespakene. Hvilket er det forfatteren av Instructables gjorde under kallenavnet millerman4487.
Men to identiske deler måtte skrives ut - dette er adaptere for tilkobling av gir til Magic Screen-håndtakene. Det ser ut som noen av adapterne:
Og så kobles den til girkassen (kanskje dette vil kreve en liten oppvarming av adapteren med en hårføner):
STL-fil.
Det er bare en uforståelig komponent på den - L293D-brikken. Den inneholder to såkalte H-broer, som hver kan reversere motoren som er koblet til den. Under styret vises det hvilke konklusjoner
Koble til hvilken av pinnene på Wii Nunchuck joystick-kontakten. Skissen nedenfor kan skrives om til å fungere med andre typer styrespaker, i sin nåværende form vil det være påkrevd.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # definere Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
statisk uint8_t nunchuck_buf [6]; // matrise for å lagre nunchuck-data,
// Bruker port C (analoge innstifter) som strøm og jord for Nunchuck
statisk tomrom nunchuck_setpowerpins () {
#definere pwrpin PORTC3
#definere gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
forsinkelse (100); // vent på at ting skal stabilisere seg
}
// initialisere I2C-systemet, bli med I2C-bussen,
// og fortell nunchucken at vi snakker med det
statisk tomrom nunchuck_init () {
Wire.begin (); // bli med i2c buss som master
Wire.beginTransmission (0x52); // overføre til enhet 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // sender minneadresse
Wire.write ((uint8_t) 0x00); // sendes sendt null.
#else
Wire.send ((uint8_t) 0x40); // sender minneadresse
Wire.send ((uint8_t) 0x00); // sendes sendt null.
#endif
Wire.endTransmission (); // slutte å overføre
}
// Send en forespørsel om data til nunchucken
// var "send_zero ()"
statisk tomrom nunchuck_send_request () {
Wire.beginTransmission (0x52); // overføre til enhet 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // sender en byte
#else
Wire.send ((uint8_t) 0x00); // sender en byte
#endif
Wire.endTransmission (); // slutte å overføre
}
// Kod data for å formatere de fleste wiimote-drivere unntatt
// bare nødvendig hvis du bruker en av de vanlige wiimote-driverne
statisk røye nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
retur x;
}
// Motta data fra nunchucken,
// returnerer 1 ved vellykket lesing. returnerer 0 ved feil
statisk int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // be om data fra nunchuck
while (Wire.available ()) {
// motta byte som et heltall
#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 (); // send forespørsel om neste nyttelast
// Hvis vi mottok de 6 byte, så skriv ut dem
if (cnt & gt; = 5) {
retur 1; // suksess
}
retur 0; // fiasko
}
// Skriv ut inndataene vi har mottatt
// accel-data er 10 bit lang
// så vi leser 8 biter, så må vi legge til
// på de siste 2 bitene. Det er derfor jeg
// multipliser dem med 2 * 2
statisk tomrom nunchuck_print_data () {
statisk 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_knapp = 0;
// byte nunchuck_buf [5] inneholder biter for z- og c-knapper
// den inneholder også de minst betydningsfulle bitene for akselerometerdataene
// så vi må sjekke hver bit byteutbuf [5]
if ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_knapp = 1;
if ((nunchuck_buf [5] & gt; 1) & 1)
c_knapp = 1;
if ((nunchuck_buf [5] & gt; 2) & 1)
accel_x_axis + = 1;
if ((nunchuck_buf [5] & 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; 6) & 1)
accel_z_axis + = 1;
if ((nunchuck_buf [5] & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("glede:");
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 ("men:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // newline
i ++;
}
// returnerer zbutton-tilstand: 1 = trykket, 0 = ikke trykket
statisk int nunchuck_zbutton () {
returnere ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0: 1; // voodoo
}
// returnerer zbutton-tilstand: 1 = trykket, 0 = ikke trykket
statisk int nunchuck_cbutton () {
retur ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0: 1; // voodoo
}
// returnerer verdien på x-aksen joystick
statisk int nunchuck_joyx () {
returner nunchuck_buf [0];
}
// returnerer verdien på jo-aksen joystick
statisk int nunchuck_joyy () {
returner nunchuck_buf [1];
}
// returnerer verdien på x-aksens akselerometer
statisk int nunchuck_accelx () {
returner nunchuck_buf [2]; // FIXME: dette utelater 2-bits av dataene
}
// returnerer verdien på y-aksens akselerometer
statisk int nunchuck_accely () {
returner nunchuck_buf [3]; // FIXME: dette utelater 2-bits av dataene
}
// returnerer verdien på z-aksens akselerometer
statisk int nunchuck_accelz () {
returner nunchuck_buf [4]; // FIXME: dette utelater 2-bits av dataene
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (kart (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (kart (glad, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
ugyldig oppsett () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // send initiliseringen håndtrykk
Serial.println ("Wii Nunchuck Ready");
pinMode (3, UTGANG);
pinMode (5, UTGANG);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}
void loop () {
hvis (loop_cnt & gt; 10) {// hver 100 msek får nye 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) {
type ();
zbut = 0;
}
ellers {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = kart (joyx - joyx1, 0, 80, 40, 255);
hastighet1 = begrensning (hastighet1, 0, 255);
analogWrite (6, 0);
analogWrite (9, hastighet1);
}
ellers hvis (joyx & lt; (joyx1 - 20)) {
int speed2 = kart (joyx1 - joyx, 0, 90, 40, 255);
hastighet2 = begrensning (hastighet2, 0, 255);
analogWrite (6, hastighet2);
analogWrite (9, 0);
}
ellers {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = kart (joyy - joyy1, 0, 80, 40, 255);
hastighet3 = begrensning (hastighet3, 0, 255);
analogWrite (3, 0);
analogWrite (5, hastighet3);
}
ellers hvis (joyy & lt; (joyy1 - 20)) {
int speed4 = kart (joyy1 - joyy, 0, 90, 40, 255);
hastighet4 = begrensning (hastighet4, 0, 255);
analogWrite (3, hastighet4);
analogWrite (5, 0);
}
ellers {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
forsinkelse (1);
}
tomtype () {
int rltime = 200;
// digitalWrite (6, 1); // opprinnelse
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalskrive (5, 0);
// forsinkelse (1000);
// H ===============
// digitalWrite (3, 0); // vent
// digitalskrive (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// forsinkelse (250);
// digitalWrite (3, 0); // opp
digitalWrite (5, 1);
forsinkelse (500);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (3, 1); // ned
// digitalskrive (5, 0);
forsinkelse (250);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
// digitalWrite (6, 0); // høyre
digitalWrite (9, 1);
forsinkelse (rltime);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
// digitalWrite (3, 0); // opp
digitalWrite (5, 1);
forsinkelse (250);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (3, 1); // ned
// digitalskrive (5, 0);
forsinkelse (500);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
// digitalWrite (6, 0); // høyre
digitalWrite (9, 1);
forsinkelse (rltime);
// I ==========================
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (3, 0); // opp
digitalWrite (5, 1);
forsinkelse (500);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (6, 0); // høyre
digitalWrite (9, 1);
forsinkelse (100);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (6, 1); // venstre
digitalWrite (9, 0);
forsinkelse (rltime);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (6, 0); // høyre
digitalWrite (9, 1);
forsinkelse (100);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (3, 1); // ned
digitalWrite (5, 0);
forsinkelse (500);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (6, 0); // høyre
digitalWrite (9, 1);
forsinkelse (100);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (6, 1); // venstre
digitalWrite (9, 0);
forsinkelse (rltime);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
}
Etter at du har slått på, begynner en riktig montert enhet å fungere umiddelbart. Nunchuck er en analog joystick, så du kan kontrollere ikke bare retningen, men også bevegelseshastigheten. Arduino overtar PWM-hastighetskontrollen. Hvis bevegelse langs noen av aksene skjer i motsatt retning, må den tilsvarende motoren reverseres. Ved å plassere markøren omtrent midt på skjermen og trykke på Z-knappen, kan du få enheten til automatisk å skrive ordet HI.