Daugelis šį žaislą turėjo vaikystėje, mes valdėme jį dviem sukamomis rankenėlėmis. Net tada buvo galima prie jo pritvirtinti du nuolatinės srovės variklius su krumpliaračiais ir valdyti juos iš mygtukų. Ir dabar tam tapo įmanoma pritaikyti vairasvirtes. Ką padarė „Instructable“ autorius slapyvardžiu millerman4487.
Bet reikėjo atspausdinti dvi identiškas dalis - tai yra adapteriai, skirti krumpliaračiams sujungti su „Magic Screen“ rankenomis. Tai atrodo kaip bet kuris iš adapterių:
Taigi jungiasi prie greičių dėžės (galbūt tam reikės šiek tiek pašildyti adapterį plaukų džiovintuvu):
STL byla.
Joje yra tik vienas nesuprantamas komponentas - L293D lustas. Jame yra du vadinamieji H tiltai, iš kurių kiekvienas gali pakeisti variklį, prijungtą prie jo. Žemiau lentos parodyta, kurios išvados
Prijunkite, kuris iš „Wii Nunchuck“ vairasvirtės jungčių kaiščių yra. Žemiau pateiktą eskizą galima perrašyti, kad būtų galima dirbti su bet kokio tipo valdymo svirtimis, dabartine forma to reikės.
# įtraukti
#if (ARDUINO> = 100)
# įtraukti
#else
# įtraukti
// # apibrėžti „Wire.write“ (x) „Wire.send“ (x)
// # apibrėžti Wire.read () Wire.recept ()
#endif
statinis uint8_t nunchuck_buf [6]; // masyvas, skirtas laikyti nunchuck duomenis,
// Naudoja porto C (analoginio įėjimo) kaiščius kaip „Nunchuck“ galią ir žemę
statinė negaliojanti nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV („pwrpin“) | _BV (gndpin);
PORTC & = ~ _BV („gndpin“);
PORTC | = _BV (pwrpin);
vėlavimas (100); // laukti, kol reikalai stabilizuosis
}
// inicijuoti I2C sistemą, prisijungti prie I2C magistralės,
// ir pasakyk nunchukui, kad mes su juo kalbamės
static void nunchuck_init () {
Viela.beginas (); // Prisijunkite prie „i2c“ autobuso kaip pagrindinis
„Wire.beginTransmission“ (0x52); // perduoda į įrenginį 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x40); // siunčia atminties adresą
Wire.write ((uint8_t) 0x00); // siunčiama siunčiama nulis.
#else
Wire.send ((uint8_t) 0x40); // siunčia atminties adresą
Viela.send ((uint8_t) 0x00); // siunčiama siunčiama nulis.
#endif
Wire.endTransmission (); // sustabdyti siuntimą
}
// Nusiųskite duomenų užklausą į nunchuką
// buvo „send_zero ()“
static void nunchuck_send_request () {
„Wire.beginTransmission“ (0x52); // perduoda į įrenginį 0x52
#if (ARDUINO> = 100)
Wire.write ((uint8_t) 0x00); // siunčia vieną baitą
#else
Wire.send ((uint8_t) 0x00); // siunčia vieną baitą
#endif
Wire.endTransmission (); // sustabdyti siuntimą
}
// Užkoduokite duomenis, kad formatuotumėte daugiausiai tvarkyklių, išskyrus
// reikalingas tik tuo atveju, jei naudojate vieną iš įprastų „wiimote“ tvarkyklių
statinis char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
grįžti x;
}
// Gauti duomenis iš nunchuko,
// grąžina 1 sėkmingai perskaičius. grąžina 0 dėl gedimo
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // užklausti duomenis iš „nunchuck“
o (viela prieinama ()) {
// priimti baitą kaip sveiką skaičių
#if (ARDUINO> = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (viela.gauti ());
#endif
cnt ++;
}
nunchuck_send_request (); // siųsti užklausą dėl kito duomenų naudingumo
// Jei gavome 6 baitus, tada atspausdinkite juos
if (cnt> = 5) {
grįžti 1; // sėkmė
}
grįžti 0; // nesėkmė
}
// Atspausdinkite gautus įvesties duomenis
// greitėjimo duomenys yra 10 bitų
// taigi mes skaitome 8 bitus, tada mes turime pridėti
// per paskutinius 2 bitus. Štai kodėl aš
// padauginkite juos iš 2 * 2
statinė negaliojanti nunchuck_print_data () {
statinis 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;
// baitas nunchuck_buf [5] yra z ir c mygtukų bitai
// joje taip pat yra mažiausiai reikšmingų akselerometro duomenų bitų
// taigi mes turime patikrinti kiekvieną baitų išvesties bitą [5]
if ((nunchuck_buf [5] & gt; 0) & 1)
z_ mygtukas = 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;
Serijos spausdinimas (i, DEC);
„Serial.print“ („\ t“);
Serial.print („džiaugsmas:“);
Serial.print (joy_x_axis, DEC);
Serial.print („,“);
Serial.print (joy_y_axis, DEC);
„Serial.print“ („\ t“);
Serial.print („acc:“);
Serijos spausdinimas (accel_x_axis, DEC);
Serial.print („,“);
Serijos spausdinimas (accel_y_axis, DEC);
Serial.print („,“);
Serijos spausdinimas (accel_z_axis, DEC);
„Serial.print“ („\ t“);
Serial.print („bet:“);
Serijos spausdinimas (z_button, DEC);
Serial.print („,“);
Serijos spausdinimas (c_button, DEC);
„Serial.print“ („\ r \ n“); // nauja eilutė
i ++;
}
// grąžina z mygtuko būseną: 1 = paspaustas, 0 = nenuspaustas
statinis int nunchuck_zbutton () {
grįžti ((nunchuck_buf [5] & gt; 0) & 1)? 0-1 // vudu
}
// grąžina z mygtuko būseną: 1 = paspaustas, 0 = nenuspaustas
statinis int nunchuck_cbutton () {
grįžti ((nunchuck_buf [5] & gt; 1) & 1)? 0-1 // vudu
}
// grąžina x ašies kreiptuko vertę
static int nunchuck_joyx () {
grįžti nunchuck_buf [0];
}
// grąžina y ašies kreiptuko vertę
static int nunchuck_joyy () {
grįžti nunchuck_buf [1];
}
// grąžina x ašies akselerometro vertę
static int nunchuck_accelx () {
grįžti nunchuck_buf [2]; // FIXME: tai palieka 2 bitų duomenis
}
// grąžina y ašies akselerometro vertę
static int nunchuck_accely () {
grįžti nunchuck_buf [3]; // FIXME: tai palieka 2 bitų duomenis
}
// grąžina z ašies akselerometro vertę
static int nunchuck_accelz () {
grįžti nunchuck_buf [4]; // FIXME: tai palieka 2 bitų duomenis
}
int loop_cnt = 0;
baitas joyx, joyy, zbut, cbut, accx, accy, accz;
negalioja _print () {
Serial.print („\ tX Joy:“);
„Serial.print“ (žemėlapis („joyx“, 15, 221, 0, 255));
„Serial.print“ („Joy:“);
„Serial.println“ (žemėlapis (joy, 29, 229, 0, 255));
}
int džiax1 = 129; // 15 - 221
vidinis džiaugsmas = 124; // 29 - 229
negaliojanti sąranka () {
„Serial.begin“ (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // atsiųskite inicijavimo rankos paspaudimą
Serial.println („Wii Nunchuck Ready“);
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// tipas ();
}
tuščia kilpa () {
if (loop_cnt> 10) {// kas 100 ms gauna naujus duomenis
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) {
tipas ();
zbut = 0;
}
dar {
if (joyx & gt; (joyx1 + 20)) {
int greitis1 = žemėlapis (joyx - joyx1, 0, 80, 40, 255);
greitis1 = suvaržymas (greitis1, 0, 255);
analoWrite (6, 0);
„analogWrite“ (9, greitis1);
}
else if (joyx & lt; (joyx1 - 20)) {
int greitis2 = žemėlapis (joyx1 - joyx, 0, 90, 40, 255);
greitis2 = suvaržymas (greitis2, 0, 255);
analoWrite (6, greitis2);
analoWrite (9, 0);
}
dar {
analoWrite (6, 0);
analoWrite (9, 0);
}
if (džiaugsmas & gt; (joyy1 + 20)) {
int greitis3 = žemėlapis (joyy - joyy1, 0, 80, 40, 255);
greitis3 = suvaržymas (greitis3, 0, 255);
analoWrite (3, 0);
analoWrite (5, 3 greitis);
}
kitu atveju jei (joyy & lt; (joyy1 - 20)) {
int greitis4 = žemėlapis (joyy1 - joyy, 0, 90, 40, 255);
greitis4 = suvaržymas (greitis4, 0, 255);
analoWrite (3, greitis4);
analoWrite (5,0);
}
dar {
analoWrite (3, 0);
analoWrite (5,0);
}
}
vėlavimas (1);
}
negaliojantis tipas () {
int rltime = 200;
// „digitalWrite“ (6, 1); // kilmė
// „digitalWrite“ (9, 0);
// „digitalWrite“ (3, 1);
// „digitalWrite“ (5, 0);
// vėlavimas (1000);
// H ===============
// „digitalWrite“ (3, 0); // palaukite
// „digitalWrite“ (5, 0);
// „digitalWrite“ (6, 0);
// „digitalWrite“ (9, 0);
// vėlavimas (250);
// „digitalWrite“ (3, 0); // aukštyn
„digitalWrite“ (5, 1);
vėlavimas (500);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (3, 1); // žemyn
// „digitalWrite“ (5, 0);
vėlavimas (250);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
// „digitalWrite“ (6, 0); // dešinė
„digitalWrite“ (9, 1);
vėlavimas (rltime);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
// „digitalWrite“ (3, 0); // aukštyn
„digitalWrite“ (5, 1);
vėlavimas (250);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (3, 1); // žemyn
// „digitalWrite“ (5, 0);
vėlavimas (500);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
// „digitalWrite“ (6, 0); // dešinė
„digitalWrite“ (9, 1);
vėlavimas (rltime);
// Aš ==========================
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (3, 0); // aukštyn
„digitalWrite“ (5, 1);
vėlavimas (500);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (6, 0); // dešinė
„digitalWrite“ (9, 1);
vėlavimas (100);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (6, 1); // liko
„digitalWrite“ (9, 0);
vėlavimas (rltime);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (6, 0); // dešinė
„digitalWrite“ (9, 1);
vėlavimas (100);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (3, 1); // žemyn
„digitalWrite“ (5, 0);
vėlavimas (500);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (6, 0); // dešinė
„digitalWrite“ (9, 1);
vėlavimas (100);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
„digitalWrite“ (6, 1); // liko
„digitalWrite“ (9, 0);
vėlavimas (rltime);
„digitalWrite“ (3, 0); // palauk
„digitalWrite“ (5, 0);
„digitalWrite“ (6, 0);
„digitalWrite“ (9, 0);
vėlavimas (250);
}
Įjungus, teisingai surinktas įrenginys iškart pradeda veikti. „Nunchuck“ yra analoginis vairasvirtis, todėl jūs galite valdyti ne tik kryptį, bet ir judėjimo greitį. „Arduino“ perima PWM greičio kontrolę. Jei judėjimas išilgai bet kurios ašies vyksta priešinga kryptimi, atitinkamą variklį reikia pakeisti. Padėję žymeklį maždaug ekrano viduryje ir paspausdami mygtuką Z, galite priversti prietaisą automatiškai rašyti žodį HI.