Ramai yang mainan ini pada zaman kanak-kanak, kami mengawalnya dengan dua tombol berputar. Walau bagaimanapun, adalah mungkin untuk memasang dua motor DC dengan roda gigi dan mengawalnya dari butang. Dan sekarang untuk ini ia telah menjadi mungkin untuk menyesuaikan joysticks. Yang mana pengarang Instructables lakukan di bawah nickerman4487 nickname.
Tetapi dua bahagian yang sama perlu dicetak - ini adalah penyesuai untuk menyambung gear ke pemegang Skrin Magic. Ia kelihatan seperti mana-mana penyesuai:
Dan ia menyambung kepada kotak gear (mungkin ini memerlukan sedikit pemanasan penyesuai dengan pengering rambut):
Fail STL.
Hanya ada satu komponen yang tidak difahami di dalamnya - cip L293D. Ia mengandungi dua kononnya H-jambatan, masing-masing yang boleh menterbalikkan motor yang disambungkan kepadanya. Di bawah papan, ia menunjukkan kesimpulan yang mana
Sambungkan mana antara penyambung Wii Nunchuck joystick. Sketsa di bawah ini boleh ditulis semula untuk bekerja dengan mana-mana jenis joysticks yang lain, dalam bentuk semasa ia diperlukan.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # menentukan Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
statik uint8_t nunchuck_buf [6]; / / array untuk menyimpan data nunchuck,
// Menggunakan port C (analog dalam) pin sebagai kuasa & tanah untuk Nunchuck
statik void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
kelewatan (100); / tunggu perkara stabil
}
// memulakan sistem I2C, menyertai bas I2C,
// dan beritahu nunchuck kita bercakap dengannya
statik void nunchuck_init () {
Wire.begin (); // gabung i2c bus sebagai tuan
Wire.beginTransmission (0x52); // transmit to device 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // menghantar alamat memori
Wire.write ((uint8_t) 0x00); // dihantar menghantar sifar.
#else
Wire.send ((uint8_t) 0x40); // menghantar alamat memori
Wire.send ((uint8_t) 0x00); // dihantar menghantar sifar.
#endif
Wire.endTransmission (); // stop transmitting
}
/ / Hantar permintaan untuk data kepada nunchuck
// adalah "send_zero ()"
statik void nunchuck_send_request () {
Wire.beginTransmission (0x52); // transmit to device 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // menghantar satu byte
#else
Wire.send ((uint8_t) 0x00); // menghantar satu byte
#endif
Wire.endTransmission (); // stop transmitting
}
/ / Kod encode untuk memformat yang paling pemacu wiimote kecuali
// hanya diperlukan jika anda menggunakan salah satu pemandu wiimote biasa
stat statik nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
kembali x;
}
/ / Menerima data kembali dari nunchuck,
// pulih 1 pada keberhasilan membaca. mengembalikan 0 kegagalan
int stat nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // permintaan data daripada nunchuck
sementara (Wire.available ()) {
/ / terima byte sebagai integer
#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 (); // hantarkan permintaan untuk muatan data seterusnya
// Jika kami menerima 6 bait, kemudian pergi mencetaknya
jika (cnt & gt; = 5) {
kembali 1; // kejayaan
}
kembali 0; // kegagalan
}
/ / Cetak data input yang telah kami terima
// data akut adalah 10 bit panjang
// jadi kita baca 8 bit, maka kita perlu tambah
// pada 2 bit terakhir. Itulah sebabnya saya
/ pulihkan mereka dengan 2 * 2
statik void nunchuck_print_data () {
statik 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] mengandungi bit untuk butang z dan c
// ia juga mengandungi bit yang paling ketara untuk data pecutan
// jadi kita perlu menyemak setiap bit outbuf byte [5]
jika ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_button = 1;
jika ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_button = 1;
jika ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
jika ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
jika ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
jika ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
jika ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
jika ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("kegembiraan:");
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 ++;
}
// mengembalikan keadaan zbutton: 1 = ditekan, 0 = ditekan
int stat nunchuck_zbutton () {
kembali ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0-1 // voodoo
}
// mengembalikan keadaan zbutton: 1 = ditekan, 0 = ditekan
int stat nunchuck_cbutton () {
kembali ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0-1 // voodoo
}
/ pulangkan nilai paksi bedah x-axis
int statik nunchuck_joyx () {
kembali nunchuck_buf [0];
}
/ pulangkan nilai paksi bedah y-paksi
int stat nunchuck_joyy () {
kembali nunchuck_buf [1];
}
/ pulangkan nilai pecutan x paksi
int statik nunchuck_accelx () {
kembali nunchuck_buf [2]; / / FIXME: ini meninggalkan 2-bit data
}
/ pulangkan nilai pecutan y-axis
int statik nunchuck_accely () {
kembali nunchuck_buf [3]; / / FIXME: ini meninggalkan 2-bit data
}
/ pulangkan nilai pecutan z-paksi
int stat nunchuck_accelz () {
kembali nunchuck_buf [4]; / / FIXME: ini meninggalkan 2-bit data
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (map (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (peta (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
void setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // hantarkan jabat tangan initilisasi
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}
kekosongan gelung () {
jika (loop_cnt & gt; 10) {// setiap 100 msecs mendapatkan data baru
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
jika (zbut == 1) {
jenis ();
zbut = 0;
}
lain {
jika (joyx & gt; (joyx1 + 20)) {
int speed1 = peta (joyx - joyx1, 0, 80, 40, 255);
speed1 = menghalang (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, speed1);
}
lain jika (joyx & lt; (joyx1 - 20)) {
int speed2 = peta (joyx1 - joyx, 0, 90, 40, 255);
speed2 = menghalang (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
lain {
analogWrite (6, 0);
analogWrite (9, 0);
}
jika (joyy & gt; (joyy1 + 20)) {
int speed3 = peta (joyy - joyy1, 0, 80, 40, 255);
speed3 = constrain (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
lain jika (joyy & lt; (joyy1 - 20)) {
int speed4 = peta (joyy1 - joyy, 0, 90, 40, 255);
speed4 = menghalang (speed4, 0, 255);
analogWrite (3, speed4);
analogWrite (5, 0);
}
lain {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
kelewatan (1);
}
kekosongan jenis () {
int rltime = 200;
// digitalWrite (6, 1); // asal
/ / digitalWrite (9, 0);
// // DigitalWrite (3, 1);
/ / digitalWrite (5, 0);
/ // delay (1000);
// H ===============
// digitalWrite (3, 0); // tunggu
/ / digitalWrite (5, 0);
/ / digitalWrite (6, 0);
/ / digitalWrite (9, 0);
/ / kelewatan (250);
/ / digitalWrite (3, 0); // up
digitalWrite (5, 1);
kelewatan (500);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (3, 1); // ke bawah
/ / digitalWrite (5, 0);
kelewatan (250);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
/ / digitalWrite (6, 0); / / kanan
digitalWrite (9, 1);
kelewatan (rltime);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
/ / digitalWrite (3, 0); // up
digitalWrite (5, 1);
kelewatan (250);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (3, 1); // ke bawah
/ / digitalWrite (5, 0);
kelewatan (500);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
/ / digitalWrite (6, 0); / / kanan
digitalWrite (9, 1);
kelewatan (rltime);
// Saya ==========================
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (3, 0); // up
digitalWrite (5, 1);
kelewatan (500);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (6, 0); // betul
digitalWrite (9, 1);
kelewatan (100);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (6, 1); // kiri
digitalWrite (9, 0);
kelewatan (rltime);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (6, 0); // betul
digitalWrite (9, 1);
kelewatan (100);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (3, 1); // ke bawah
digitalWrite (5, 0);
kelewatan (500);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (6, 0); // betul
digitalWrite (9, 1);
kelewatan (100);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
digitalWrite (6, 1); // kiri
digitalWrite (9, 0);
kelewatan (rltime);
digitalWrite (3, 0); // tunggu
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
kelewatan (250);
}
Selepas beralih, peranti dipasang dengan betul akan mula berfungsi dengan serta-merta. Nunchuck adalah kayu bedik analog, jadi anda boleh mengawal bukan sahaja arah, tetapi juga kelajuan pergerakan. Arduino mengambil alih kawalan laju PWM. Sekiranya pergerakan di sepanjang mana-mana paksi berlaku dalam arah yang bertentangan, motor sepadan mesti dibalikkan. Dengan meletakkan kursor kira-kira di tengah-tengah skrin dan menekan butang Z, anda boleh membuat peranti tersebut secara automatik menulis perkataan HI.