Monilla oli tämä lelu lapsuudessa; hallitsimme sitä kahdella kiertonupilla. Silloinkin oli mahdollista kiinnittää kaksi tasavirtamoottoria vaihdelaatikoihin ja ohjata niitä painikkeista. Ja nyt tähän on tullut mahdollista mukauttaa ohjaussauvat. Mikä on mitä Instructable-kirjoittaja teki lempinimellä millerman4487.
Mutta kaksi identtistä osaa tuli tulostaa - nämä ovat sovittimia hammaspyörien kytkemiseen Magic-näytön kahvoihin. Näyttää siltä, että jokin sovittimista:
Ja niin se yhdistää vaihdelaatikkoon (ehkä tämä vaatii sovittimen hieman lämmittämistä hiustenkuivaajalla):
STL-tiedosto.
Siinä on vain yksi käsittämätön komponentti - L293D-siru. Se sisältää kaksi ns. H-siltaa, joista kukin voi kääntää siihen kytketyn moottorin taaksepäin. Taulun alla on esitetty mitä päätelmiä
Kytke mikä Wii Nunchuck -ohjaussauvaliittimen tapista. Alla oleva luonnos voidaan kirjoittaa uudelleen työskentelemään minkä tahansa muun tyyppisten joystickien kanssa, nykyisessä muodossaan se vaaditaan.
#include
#if (ARDUINO> = 100)
#include
#else
#include
// # määrittele Wire.write (x) Wire.send (x)
// # määrittele Wire.read () Wire.recept ()
#endif
staattinen uint8_t nunchuck_buf [6]; // taulukko nunchuck-tietojen tallentamiseksi,
// Käyttää portti C (analoginen sisään) -tappeja virtana ja maana Nunchuckille
staattinen tyhjä nunchuck_setpowerpins () {
#definine pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
viive (100); // odota asioiden vakiintuvan
}
// alusta I2C-järjestelmä, liity I2C-väylään,
// ja kerro nunchukille, että puhumme siitä
staattinen void nunchuck_init () {
Wire.begin (); // liity i2c-väylään isäntänä
Wire.beginTransmission (0x52); // siirtää laitteelle 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x40); // lähettää muistiosoitteen
Wire.write ((uint8_t) 0x00); // lähettää lähetetty nolla.
#else
Wire.send ((uint8_t) 0x40); // lähettää muistiosoitteen
Wire.send ((uint8_t) 0x00); // lähettää lähetetty nolla.
#endif
Wire.endTransmission (); // lopeta lähetys
}
// Lähetä tietopyyntö nunchukille
// oli "send_zero ()"
staattinen void nunchuck_send_request () {
Wire.beginTransmission (0x52); // siirtää laitteelle 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x00); // lähettää yhden tavun
#else
Wire.send ((uint8_t) 0x00); // lähettää yhden tavun
#endif
Wire.endTransmission (); // lopeta lähetys
}
// Koodaa tiedot muotoon, joka useimmat wiimote ohjaimet paitsi
// tarvitaan vain, jos käytät yhtä tavallisista wiimote-ohjaimista
staattinen char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
paluu x;
}
// vastaanottaa tietoja takaisin nunchukista,
// palauttaa 1 onnistuneesta lukemisesta. palauttaa 0 virheestä
staattinen int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // pyydä tietoja nunchuckilta
while (Wire.a available ()) {
// vastaanota tavu kokonaislukuna
#if (ARDUINO> = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.recept ());
#endif
cnt ++;
}
nunchuck_send_request (); // lähetä pyyntö seuraavaa tiedon hyötykuormaa varten
// Jos saimme 6 tavua, niin tulosta ne
if (cnt> 5) {
paluu 1; // menestys
}
paluu 0; // vika
}
// Tulosta saamamme tulotiedot
// kiihdytysdata on 10 bittiä pitkä
// joten luimme 8 bittiä, sitten meidän on lisättävä
// viimeisillä 2 bitillä. Siksi minä
// kerro ne 2: lla 2: lla
staattinen void nunchuck_print_data () {
staattinen 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_painike = 0;
int c_painike = 0;
// tavu nunchuck_buf [5] sisältää bittejä z- ja c-painikkeille
// se sisältää myös vähiten merkitsevät bitit kiihtyvyysanturin tietoihin
// joten meidän on tarkistettava jokainen tavujen outbuf-bitti [5]
if ((nunchuck_buf [5] & gt; 0) & 1)
z_painike = 1;
if ((nunchuck_buf [5] & gt; 1) & 1)
c_painike = 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; 4) & 1)
accel_y_axis + = 1;
if ((nunchuck_buf [5] & 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;
Sarjajälki (i, DEC);
Serial.print ("\ t");
Serial.print ("ilo:");
Sarjajälki (joy_x_axis, DEC);
Serial.print (",");
Sarjajälki (joy_y_axis, DEC);
Serial.print ("\ t");
Serial.print ("acc:");
Sarjajälki (accel_x_axis, DEC);
Serial.print (",");
Sarjajälki (accel_y_axis, DEC);
Serial.print (",");
Sarjajälki (accel_z_axis, DEC);
Serial.print ("\ t");
Serial.print ("but:");
Sarjajälki (z_painike, DEC);
Serial.print (",");
Sarjajälki (c-painike, DEC);
Serial.print ("\ r \ n"); // uusi rivi
i ++;
}
// palauttaa painikkeen tilan z: 1 = painetaan, 0 = ei painettu
staattinen int nunchuck_zbutton () {
paluu ((nunchuck_buf [5] & gt; 0) & 1)? 0: 1; // voodoo
}
// palauttaa painikkeen tilan z: 1 = painetaan, 0 = ei painettu
staattinen int nunchuck_cbutton () {
paluu ((nunchuck_buf [5] & gt; 1) & 1)? 0: 1; // voodoo
}
// palauttaa x-akselin ohjaussauvan arvon
staattinen int nunchuck_joyx () {
palauta nunchuck_buf [0];
}
// palauttaa y-akselin ohjaussauvan arvon
staattinen int nunchuck_joyy () {
palauta nunchuck_buf [1];
}
// palauttaa x-akselin kiihtyvyysanturin arvon
staattinen int nunchuck_accelx () {
palauta nunchuck_buf [2]; // FIXME: tämä jättää pois 2-bittisen datan
}
// palauttaa y-akselin kiihtyvyysanturin arvon
staattinen int nunchuck_accely () {
palauta nunchuck_buf [3]; // FIXME: tämä jättää pois 2-bittisen datan
}
// palauttaa z-akselin kiihtyvyysanturin arvon
staattinen int nunchuck_accelz () {
palauta nunchuck_buf [4]; // FIXME: tämä jättää pois 2-bittisen datan
}
int loop_cnt = 0;
tavu joyx, joyy, zbut, cbut, accx, accy, accz;
tyhjä _print () {
Serial.print ("\ tX Joy:");
Sarjajälki (kartta (joyx, 15, 221, 0, 255));
Serial.print ("Joy:");
Serial.println (kartta (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
tyhjä asennus () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // lähetä iniciaation kädenpuristus
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// tyyppi ();
}
tyhjä silmukka () {
if (loop_cnt> 10) {// 100 ms: n välein saa uutta tietoa
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) {
tyyppi ();
zbut = 0;
}
muuten {
if (joyx & gt; (joyx1 + 20)) {
int nopeus1 = kartta (joyx - joyx1, 0, 80, 40, 255);
nopeus1 = rajoitus (nopeus1, 0, 255);
analogWrite (6,0);
analogWrite (9, nopeus1);
}
muuten jos (joyx & lt; (joyx1 - 20)) {
int nopeus2 = kartta (joyx1 - joyx, 0, 90, 40, 255);
nopeus2 = rajoitus (nopeus2, 0, 255);
analogWrite (6, nopeus2);
analogWrite (9,0);
}
muuten {
analogWrite (6,0);
analogWrite (9,0);
}
if (joyy & gt; (joyy1 + 20)) {
int nopeus3 = kartta (joyy - joyy1, 0, 80, 40, 255);
nopeus3 = rajoitus (nopeus3, 0, 255);
analogWrite (3, 0);
analogWrite (5, nopeus3);
}
muuten jos (joyy & lt; (joyy1 - 20)) {
int nopeus4 = kartta (joyy1 - joyy, 0, 90, 40, 255);
nopeus4 = rajoitus (nopeus4, 0, 255);
analogWrite (3, nopeus4);
analogWrite (5,0);
}
muuten {
analogWrite (3, 0);
analogWrite (5,0);
}
}
viive (1);
}
tyhjä tyyppi () {
int rltime = 200;
// digitalWrite (6, 1); // alkuperä
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// viive (1000);
// H ===============
// digitalWrite (3, 0); // odota
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// viive (250);
// digitalWrite (3, 0); // ylöspäin
digitalWrite (5, 1);
viive (500);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (3, 1); // alaspäin
// digitalWrite (5, 0);
viive (250);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
// digitalWrite (6, 0); // oikea
digitalWrite (9, 1);
viive (rltime);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
// digitalWrite (3, 0); // ylöspäin
digitalWrite (5, 1);
viive (250);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (3, 1); // alaspäin
// digitalWrite (5, 0);
viive (500);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
// digitalWrite (6, 0); // oikea
digitalWrite (9, 1);
viive (rltime);
// Minä ==========================
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (3, 0); // ylöspäin
digitalWrite (5, 1);
viive (500);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (6, 0); // oikea
digitalWrite (9, 1);
viive (100);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (6, 1); // vasen
digitalWrite (9, 0);
viive (rltime);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (6, 0); // oikea
digitalWrite (9, 1);
viive (100);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (3, 1); // alaspäin
digitalWrite (5, 0);
viive (500);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (6, 0); // oikea
digitalWrite (9, 1);
viive (100);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
digitalWrite (6, 1); // vasen
digitalWrite (9, 0);
viive (rltime);
digitalWrite (3, 0); // odota
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
viive (250);
}
Virran kytkemisen jälkeen oikein asennettu laite alkaa toimia heti. Nunchuck on analoginen joystick, joten voit hallita paitsi suuntaa myös liikkeen nopeutta. Arduino ottaa vastaan PWM-nopeudenhallinnan. Jos liike akseleita pitkin tapahtuu vastakkaiseen suuntaan, vastaava moottori on käännettävä. Asettamalla kohdistin suunnilleen näytön keskelle ja painamalla Z-painiketta, voit saada laitteen kirjoittamaan sana HI automaattisesti.