Mulți aveau această jucărie în copilărie, am controlat-o cu două butoane rotative. Chiar și atunci, a fost posibil să atașați două motoare cu curent continuu la acestea și să le controlați de la butoane. Și acum pentru asta a devenit posibilă adaptarea joystick-urilor. Ceea ce a făcut autorul Instructables sub porecla millerman4487.
Însă trebuiau tipărite două părți identice - acestea sunt adaptoare pentru conectarea angrenajelor la mânerele Magic Screen. Arată ca oricare dintre adaptoare:
Și astfel se conectează la cutia de viteze (poate că acest lucru va necesita încălzirea ușor a adaptorului cu un uscător de păr)
Fișier STL.
Există o singură componentă de neînțeles - cipul L293D. Conține două așa-numite punți H, fiecare putând inversa motorul conectat la acesta. Sub tabla este arătat ce concluzii
Conectați care dintre pinii conectorului joystick Wii Nunchuck. Schița de mai jos poate fi rescrisă pentru a lucra cu orice alt tip de joystick, în forma sa actuală va fi necesară.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
# endif
static uint8_t nunchuck_buf [6]; // tablou pentru a stoca date nunchuck,
// Utilizează pinul port C (analogic în) ca putere și sol pentru Nunchuck
static void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
întârziere (100); // așteptați ca lucrurile să se stabilizeze
}
// inițializează sistemul I2C, alătură-te autobuzului I2C,
// și spuneți-i nunchuckului că vorbim
static void nunchuck_init () {
Sârmă.begin (); // alăturați autobuzul i2c ca maestru
Wire.beginTransmission (0x52); // transmite dispozitivului 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // trimite adresa de memorie
Wire.write ((uint8_t) 0x00); // trimite trimis un zero.
#else
Wire.send ((uint8_t) 0x40); // trimite adresa de memorie
Wire.send ((uint8_t) 0x00); // trimite trimis un zero.
# endif
Wire.endTransmission (); // opriți transmisia
}
// Trimiteți o cerere de date către nunchuck
// a fost "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // transmite dispozitivului 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // trimite un octet
#else
Wire.send ((uint8_t) 0x00); // trimite un octet
# endif
Wire.endTransmission (); // opriți transmisia
}
// Codificați datele pentru formatarea celor mai multe drivere wiimote, cu excepția
// este nevoie doar dacă utilizați unul dintre driverele wiimote obișnuite
static char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
returnare x;
}
// Primește date înapoi de la nunchuck,
// returnează 1 la citirea reușită. returnează 0 la eșec
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // solicitați date de la nunchuck
while (Wire.available ()) {
// primiți byte ca un număr întreg
#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 (); // trimiteți cererea pentru sarcina utilă a datelor următoare
// Dacă am primit cele 6 octeți, mergeți să le imprimați
if (cnt & gt; = 5) {
returnare 1; // succes
}
returnare 0; // eșec
}
// Tipăriți datele de intrare pe care le-am primit
// datele de accel au o lungime de 10 biți
// deci citim 8 biți, atunci trebuie să adăugăm
// pe ultimii 2 biți. De aceea eu
// înmulțiți-le cu 2 * 2
static void 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] conține biți pentru butoanele z și c
// conține, de asemenea, biții cei mai puțin importanți pentru datele de accelerometru
// deci trebuie să verificăm fiecare izbuc de octeți [5]
if ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_button = 1;
if ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_button = 1;
if ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
if ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
if ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("bucurie:");
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 ("dar:");
Serial.print (z_button, DEC);
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // linie nouă
i ++;
}
// returnează starea zbutton: 1 = apăsat, 0 = notpress
static int nunchuck_zbutton () {
returnare ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0: 1; // voodoo
}
// returnează starea zbutton: 1 = apăsat, 0 = notpress
static int nunchuck_cbutton () {
returnare ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0: 1; // voodoo
}
// returnează valoarea joystick-ului axei X
static int nunchuck_joyx () {
returnare nunchuck_buf [0];
}
// returnează valoarea joystick-ului axei y
static int nunchuck_joyy () {
returnare nunchuck_buf [1];
}
// returnează valoarea accelerometrului pe axa x
static int nunchuck_accelx () {
returna nunchuck_buf [2]; // FIXME: aceasta elimină 2 biți din date
}
// returnează valoarea accelerometrului pe axa y
static int nunchuck_accely () {
returna nunchuck_buf [3]; // FIXME: aceasta elimină 2 biți din date
}
// returnează valoarea accelerometrului pe axa z
static int nunchuck_accelz () {
returna nunchuck_buf [4]; // FIXME: aceasta elimină 2 biți din date
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (hartă (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (hartă (joyy, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
void setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // trimiteți strângerea de mână de inițiere
Serial.println ("Wii Nunchuck Ready");
pinMode (3, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// tip ();
}
void loop () {
if (loop_cnt & gt; 10) {// la fiecare 100 msecs obțin date noi
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_print ();
}
bucla_cnt ++;
if (zbut == 1) {
tip ();
zbut = 0;
}
altfel {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = hartă (joyx - joyx1, 0, 80, 40, 255);
speed1 = constrain (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, viteza 1);
}
else if (joyx & lt; (joyx1 - 20)) {
int speed2 = hartă (joyx1 - joyx, 0, 90, 40, 255);
speed2 = constrain (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
altfel {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = hartă (joyy - joyy1, 0, 80, 40, 255);
speed3 = constrain (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
else if (joyy & lt; (joyy1 - 20)) {
int speed4 = hartă (joyy1 - joyy, 0, 90, 40, 255);
speed4 = constrain (speed4, 0, 255);
analogWrite (3, speed4);
analogWrite (5, 0);
}
altfel {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
întârziere (1);
}
void type () {
int rltime = 200;
// digitalWrite (6, 1); // origine
// DigitalWrite (9, 0);
// DigitalWrite (3, 1);
// DigitalWrite (5, 0);
// întârziere (1000);
// H ===============
// digitalWrite (3, 0); // așteptați
// DigitalWrite (5, 0);
// DigitalWrite (6, 0);
// DigitalWrite (9, 0);
// întârziere (250);
// digitalWrite (3, 0); // up
digitalWrite (5, 1);
întârziere (500);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (3, 1); // jos
// DigitalWrite (5, 0);
întârziere (250);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
// digitalWrite (6, 0); // dreapta
digitalWrite (9, 1);
întârziere (rltime);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
// digitalWrite (3, 0); // up
digitalWrite (5, 1);
întârziere (250);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (3, 1); // jos
// DigitalWrite (5, 0);
întârziere (500);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
// digitalWrite (6, 0); // dreapta
digitalWrite (9, 1);
întârziere (rltime);
// I ==========================
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (3, 0); // up
digitalWrite (5, 1);
întârziere (500);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (6, 0); // dreapta
digitalWrite (9, 1);
întârziere (100);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (6, 1); // stânga
digitalWrite (9, 0);
întârziere (rltime);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (6, 0); // dreapta
digitalWrite (9, 1);
întârziere (100);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (3, 1); // jos
digitalWrite (5, 0);
întârziere (500);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (6, 0); // dreapta
digitalWrite (9, 1);
întârziere (100);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
digitalWrite (6, 1); // stânga
digitalWrite (9, 0);
întârziere (rltime);
digitalWrite (3, 0); // așteptați
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
întârziere (250);
}
După pornire, un dispozitiv montat corect începe să funcționeze imediat. Nunchuck este un stick analog, astfel încât să puteți controla nu numai direcția, ci și viteza de mișcare. Arduino preia controlul de viteză PWM. Dacă mișcarea pe oricare dintre axe are loc în direcția opusă, motorul corespunzător trebuie inversat. Prin plasarea cursorului aproximativ în mijlocul ecranului și prin apăsarea butonului Z, puteți face dispozitivul să scrie automat cuvântul HI.