Marami sa mga ito ang laruan sa pagkabata; kinontrol namin ito ng dalawang rotary knobs. Kahit na pagkatapos, posible na maglakip ng dalawang DC motor na may mga gears dito at kontrolin ang mga ito mula sa mga pindutan. At ngayon para dito naging posible upang iakma ang mga joystick. Alin ang ginawa ng may-akda ng Mga Tagagamit sa ilalim ng palayaw millerman4487.
Ngunit ang dalawang magkaparehong bahagi ay kailangang mai-print - ito ang mga adaptor para sa pagkonekta ng mga gears sa mga hawakan ng Magic Screen. Mukhang alinman sa mga adapter:
At sa gayon ay kumokonekta ito sa gearbox (marahil ay kakailanganin nito ang bahagyang pagpainit ng adapter na may isang hairdryer):
File ng STL.
Mayroon lamang isang hindi maintindihan na sangkap dito - ang L293D chip. Naglalaman ito ng dalawang tinatawag na H-tulay, na bawat isa ay maaaring baligtarin ang motor na konektado dito. Sa ibaba ng board ay ipinapakita kung aling mga konklusyon
Ikonekta kung alin sa mga pin ng konektor ng Wii Nunchuck na joystick. Ang sketch sa ibaba ay maaaring isulat muli upang gumana sa anumang iba pang mga uri ng mga joystick, sa kasalukuyang form na ito ay kinakailangan.
#nagsama
#if (ARDUINO & gt; = 100)
#nagsama
#else
#nagsama
// # tukuyin ang Wire.write (x) Wire.send (x)
// # tukuyin ang Wire.read () Wire.receive ()
#endif
static na uint8_t nunchuck_buf [6]; // array upang mag-imbak ng data ng nunchuck,
// Gumagamit ng port C (analog in) pin bilang kapangyarihan at lupa para sa Nunchuck
static na walang bisa nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
pagkaantala (100); // maghintay para sa mga bagay na magpapatatag
}
// pasiyahin ang I2C system, sumali sa I2C bus,
// at sabihin sa nunchuck na pinag-uusapan natin ito
static na walang bisa nunchuck_init () {
Wire.begin (); // sumali sa i2c bus bilang master
Wire.beginTransmission (0x52); // ihatid sa aparato 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // nagpapadala ng memorya ng memorya
Wire.write ((uint8_t) 0x00); // nagpapadala ng isang zero.
#else
Wire.send ((uint8_t) 0x40); // nagpapadala ng memorya ng memorya
Wire.send ((uint8_t) 0x00); // nagpapadala ng isang zero.
#endif
Wire.endTransmission (); // itigil ang pagpapadala
}
// Magpadala ng isang kahilingan para sa data sa nunchuck
// ay "send_zero ()"
static na walang bisa nunchuck_send_request () {
Wire.beginTransmission (0x52); // ihatid sa aparato 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // nagpapadala ng isang bait
#else
Wire.send ((uint8_t) 0x00); // nagpapadala ng isang bait
#endif
Wire.endTransmission (); // itigil ang pagpapadala
}
// I-encode ang data upang ma-format ang karamihan sa mga driver ng wiimote maliban
// kinakailangan lamang kung gumagamit ka ng isa sa mga regular na driver ng wiimote
static char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
bumalik x;
}
// Tumanggap ng data pabalik mula sa nunchuck,
// nagbalik 1 sa matagumpay na pagbasa. babalik 0 sa pagkabigo
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // kahilingan ng data mula sa nunchuck
habang (Wire.available ()) {
// makatanggap ng bait bilang isang 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 (); // magpadala ng kahilingan para sa susunod na data payload
// Kung natanggap namin ang 6 byte, pagkatapos ay i-print ang mga ito
kung (cnt & gt; = 5) {
bumalik 1; // tagumpay
}
bumalik 0; // kabiguan
}
// I-print ang data ng input na natanggap namin
Ang // accel data ay 10 bits ang haba
// kaya nabasa namin ang 8 bits, pagkatapos ay kailangan nating magdagdag
// sa huling 2 bits. Iyon ang dahilan kung bakit ako
// iparami ang mga ito sa pamamagitan ng 2 * 2
static na walang bisa nunchuck_print_data () {
static 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] naglalaman ng mga bits para sa mga pindutan ng z at c
// naglalaman din ito ng hindi bababa sa makabuluhang mga bits para sa data ng accelerometer
// kaya kailangan nating suriin ang bawat piraso ng byte outbuf [5]
kung ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_button = 1;
kung ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_button = 1;
kung ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
kung ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
kung ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
kung ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
kung ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
kung ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("galak:");
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 ("ngunit:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // newline
ako ++;
}
// ibabalik ang estado ng zbutton: 1 = pinindot, 0 = notpressed
static int nunchuck_zbutton () {
bumalik ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0-1 // voodoo
}
// ibabalik ang estado ng zbutton: 1 = pinindot, 0 = notpressed
static int nunchuck_cbutton () {
bumalik ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0-1 // voodoo
}
// ibinalik ang halaga ng x-axis joystick
static int nunchuck_joyx () {
bumalik nunchuck_buf [0];
}
// ibinalik ang halaga ng y-axis joystick
static int nunchuck_joyy () {
bumalik nunchuck_buf [1];
}
// ibabalik ang halaga ng x-axis accelerometer
static int nunchuck_accelx () {
bumalik nunchuck_buf [2]; // FIXME: umalis ito ng 2-bits ng data
}
// ibabalik ang halaga ng y-axis accelerometer
static int nunchuck_accely () {
bumalik nunchuck_buf [3]; // FIXME: umalis ito ng 2-bits ng data
}
// ibinabalik ang halaga ng z-axis accelerometer
static int nunchuck_accelz () {
bumalik nunchuck_buf [4]; // FIXME: umalis ito ng 2-bits ng data
}
int loop_cnt = 0;
byte joyx, masaya, zbut, cbut, accx, accy, accz;
walang bisa _print () {
Serial.print ("\ tX Joy:");
Serial.print (mapa (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (mapa (masayang, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
walang pag-setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // ipadala ang handsil ng initilization
Serial.println ("Wii Nunchuck Handa");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}
walang bisa na loop () {
kung (loop_cnt & gt; 10) {// bawat 100 msecs makakuha ng bagong data
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
masayang = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
kung (zbut == 1) {
uri ();
zbut = 0;
}
iba pa {
kung (joyx & gt; (joyx1 + 20)) {
int speed1 = mapa (joyx - joyx1, 0, 80, 40, 255);
bilis1 = pilitin (bilis1, 0, 255);
analogWrite (6, 0);
analogWrite (9, bilis1);
}
kung hindi man (joyx & lt; (joyx1 - 20)) {
int speed2 = mapa (joyx1 - joyx, 0, 90, 40, 255);
bilis2 = pilitin (bilis2, 0, 255);
analogWrite (6, bilis2);
analogWrite (9, 0);
}
iba pa {
analogWrite (6, 0);
analogWrite (9, 0);
}
kung (masayang & gt; (joyy1 + 20)) {
int speed3 = mapa (masayang - joyy1, 0, 80, 40, 255);
bilis3 = pilitin (bilis3, 0, 255);
analogWrite (3, 0);
analogWrite (5, bilis3);
}
kung hindi kung (masayang & lt; (joyy1 - 20)) {
int speed4 = mapa (joyy1 - masayang, 0, 90, 40, 255);
bilis4 = pilitin (bilis4, 0, 255);
analogWrite (3, bilis4);
analogWrite (5, 0);
}
iba pa {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
pagkaantala (1);
}
walang laman na uri () {
int rltime = 200;
// digitalWrite (6, 1); // nagmula
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// pagkaantala (1000);
// H ===============
// digitalWrite (3, 0); // wait
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// pagkaantala (250);
// digitalWrite (3, 0); // up
digitalWrite (5, 1);
pagkaantala (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (3, 1); // pababa
// digitalWrite (5, 0);
pagkaantala (250);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
// digitalWrite (6, 0); // kanan
digitalWrite (9, 1);
pagkaantala (rltime);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
// digitalWrite (3, 0); // up
digitalWrite (5, 1);
pagkaantala (250);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (3, 1); // pababa
// digitalWrite (5, 0);
pagkaantala (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
// digitalWrite (6, 0); // kanan
digitalWrite (9, 1);
pagkaantala (rltime);
// I ==========================
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (3, 0); // up
digitalWrite (5, 1);
pagkaantala (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (6, 0); // kanan
digitalWrite (9, 1);
pagkaantala (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (6, 1); // kaliwa
digitalWrite (9, 0);
pagkaantala (rltime);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (6, 0); // kanan
digitalWrite (9, 1);
pagkaantala (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (3, 1); // pababa
digitalWrite (5, 0);
pagkaantala (500);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (6, 0); // kanan
digitalWrite (9, 1);
pagkaantala (100);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
digitalWrite (6, 1); // kaliwa
digitalWrite (9, 0);
pagkaantala (rltime);
digitalWrite (3, 0); // wait
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
pagkaantala (250);
}
Matapos ang pag-on, ang isang tama na aparato na binuo na ay nagsisimulang gumana kaagad. Ang Nunchuck ay isang analog na joystick, kaya maaari mong kontrolin hindi lamang ang direksyon, kundi pati na rin ang bilis ng paggalaw. Kinukuha ng Arduino ang kontrol ng bilis ng PWM. Kung ang paggalaw kasama ang alinman sa mga axes ay nangyayari sa kabaligtaran na direksyon, ang katumbas na motor ay dapat baligtad. Sa pamamagitan ng paglalagay ng cursor ng humigit-kumulang sa gitna ng screen at pagpindot sa pindutan ng Z, maaari mong awtomatikong isulat ang aparato sa salitang HI.