Velen hadden dit speelgoed in de kindertijd; we bedienden het met twee draaiknoppen. Zelfs toen was het mogelijk om twee gelijkstroommotoren met versnellingen erop te bevestigen en ze via de knoppen te bedienen. En nu is het hiervoor mogelijk geworden om de joysticks aan te passen. Dat is wat de auteur van Instructables deed onder de bijnaam millerman4487.
Maar er moesten twee identieke onderdelen worden afgedrukt - dit zijn adapters voor het aansluiten van tandwielen op de Magic Screen-handgrepen. Het lijkt op een van de adapters:
En dus maakt het verbinding met de versnellingsbak (misschien vereist dit een beetje opwarming van de adapter met een haardroger):
STL-bestand.
Er zit maar één onbegrijpelijk onderdeel op: de L293D-chip. Het bevat twee zogenaamde H-bruggen, die elk de daarmee verbonden motor kunnen omkeren. Onder het bord staat welke conclusies
Verbind welke van de pinnen van de Wii Nunchuck-joystickconnector. De onderstaande schets kan worden herschreven om te werken met elk ander type joysticks, in zijn huidige vorm is dit vereist.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # definieer Wire.write (x) Wire.send (x)
// # definieer Wire.read () Wire.receive ()
#endif
statisch uint8_t nunchuck_buf [6]; // array om nunchuck-gegevens op te slaan,
// Gebruikt poort C (analoog in) pinnen als voeding en aarde voor Nunchuck
statische leegte nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
vertraging (100); // wacht tot de zaken zich stabiliseren
}
// initialiseer het I2C-systeem, sluit u aan bij de I2C-bus,
// en vertel de nunchuck dat we ermee praten
statische leegte nunchuck_init () {
Wire.begin (); // Word lid van de i2c-bus als master
Wire.beginTransmission (0x52); // Verzenden naar apparaat 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // stuurt geheugenadres
Wire.write ((uint8_t) 0x00); // verzendt een nul.
#else
Wire.send ((uint8_t) 0x40); // stuurt geheugenadres
Wire.send ((uint8_t) 0x00); // sends stuurde een nul.
#endif
Wire.endTransmission (); // Stop met verzenden
}
// Stuur een verzoek om gegevens naar de nunchuck
// was "send_zero ()"
statische leegte nunchuck_send_request () {
Wire.beginTransmission (0x52); // Verzenden naar apparaat 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // stuurt een byte
#else
Wire.send ((uint8_t) 0x00); // stuurt een byte
#endif
Wire.endTransmission (); // Stop met verzenden
}
// Codeer gegevens om de meeste wiimote-stuurprogramma's te formatteren, behalve
// alleen nodig als u een van de reguliere wiimote-stuurprogramma's gebruikt
statische char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
retourneer x;
}
// Ontvang gegevens terug van de nunchuck,
// geeft 1 terug bij succesvol lezen. geeft 0 terug bij mislukking
statische int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // Vraag gegevens op van nunchuck
terwijl (Wire.available ()) {
// ontvangen byte als een geheel getal
#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 (); // verzoek verzenden voor de volgende gegevensbelasting
// Als we de 6 bytes hebben ontvangen, druk ze dan af
if (cnt & gt; = 5) {
terugkeer 1; // succes
}
retourneer 0; // mislukking
}
// Druk de invoergegevens af die we hebben ontvangen
// Accel-gegevens zijn 10 bits lang
// dus we lezen 8 bits, dan moeten we toevoegen
// op de laatste 2 bits. Dat is waarom ik
// vermenigvuldig ze met 2 * 2
statische leegte nunchuck_print_data () {
statisch 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] bevat bits voor z- en c-knoppen
// het bevat ook de minst significante bits voor de accelerometergegevens
// dus we moeten elk stukje byte outbuf controleren [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 ("joy:");
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 ("maar:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // newline
i ++;
}
// geeft de zbutton-status terug: 1 = ingedrukt, 0 = niet ingedrukt
statische int nunchuck_zbutton () {
terugkeer ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0-1 // voodoo
}
// geeft de zbutton-status terug: 1 = ingedrukt, 0 = niet ingedrukt
statische int nunchuck_cbutton () {
terugkeer ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0-1 // voodoo
}
// geeft de waarde van de x-as joystick terug
statische int nunchuck_joyx () {
retourneer nunchuck_buf [0];
}
// retourneert de waarde van de y-as joystick
statische int nunchuck_joyy () {
terugkeer nunchuck_buf [1];
}
// retourneert de waarde van de versnellingsmeter op de x-as
statische int nunchuck_accelx () {
retourneer nunchuck_buf [2]; // FIXME: dit laat 2-bits van de gegevens weg
}
// retourneert de waarde van de versnellingsmeter op de y-as
statische int nunchuck_accely () {
retourneer nunchuck_buf [3]; // FIXME: dit laat 2-bits van de gegevens weg
}
// retourneert de waarde van de versnellingsmeter met z-as
statische int nunchuck_accelz () {
retourneer nunchuck_buf [4]; // FIXME: dit laat 2-bits van de gegevens weg
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
nietig _print () {
Serial.print ("\ tX Joy:");
Serial.print (kaart (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (kaart (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15-221
int joyy1 = 124; // 29-229
ongeldige setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // stuur de initiatiehanddruk
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}
leegte lus () {
if (loop_cnt & gt; 10) {// elke 100 ms krijgt nieuwe gegevens
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;
}
anders {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = kaart (joyx - joyx1, 0, 80, 40, 255);
snelheid1 = beperken (snelheid1, 0, 255);
analogWrite (6, 0);
analogWrite (9, snelheid1);
}
anders als (joyx & lt; (joyx1 - 20)) {
int speed2 = kaart (joyx1 - joyx, 0, 90, 40, 255);
speed2 = beperken (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
anders {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = kaart (joyy - joyy1, 0, 80, 40, 255);
speed3 = beperken (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
anders als (joyy & lt; (joyy1 - 20)) {
int speed4 = kaart (joyy1 - joyy, 0, 90, 40, 255);
speed4 = beperken (speed4, 0, 255);
analogWrite (3, speed4);
analogWrite (5, 0);
}
anders {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
vertraging (1);
}
nietig type () {
int rltime = 200;
// digitalWrite (6, 1); // oorsprong
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// delay (1000);
// H ===============
// digitalWrite (3, 0); // wacht
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// vertraging (250);
// digitalWrite (3, 0); // omhoog
digitalWrite (5, 1);
vertraging (500);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (3, 1); // omlaag
// digitalWrite (5, 0);
vertraging (250);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
// digitalWrite (6, 0); // rechts
digitalWrite (9, 1);
vertraging (rltime);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
// digitalWrite (3, 0); // omhoog
digitalWrite (5, 1);
vertraging (250);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (3, 1); // omlaag
// digitalWrite (5, 0);
vertraging (500);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
// digitalWrite (6, 0); // rechts
digitalWrite (9, 1);
vertraging (rltime);
// Ik ==========================
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (3, 0); // omhoog
digitalWrite (5, 1);
vertraging (500);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (6, 0); // rechts
digitalWrite (9, 1);
vertraging (100);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (6, 1); // links
digitalWrite (9, 0);
vertraging (rltime);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (6, 0); // rechts
digitalWrite (9, 1);
vertraging (100);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (3, 1); // omlaag
digitalWrite (5, 0);
vertraging (500);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (6, 0); // rechts
digitalWrite (9, 1);
vertraging (100);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
digitalWrite (6, 1); // links
digitalWrite (9, 0);
vertraging (rltime);
digitalWrite (3, 0); // Wacht
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
vertraging (250);
}
Na het inschakelen begint een correct gemonteerd apparaat onmiddellijk te werken. Nunchuck is een analoge joystick, dus je kunt niet alleen de richting, maar ook de bewegingssnelheid regelen. Arduino neemt de PWM-snelheidsregeling over. Als beweging langs een van de assen in de tegenovergestelde richting plaatsvindt, moet de bijbehorende motor worden omgekeerd. Door de cursor ongeveer in het midden van het scherm te plaatsen en op de Z-knop te drukken, kunt u ervoor zorgen dat het apparaat automatisch het woord HI schrijft.