Många hade denna leksak i barndomen, vi kontrollerade den med två vridknappar. Även då var det möjligt att fästa två likströmsmotorer med växlar till den och kontrollera dem från knapparna. Och nu har det blivit möjligt att anpassa joysticken. Vilket är vad författaren till Instructables gjorde under smeknamnet millerman4487.
Men två identiska delar måste skrivas ut - det här är adaptrar för anslutning av växlar till Magic Screen-handtagen. Det ser ut som någon av adaptern:
Och så ansluts den till växellådan (kanske detta kräver något värme adaptern med en hårtork):
STL-fil.
Det finns bara en obegriplig komponent på det - L293D-chipet. Den innehåller två så kallade H-broar, som var och en kan vända motorn ansluten till den. Under styrelsen visas vilka slutsatser
Anslut vilken av stiften på Wii Nunchuck-joystick-kontakten. Skissen nedan kan skrivas om för att fungera med alla andra typer av joysticks, i sin nuvarande form krävs det.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # definiera Wire.write (x) Wire.send (x)
// # definiera Wire.read () Wire.receive ()
#endif
statisk uint8_t nunchuck_buf [6]; // array för att lagra nunchuck-data,
// Använder port C (analoga in) -stift som ström och mark för Nunchuck
statisk tomrum nunchuck_setpowerpins () {
#definiera pwrpin PORTC3
#definiera gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
fördröjning (100); // vänta på att saker ska stabiliseras
}
// initiera I2C-systemet, gå med I2C-bussen,
// och berätta för nunchucken att vi pratar med det
statisk tomrum nunchuck_init () {
Wire.begin (); // gå med i2c-buss som master
Wire.beginTransmission (0x52); // överför till enhet 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // skickar minnesadress
Wire.write ((uint8_t) 0x00); // skickade skickat noll.
#else
Wire.send ((uint8_t) 0x40); // skickar minnesadress
Wire.send ((uint8_t) 0x00); // skickade skickat noll.
#endif
Wire.endTransmission (); // stoppa sändningen
}
// Skicka en begäran om data till nunchucken
// var "send_zero ()"
statisk tomrum nunchuck_send_request () {
Wire.beginTransmission (0x52); // överför till enhet 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // skickar en byte
#else
Wire.send ((uint8_t) 0x00); // skickar en byte
#endif
Wire.endTransmission (); // stoppa sändningen
}
// Koda data för att formatera de flesta wiimote-drivrutiner utom
// behövs endast om du använder en av de vanliga wiimote-drivrutinerna
statisk char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
returnera x;
}
// Få tillbaka data från nunchucken,
// returnerar 1 vid framgångsrik läsning. returnerar 0 vid misslyckande
statisk int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // begär data från nunchuck
while (Wire.available ()) {
// ta emot byte som ett 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 (); // skicka begäran om nästa nyttolast
// Om vi fick 6 byte, skriv ut dem
if (cnt & gt; = 5) {
retur 1; // framgång
}
retur 0; // misslyckande
}
// Skriv ut inmatningsdata som vi har fått
// accel-data är 10 bitar långa
// så vi läser 8 bitar, då måste vi lägga till
// på de sista 2 bitarna. Det är därför jag
// multiplicera 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_knapp = 0;
int c_knapp = 0;
// byte nunchuck_buf [5] innehåller bitar för z- och c-knappar
// den innehåller också de minst signifikanta bitarna för accelerometerdata
// så vi måste kontrollera varje bit byteutbuf [5]
if ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_knapp = 1;
if ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_knapp = 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 ("glädje:");
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"); // ny linje
i ++;
}
// returnerar zbutton-tillstånd: 1 = tryckt, 0 = inte tryckt
statisk int nunchuck_zbutton () {
returnera ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0: 1; // voodoo
}
// returnerar zbutton-tillstånd: 1 = tryckt, 0 = inte tryckt
statisk int nunchuck_cbutton () {
returnera ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0: 1; // voodoo
}
// returnerar värdet på x-axels joystick
statisk int nunchuck_joyx () {
returnera nunchuck_buf [0];
}
// returnerar värdet för jo-axel joystick
statisk int nunchuck_joyy () {
returnera nunchuck_buf [1];
}
// returnerar värdet på x-axel accelerometer
statisk int nunchuck_accelx () {
returnera nunchuck_buf [2]; // FIXME: detta lämnar 2-bitar av data
}
// returnerar värdet på y-axel accelerometer
statisk int nunchuck_accely () {
returnera nunchuck_buf [3]; // FIXME: detta lämnar 2-bitar av data
}
// returnerar värdet på z-axel accelerometer
statisk int nunchuck_accelz () {
returnera nunchuck_buf [4]; // FIXME: detta lämnar 2-bitar av data
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (karta (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (karta (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
ogiltig installation () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // skicka initilationshandskakningen
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// typ ();
}
void loop () {
om (loop_cnt & gt; 10) {// varje 100 msek får ny data
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_avtryck ();
}
loop_cnt ++;
if (zbut == 1) {
typ ();
zbut = 0;
}
annars {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = karta (joyx - joyx1, 0, 80, 40, 255);
hastighet1 = begränsning (hastighet1, 0, 255);
analogWrite (6, 0);
analogWrite (9, hastighet1);
}
annars om (joyx & lt; (joyx1 - 20)) {
int speed2 = karta (joyx1 - joyx, 0, 90, 40, 255);
hastighet2 = begränsning (hastighet2, 0, 255);
analogWrite (6, hastighet2);
analogWrite (9, 0);
}
annars {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = karta (joyy - joyy1, 0, 80, 40, 255);
hastighet3 = begränsning (hastighet3, 0, 255);
analogWrite (3, 0);
analogWrite (5, hastighet3);
}
annars om (joyy & lt; (joyy1 - 20)) {
int speed4 = karta (joyy1 - joyy, 0, 90, 40, 255);
hastighet4 = begränsning (hastighet4, 0, 255);
analogWrite (3, hastighet4);
analogWrite (5, 0);
}
annars {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
fördröjning (1);
}
tomtyp () {
int rltime = 200;
// digitalWrite (6, 1); // ursprung
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// fördröjning (1000);
// H ===============
// digitalWrite (3, 0); // vänta
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// fördröjning (250);
// digitalWrite (3, 0); // upp
digitalWrite (5, 1);
fördröjning (500);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (3, 1); // ned
// digitalWrite (5, 0);
fördröjning (250);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
// digitalWrite (6, 0); // höger
digitalWrite (9, 1);
fördröjning (rltime);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
// digitalWrite (3, 0); // upp
digitalWrite (5, 1);
fördröjning (250);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (3, 1); // ned
// digitalWrite (5, 0);
fördröjning (500);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
// digitalWrite (6, 0); // höger
digitalWrite (9, 1);
fördröjning (rltime);
// I ==========================
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (3, 0); // upp
digitalWrite (5, 1);
fördröjning (500);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (6, 0); // höger
digitalWrite (9, 1);
fördröjning (100);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (6, 1); // vänster
digitalWrite (9, 0);
fördröjning (rltime);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (6, 0); // höger
digitalWrite (9, 1);
fördröjning (100);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (3, 1); // ned
digitalWrite (5, 0);
fördröjning (500);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (6, 0); // höger
digitalWrite (9, 1);
fördröjning (100);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
digitalWrite (6, 1); // vänster
digitalWrite (9, 0);
fördröjning (rltime);
digitalWrite (3, 0); // vänta
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
fördröjning (250);
}
Efter påslagningen börjar en korrekt monterad enhet att fungera omedelbart. Nunchuck är en analog joystick, så du kan kontrollera inte bara riktningen, utan också rörelsens hastighet. Arduino tar över PWM-hastighetskontrollen. Om rörelse längs någon av axlarna sker i motsatt riktning måste motsvarande motor vändas. Genom att placera markören ungefär mitt på skärmen och trycka på Z-knappen kan du göra att enheten automatiskt skriver ordet HI.