Mange havde dette legetøj i barndommen, vi kontrollerede det med to drejeknapper. Selv da var det muligt at tilslutte to jævnstrømsmotorer med gear til det og styre dem fra knapperne. Og nu er det blevet muligt at tilpasse joysticks. Som forfatteren af Instructables gjorde under kaldenavnet millerman4487.
Alle komponenter hjemmelavet han lagde på et ark pap:
Men to identiske dele måtte udskrives - dette er adaptere til tilslutning af gear til Magic Screen-håndtagene. Det ligner nogen af adapterne:
Og så forbindes den til gearkassen (måske kræver dette opvarmning af adapteren med en hårtørrer):
STL-fil.
Det elektriske kredsløbsdiagram er vist nedenfor:
Der er kun en uforståelig komponent på den - L293D-chippen. Den indeholder to såkaldte H-broer, som hver kan vende motoren tilsluttet den. Under bestyrelsen vises det, hvilke konklusioner Arduino Tilslut hvilken af nålene på Wii Nunchuck joystick-stikket. Skitse nedenfor kan skrives om til at arbejde med alle andre typer joysticks, i sin nuværende form er det påkrævet.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # definere Wire.write (x) Wire.send (x)
// # definere Wire.read () Wire.receive ()
#endif
statisk uint8_t nunchuck_buf [6]; // array til lagring af nunchuck-data,
// Bruger port C (analog ind) stifter som strøm og jord til Nunchuck
statisk tomrum nunchuck_setpowerpins () {
#definér pwrpin PORTC3
#definér gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
forsinkelse (100); // vent på, at tingene stabiliseres
}
// initialisere I2C-systemet, gå med i I2C-bussen,
// og fortæl nunchuck, at vi taler til det
statisk tomrum nunchuck_init () {
Wire.begin (); // Bliv medlem af i2c bus som master
Wire.beginTransmission (0x52); // transmitter til enhed 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // sender hukommelsesadresse
Wire.write ((uint8_t) 0x00); // sendes sendt en nul.
#else
Wire.send ((uint8_t) 0x40); // sender hukommelsesadresse
Wire.send ((uint8_t) 0x00); // sendes sendt en nul.
#endif
Wire.endTransmission (); // stop transmission
}
// Send en anmodning om data til nunchuck
// var "send_zero ()"
statisk tomrum nunchuck_send_request () {
Wire.beginTransmission (0x52); // transmitter til enhed 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 (); // stop transmission
}
// Kod data for at formatere de fleste wiimote-drivere undtagen
// kun nødvendig, hvis du bruger en af de almindelige wiimote-drivere
statisk char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
returnere x;
}
// Modtag data tilbage fra nunchuck,
// returnerer 1 ved vellykket læsning. returnerer 0 ved fiasko
statisk int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // anmod om data fra nunchuck
while (Wire.available ()) {
// modtage byte som et heltal
#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 anmodning om næste data-nyttelast
// Hvis vi modtog de 6 byte, skal du udskrive dem
hvis (cnt & gt; = 5) {
retur 1; // succes
}
retur 0; // fiasko
}
// Udskriv de indtastningsdata, vi har modtaget
// accel-data er 10 bit lang
// så vi læser 8 bit, så er vi nødt til at tilføje
// på de sidste 2 bit. Det er derfor jeg
// gang dem med 2 * 2
statisk tomrum 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_knap = 0;
// byte nunchuck_buf [5] indeholder bits til z- og c-knapper
// det indeholder også de mindst betydningsfulde bit til accelerometerdataene
// så vi er nødt til at kontrollere hver bit byte-outbuf [5]
hvis ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_knap = 1;
hvis ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_knap = 1;
hvis ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
hvis ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
hvis ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
hvis ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
hvis ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
hvis ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("glæde:");
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-trykt
statisk int nunchuck_zbutton () {
returnere ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0: 1; // voodoo
}
// returnerer zbutton-tilstand: 1 = trykket, 0 = ikke-trykt
statisk int nunchuck_cbutton () {
returnere ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0: 1; // voodoo
}
// returnerer værdien af x-aksen joystick
statisk int nunchuck_joyx () {
returner nunchuck_buf [0];
}
// returnerer værdien af jo-aksen joystick
statisk int nunchuck_joyy () {
returner nunchuck_buf [1];
}
// returnerer værdien af x-aksens accelerometer
statisk int nunchuck_accelx () {
returner nunchuck_buf [2]; // FIXME: dette udelader 2-bit af dataene
}
// returnerer værdien af y-aksens accelerometer
statisk int nunchuck_accely () {
returner nunchuck_buf [3]; // FIXME: dette udelader 2-bit af dataene
}
// returnerer værdien af z-aksens accelerometer
statisk int nunchuck_accelz () {
returner nunchuck_buf [4]; // FIXME: dette udelader 2-bit af dataene
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (kort (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (kort (glad, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
ugyldig opsætning () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // send initiliseringshåndtrykket
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
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 ++;
hvis (zbut == 1) {
type ();
zbut = 0;
}
ellers {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = kort (joyx - joyx1, 0, 80, 40, 255);
hastighed1 = begrænsning (hastighed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, hastighed1);
}
ellers hvis (joyx & lt; (joyx1 - 20)) {
int speed2 = kort (joyx1 - joyx, 0, 90, 40, 255);
hastighed2 = begrænsning (hastighed2, 0, 255);
analogWrite (6, hastighed2);
analogWrite (9, 0);
}
ellers {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = kort (joyy - joyy1, 0, 80, 40, 255);
hastighed3 = begrænsning (hastighed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, hastighed3);
}
ellers hvis (glad & lt; (joyy1 - 20)) {
int speed4 = kort (joyy1 - joyy, 0, 90, 40, 255);
hastighed4 = begrænsning (hastighed4, 0, 255);
analogWrite (3, hastighed4);
analogWrite (5, 0);
}
ellers {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
forsinkelse (1);
}
void type () {
int rltime = 200;
// digitalWrite (6, 1); // oprindelse
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// forsinkelse (1000);
// H ===============
// digitalskrivning (3, 0); // vent
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// forsinkelse (250);
// digitalWrite (3, 0); // op
digitalWrite (5, 1);
forsinkelse (500);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (3, 1); // ned
// digitalWrite (5, 0);
forsinkelse (250);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
// digitalWrite (6, 0); // højre
digitalWrite (9, 1);
forsinkelse (rltime);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
// digitalWrite (3, 0); // op
digitalWrite (5, 1);
forsinkelse (250);
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øjre
digitalWrite (9, 1);
forsinkelse (rltime);
// I ==========================
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (3, 0); // op
digitalWrite (5, 1);
forsinkelse (500);
digitalWrite (3, 0); // vent
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
forsinkelse (250);
digitalWrite (6, 0); // højre
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øjre
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øjre
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);
}
Efter tænding starter en korrekt samlet enhed med det samme. Nunchuck er en analog joystick, så du kan kontrollere ikke kun retningen, men også bevægelseshastigheden. Arduino overtager PWM-hastighedskontrollen. Hvis bevægelse langs en af akserne finder sted i den modsatte retning, skal den tilsvarende motor vendes. Ved at placere markøren omtrent midt på skærmen og trykke på Z-knappen, kan du få enheden til automatisk at skrive ordet HI.