Daudziem šī rotaļlieta bija bērnībā, mēs to vadījām ar divām rotējošām pogām. Arī tad tam bija iespējams piestiprināt divus līdzstrāvas motorus ar pārnesumiem un vadīt tos no pogām. Un tagad tam ir kļuvis iespējams pielāgot kursorsviras. Kas ir tas, ko Instructable autors darīja ar segvārdu millerman4487.
Bet vajadzēja izdrukāt divas identiskas detaļas - tie ir adapteri, lai pieslēgtu pārnesumus Magic Magic rokturiem. Tas izskatās kā jebkurš no adapteriem:
Un tā tas tiek savienots ar pārnesumkārbu (iespējams, tam būs nepieciešams nedaudz uzsildīt adapteri ar fēnu):
STL fails.
Tajā ir tikai viens nesaprotams komponents - mikroshēma L293D. Tas satur divus tā saucamos H tiltus, no kuriem katrs var mainīt ar to savienoto motoru. Zem dēļa ir parādīts, kuri secinājumi
Pievienojiet kursorsviras savienotāja Wii Nunchuck spraudītes. Zemāk redzamo skici var pārrakstīt, lai tā darbotos ar jebkura cita veida kursorsvirām, pašreizējā formā tā ir nepieciešama.
# iekļaut
#if (ARDUINO> = 100)
# iekļaut
#else
# iekļaut
// # definē Wire.write (x) Wire.send (x)
// # definēt Wire.read () Wire.recept ()
#endif
statiskā uint8_t nunchuck_buf [6]; // masīvs nunchuck datu glabāšanai,
// Izmanto porta C (analogās) tapas kā Nunchuck jaudu un zemējumu
statiskā tukšība nunchuck_setpowerpins () {
#definēt pwrpin PORTC3
#definēt gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
kavēšanās (100); // jāgaida, kamēr lietas stabilizēsies
}
// inicializēt I2C sistēmu, pievienoties I2C kopnei,
// un pasaki nunchuck, ko mēs ar to runājam
static void nunchuck_init () {
Wire.begin (); // pievienojieties i2c autobusam kā kapteinis
Wire.beginTransmission (0x52); // pārsūtīt uz ierīci 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x40); // nosūta atmiņas adresi
Wire.write ((uint8_t) 0x00); // nosūta nosūta nulli.
#else
Wire.send ((uint8_t) 0x40); // nosūta atmiņas adresi
Wire.send ((uint8_t) 0x00); // nosūta nosūta nulli.
#endif
Wire.endTransmission (); // pārtrauciet pārraidi
}
// Nosūtiet datu pieprasījumu nunchuckam
// bija "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // pārsūtīt uz ierīci 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x00); // nosūta vienu baitu
#else
Wire.send ((uint8_t) 0x00); // nosūta vienu baitu
#endif
Wire.endTransmission (); // pārtrauciet pārraidi
}
// Šifrējiet datus tādā formātā, kas visvairāk wiimote draiverus, izņemot
// nepieciešams tikai tad, ja izmantojat vienu no parastajiem wiimote draiveriem
statiskā char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
atgriešanās x;
}
// saņemt datus no nunchuck,
// atgriež 1 pēc veiksmīgas nolasīšanas. atdod 0 par kļūmi
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // pieprasīt datus no nunchuck
kamēr (vads.pieejams ()) {
// saņemt baitu kā veselu skaitli
#if (ARDUINO> = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (vads.saņemt ());
#endif
cnt ++;
}
nunchuck_send_request (); // nosūtīt nākamās datu kravas pieprasījumu
// Ja mēs saņēmām 6 baitus, drukājiet tos
if (cnt> = 5) {
atgriezties 1; // veiksme
}
atgriešanās 0; // neveiksme
}
// Izdrukājiet saņemtos ievades datus
// ātruma dati ir 10 bitu gari
// tāpēc mēs nolasām 8 bitus, tad mums jāpievieno
// pēdējos 2 bitos. Tāpēc es
// reiziniet tos ar 2 * 2
static void 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_button = 0;
// baits nunchuck_buf [5] satur bitus z un c pogām
// tajā ir arī vismazāk nozīmīgie biti akselerometra datiem
// tāpēc mums ir jāpārbauda katrs baitu izlaišanas bits [5]
if ((nunchuck_buf [5] & gt; 0) & 1)
z_button = 1;
if ((nunchuck_buf [5] & gt; 1) & 1)
c_button = 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;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("prieks:");
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"); // newline
i ++;
}
// atgriež pogas stāvokli: 1 = nospiests, 0 = nav nospiests
statiskā int nunchuck_zbutton () {
atgriešanās ((nunchuck_buf [5] & gt; 0) & 1)? 0-1 // voodoo
}
// atgriež pogas stāvokli: 1 = nospiests, 0 = nav nospiests
statiskā int nunchuck_cbutton () {
atgriešanās ((nunchuck_buf [5] & gt; 1) & 1)? 0-1 // voodoo
}
// atgriež x ass kursorsviras vērtību
static int nunchuck_joyx () {
atgriezties nunchuck_buf [0];
}
// atgriež y ass kursorsviras vērtību
statiskā int nunchuck_joyy () {
atgriezt nunchuck_buf [1];
}
// atgriež x ass akselerometra vērtību
static int nunchuck_accelx () {
atgriezt nunchuck_buf [2]; // FIXME: tādējādi tiek izlaisti 2 bitu dati
}
// atgriež y ass akselerometra vērtību
static int nunchuck_accely () {
atgriezt nunchuck_buf [3]; // FIXME: tādējādi tiek izlaisti 2 bitu dati
}
// atgriež z ass akselerometra vērtību
static int nunchuck_accelz () {
atgriezties nunchuck_buf [4]; // FIXME: tādējādi tiek izlaisti 2 bitu dati
}
int cilpas_cnt = 0;
baits joyx, joyy, zbut, cbut, accx, accy, accz;
anulēts _print () {
Serial.print ("\ xX Prieks:");
Serial.print (karte (joyx, 15, 221, 0, 255));
Serial.print ("\ Joy:");
Serial.println (karte (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29. - 229. lpp
Nederīga iestatīšana () {
Sērijas.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // nosūtiet iniciācijas rokasspiedienu
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// tips ();
}
tukšs cilpa () {
if (cilpas_cnt> 10) {// ik pēc 100 sekundēm iegūst jaunus datus
cilpa_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29. - 229. lpp
_print ();
}
cilpa_cnt ++;
if (zbut == 1) {
tips ();
zbut = 0;
}
cits {
if (joyx & gt; (joyx1 + 20)) {
int ātrums1 = karte (joyx - joyx1, 0, 80, 40, 255);
ātrums1 = ierobežojums (ātrums1, 0, 255);
analogWrite (6, 0);
analogWrite (9, ātrums1);
}
citādi, ja (joyx & lt; (joyx1 - 20)) {
int ātrums2 = karte (joyx1 - joyx, 0, 90, 40, 255);
ātrums2 = ierobežojums (ātrums2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
cits {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int ātrums3 = karte (joyy - joyy1, 0, 80, 40, 255);
ātrums3 = ierobežojums (ātrums3, 0, 255);
analogWrite (3, 0);
analogWrite (5, ātrums3);
}
citādi, ja (joyy & lt; (joyy1 - 20)) {
int ātrums4 = karte (joyy1 - joyy, 0, 90, 40, 255);
ātrums4 = ierobežojums (ātrums4, 0, 255);
analogWrite (3, ātrums4);
analogWrite (5, 0);
}
cits {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
kavēšanās (1);
}
tukšs tips () {
int rltime = 200;
// digitalWrite (6, 1); // izcelsme
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// kavēšanās (1000);
// H ===============
// digitalWrite (3, 0); // pagaidiet
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// kavēšanās (250);
// digitalWrite (3, 0); // uz augšu
digitalWrite (5, 1);
kavēšanās (500);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (3, 1); // uz leju
// digitalWrite (5, 0);
kavēšanās (250);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
// digitalWrite (6, 0); // pa labi
digitalWrite (9, 1);
kavēšanās (rltime);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
// digitalWrite (3, 0); // uz augšu
digitalWrite (5, 1);
kavēšanās (250);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (3, 1); // uz leju
// digitalWrite (5, 0);
kavēšanās (500);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
// digitalWrite (6, 0); // pa labi
digitalWrite (9, 1);
kavēšanās (rltime);
// Es ==========================
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (3, 0); // uz augšu
digitalWrite (5, 1);
kavēšanās (500);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (6, 0); // pa labi
digitalWrite (9, 1);
kavēšanās (100);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (6, 1); // pa kreisi
digitalWrite (9, 0);
kavēšanās (rltime);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (6, 0); // pa labi
digitalWrite (9, 1);
kavēšanās (100);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (3, 1); // uz leju
digitalWrite (5, 0);
kavēšanās (500);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (6, 0); // pa labi
digitalWrite (9, 1);
kavēšanās (100);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
digitalWrite (6, 1); // pa kreisi
digitalWrite (9, 0);
kavēšanās (rltime);
digitalWrite (3, 0); // pagaidiet
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kavēšanās (250);
}
Pēc ieslēgšanas pareizi samontēta ierīce nekavējoties sāk darboties. Nunchuck ir analogā kursorsvira, tāpēc jūs varat kontrolēt ne tikai virzienu, bet arī kustības ātrumu. Arduino pārņem PWM ātruma kontroli. Ja kustība pa kādu no asīm notiek pretējā virzienā, attiecīgais motors jāapgriež. Novietojot kursoru aptuveni ekrāna vidū un nospiežot taustiņu Z, varat likt ierīcei automātiski uzrakstīt vārdu HI.