Sokaknak volt ez a játék gyerekkorban, két forgógombbal irányítottuk. Még akkor is lehetőség nyílt rá, hogy két egyenáramú motort fogaskerekekkel rögzítsen, és a gombok segítségével vezérelje. És ehhez most lehetővé vált a joystickok adaptálása. Amit az Instructables szerzője, millerman4487 becenév alatt tett.
De két azonos alkatrészt kellett kinyomtatni - ezek adapterek a fogaskerekeknek a Magic Screen fogantyúihoz való csatlakoztatásához. Úgy néz ki, mint bármelyik adapter:
Így csatlakozik a sebességváltóhoz (valószínűleg ehhez az adaptert kissé fel kell melegíteni hajszárítóval):
STL fájl.
Csak egy érthetetlen elem van rajta - az L293D chip. Két úgynevezett H-hidat tartalmaz, amelyek mindegyike megfordíthatja a hozzá kapcsolt motort. A tábla alatt látható, hogy mely következtetésekre lehet következtetni
Csatlakoztassa a Wii Nunchuck joystick csatlakozójának melyik érintkezőjét. Az alábbi vázlat átírható bármilyen más típusú joystickkal való működéshez, jelenlegi formájában erre szükség lesz.
#include
#if (ARDUINO> = 100)
#include
#else
#include
// # definiálja a Wire.write (x) Wire.send (x)
// # definiálja a Wire.read () Wire.recept ()
#endif
statikus uint8_t nunchuck_buf [6]; // tömb a nunchuck adatok tárolására,
// A C (analóg bemenet) érintkezőket tápfeszültségként és földként használja a Nunchuck számára
statikus érvénytelen nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
késleltetés (100); // várja meg, amíg a dolgok stabilizálódnak
}
// inicializálja az I2C rendszert, csatlakozzon az I2C buszhoz,
// és mondd el a nunchucknak, hogy beszélünk vele
statikus void nunchuck_init () {
Wire.begin (); // csatlakozzon az i2c buszhoz, mint mester
Wire.beginTransmission (0x52); // továbbítás a 0x52 eszközre
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x40); // memóriacímet küld
Wire.write ((uint8_t) 0x00); // küldött nullát küld.
#else
Wire.send ((uint8_t) 0x40); // memóriacímet küld
Wire.send ((uint8_t) 0x00); // küldött nullát küld.
#endif
Wire.endTransmission (); // állítsa le az átvitelt
}
// Küldjön adatkérést a nunchuck-nak
// "send_zero ()" volt
statikus érvénytelen nunchuck_send_request () {
Wire.beginTransmission (0x52); // továbbítás a 0x52 eszközre
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x00); // egy bájtot küld
#else
Wire.send ((uint8_t) 0x00); // egy bájtot küld
#endif
Wire.endTransmission (); // állítsa le az átvitelt
}
// Adatok kódolása a legtöbb wiimote illesztőprogram formázásához, kivéve
// csak akkor szükséges, ha a szokásos wiimote illesztőprogramokat használja
statikus char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
visszatérés x;
}
// Az adatok fogadása a nunchuck-tól,
// a sikeres olvasásnál 1-et ad vissza. hiba esetén 0-t ad vissza
statikus int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // adatokat kér a nunchuck-tól
míg (Wire.avable ()) {
// bájt fogadása egész számként
#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 (); // kérés küldése a következő adatok hasznos rakományára vonatkozóan
// Ha megkaptuk a 6 bájtot, akkor nyomtassuk ki őket
if (cnt> 5) {
visszatérés 1; // siker
}
visszatérés 0; // kudarc
}
// Nyomtassa ki a kapott bemeneti adatokat
// az accel adat 10 bit hosszú
// tehát 8 bitet olvasunk, akkor hozzá kell adnunk
// az utolsó 2 bitben. Ezért én
// szorozzuk meg őket 2 * 2-vel
statikus érvénytelen nunchuck_print_data () {
statikus 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_gomb = 0;
int c_gomb = 0;
// nunchuck_buf byte [5] tartalmaz z és c gombok bitjeit
// tartalmazza a legkevésbé jelentős biteket a gyorsulásmérő adataihoz is
// tehát ellenőriznünk kell minden egyes bájt outbuf-ot [5]
if ((nunchuck_buf [5]> 0) & 1)
z_gomb = 1;
if ((nunchuck_buf [5]>> 1) & 1)
c_gomb = 1;
if ((nunchuck_buf [5] & gt; 2) & 1)
accel_x_axis + = 1;
if ((nunchuck_buf [5]> 3) & 1)
accel_x_axis + = 2;
if ((nunchuck_buf [5]> 4) & 1)
accel_y_axis + = 1;
if ((nunchuck_buf [5]> 5) & 1)
accel_y_axis + = 2;
if ((nunchuck_buf [5]> 6) & 1)
accel_z_axis + = 1;
if ((nunchuck_buf [5]> 7) & 1)
accel_z_axis + = 2;
Soros nyomtatás (i, DEC);
Serial.print ("\ t");
Serial.print ("öröm:");
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 ("but:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // új sor
i ++;
}
// visszaadja a z gomb gomb állapotát: 1 = megnyomva, 0 = nem megnyomva
statikus int nunchuck_zbutton () {
visszatérés ((nunchuck_buf [5]> 0) & 1)? 0: 1; // voodoo
}
// visszaadja a z gomb gomb állapotát: 1 = megnyomva, 0 = nem megnyomva
statikus int nunchuck_cbutton () {
visszatérés ((nunchuck_buf [5]> 1) & 1)? 0: 1; // voodoo
}
// az x tengelyes joystick értékét adja vissza
statikus int nunchuck_joyx () {
visszatérés nunchuck_buf [0];
}
// az y tengelyes joystick értékét adja vissza
statikus int nunchuck_joyy () {
return nunchuck_buf [1];
}
// az x tengelyű gyorsulásmérő értékét adja vissza
statikus int nunchuck_accelx () {
visszatérés nunchuck_buf [2]; // FIXME: ez 2 bites adatot hagy ki
}
// az y tengely gyorsulásmérő értékét adja vissza
statikus int nunchuck_accely () {
return nunchuck_buf [3]; // FIXME: ez 2 bites adatot hagy ki
}
// a z tengelyű gyorsulásmérő értékét adja vissza
statikus int nunchuck_accelz () {
visszatérés nunchuck_buf [4]; // FIXME: ez 2 bites adatot hagy ki
}
int loop_cnt = 0;
bájt joyx, joyy, zbut, cbut, accx, accy, accz;
érvénytelen _print () {
Serial.print ("\ tX Joy:");
Serial.print (térkép (joyx, 15, 221, 0, 255));
Serial.print ("Joy:");
Serial.println (térkép (joy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
érvénytelen beállítás () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // küldje el az iniciálási kézfogást
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}
void loop () {
if (loop_cnt> 10) {// minden 100 ms után új adatokat kap
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) {
típus ();
zbut = 0;
}
egyéb {
if (joyx & gt; (joyx1 + 20)) {
int sebesség1 = térkép (joyx - joyx1, 0, 80, 40, 255);
sebesség1 = korlátozás (sebesség1, 0, 255);
analogWrite (6, 0);
analoWrite (9, 1. sebesség);
}
egyébként ha (joyx & lt; (joyx1 - 20)) {
int sebesség2 = térkép (joyx1 - joyx, 0, 90, 40, 255);
sebesség2 = korlátozás (sebesség2, 0, 255);
analogWrite (6, sebesség2);
analogWrite (9, 0);
}
egyéb {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (öröm> (joyy1 + 20)) {
int sebesség3 = térkép (joyy - joyy1, 0, 80, 40, 255);
sebesség3 = korlátozás (sebesség3, 0, 255);
analogWrite (3, 0);
analoWrite (5., 3. sebesség);
}
egyébként ha (joyy & lt; (joyy1 - 20)) {
int sebesség4 = térkép (joyy1 - joyy, 0, 90, 40, 255);
sebesség4 = korlátozás (sebesség4, 0, 255);
analogWrite (3, sebesség4);
analogWrite (5, 0);
}
egyéb {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
késleltetés (1);
}
érvénytelen típus () {
int rltime = 200;
// digitalWrite (6, 1); // származás
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// késleltetés (1000);
// H ===============
// digitalWrite (3, 0); // várjon
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// késleltetés (250);
// digitalWrite (3, 0); // fel
digitalWrite (5, 1);
késés (500);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (3, 1); // le
// digitalWrite (5, 0);
késleltetés (250);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
// digitalWrite (6, 0); // jobbra
digitalWrite (9, 1);
késés (rltime);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
// digitalWrite (3, 0); // fel
digitalWrite (5, 1);
késleltetés (250);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (3, 1); // le
// digitalWrite (5, 0);
késés (500);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
// digitalWrite (6, 0); // jobbra
digitalWrite (9, 1);
késés (rltime);
// I ==========================
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (3, 0); // fel
digitalWrite (5, 1);
késés (500);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (6, 0); // jobbra
digitalWrite (9, 1);
késleltetés (100);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (6, 1); // bal
digitalWrite (9, 0);
késés (rltime);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (6, 0); // jobbra
digitalWrite (9, 1);
késleltetés (100);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (3, 1); // le
digitalWrite (5, 0);
késés (500);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (6, 0); // jobbra
digitalWrite (9, 1);
késleltetés (100);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
digitalWrite (6, 1); // bal
digitalWrite (9, 0);
késés (rltime);
digitalWrite (3, 0); // várjon
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
késleltetés (250);
}
A bekapcsolás után a megfelelően összeállított eszköz azonnal elkezdi működni. A Nunchuck egy analóg joystick, így nemcsak az irányt, hanem a mozgás sebességét is vezérelheti. Arduino átveszi a PWM sebességszabályozást. Ha a tengelyek mentén az ellenkező irányba mozog, akkor a megfelelő motort meg kell fordítani. Ha a kurzort megközelíti a képernyő közepére és megnyomja a Z gombot, akkor a készülék automatikusan írja a HI szót.