Arduino kako spojiti joystick na servo stroj. Arduino joystick - spajanje i skica. Spajanje joysticka na Arduino UNO

Postoje analogni joystick moduli za Arduino ploče. U pravilu imaju os X, Y i gumb - os Z omogućuje glatko i točnije praćenje stupnja odstupanja od nulte točke. Osim što je praktičniji od gumba, ovo vam omogućuje implementaciju naprednijih sučelja. Na primjer, kada mijenjate vrijednost u izborniku, možete napisati program na takav način da što je više os joysticka otklonjena, to se vrijednost varijable brže mijenja. Na primjer, trebamo promijeniti vrijednost od 0 do 2000 u koracima od 1. Zamislite koliko puta biste trebali pritisnuti gumb ili napisati poseban algoritam, recimo, ako pritisak traje dulje od 3 sekunde, dodajte i promijenite korak za 10 ili 100. A kada koristite joystick, ovo se može učiniti puno lakše implementirati.

Prosječna cijena za takve module varira oko 1-2 USD po modulu (s besplatnom dostavom u Rusiju). Potražite module u trgovini AliExpress

Sami moduli izgledaju otprilike ovako:

Neka vas ne plaši broj pinova, ovo je učinjeno radi svestranosti i jednostavnosti povezivanja. Spojeni su pinovi Vcc i GND između sve tri skupine pinova. Da. Za spajanje potrebno vam je 5 žica: X os, Y os, gumb Z, V cc napajanje i zajednički GND. Joystickovi su pasivni moduli i ne troše nikakvu energiju iz Arduino ploče. Napajanje V cc potrebno je samo za otpornike za povlačenje. Postoje moduli bez pull-up otpornika, u kojem slučaju je potrebno povući spojni pin gumba na +V cc kroz otpornik od 1-10 kOhm.

Dijagram povezivanja na Arduino:

U programu je rad s joystickom također vrlo jednostavan:

#define axis_X 0 // X os je povezana s analognim 0 #define axis_Y 1 // Y os je povezana s analognim 1 #define axis_Z 2 // Z os (joystick gumb) je spojena na digitalni 2 int value_X, value_Y, value_Z = 0; // Varijable za pohranjivanje vrijednosti osi void setup() ( pinMode(axis_Z, INPUT); // Postavi kao ulaz Serial.begin(9600); ) void loop() ( value_X = analogRead(axis_X); // Pročitajte vrijednost analogne osi X Serial.print("X:"); // Izlaz vrijednosti u serijski monitor value_Y = analogRead(axis_Y); // Čitanje analogne vrijednosti osi Y Serial. print(" | Y:" ); Serial.print(value_Y, DEC); // Prikaz vrijednosti u serijskom monitoru value_Z = digitalRead(axis_Z); // Čitanje digitalne vrijednosti osi Z (gumb) value_Z = value_Z ^ 1; // Invertiraj vrijednost Serial.print(" | Z: "); Serial.println(value_Z, DEC); // Izlaz vrijednosti u serijski monitor delay(250);

Kao što možete vidjeti gore, na početku definiramo ulazne pinove za osi (define), a zatim u glavnoj petlji čitamo vrijednosti s pinova i šaljemo ih u serijski monitor. I vidimo sljedeću sliku:

Kao što vidite, sve je vrlo jednostavno. I na kraju, napisat ćemo mali program čija će svrha biti mijenjanje vrijednosti varijable, ovisno o otklonu joysticka duž Y osi od nulte točke. A kada pritisnete gumb joysticka, varijabla će se resetirati.

#define axis_Y 1 // Y os je spojena na Analog 1 #define axis_Z 2 // Z os (joystick gumb) je spojena na Digital 2 int value, value_Y, value_Z = 0; // Varijable za pohranjivanje vrijednosti osi void setup() ( pinMode(axis_Z, INPUT); // Postavi kao ulaz Serial.begin(9600); ) void loop() ( value_Y = analogRead(axis_Y); // Pročitajte vrijednost analogne osi Y if(vrijednost_Y >= 0 && vrijednost_Y< 100) value = value - 10; if(value_Y >100 && vrijednost_Y< 300) value = value - 5; if(value_Y >300 && vrijednost_Y< 520) value = value - 1; if(value_Y >535 && vrijednost_Y< 700) value = value + 1; if(value_Y >700 && vrijednost_Y< 900) value = value + 5; if(value_Y >900) vrijednost = vrijednost + 10;


vrijednost_Z = digitalRead(os_Z); // Čitanje digitalne vrijednosti Z osi (gumb) if(value_Z == 0) value = 0; // Ponovno postavi vrijednost Serial.println(value, DEC); // Izlaz vrijednosti u Serial Monitor delay(500); // Kašnjenje )

Postupak domaće montaže:
Prvi korak. Spajanje servomotora


Proces sastavljanja domaćeg proizvoda započinje spajanjem servomotora. Za sastavljanje preliminarnog izgleda koristi se tiskana ploča. Tada možete napraviti zaseban štit. Na slici se točno vidi kako je sve povezano.
Crveni kabel je napajanje, spaja se na 5V pin na Arduino kontroleru.
Žuti kabel desnog i lijevog servomotora mora biti spojen na pin 11. Na nekim modelima može biti bijela.
Sličan žuti Up & Down kabel mora biti spojen na pin 4. Također može biti bijele boje na nekim modelima motora.
Važno je zapamtiti da signalni konektori koji upravljaju motorom dolaze iz PWM izlaza.

Drugi korak. Spajanje joysticka

Na slici možete vidjeti kako je joystick povezan. U početku se shema može činiti prilično kompliciranom, ali zapravo ovdje nema ništa komplicirano. Kao i kod motora, za spajanje se koristi strujna ploča.


1. Na modulu joysticka možete pronaći U/R+ i L/R+ izlaze. Napajanje se spaja preko ovih izlaza. U skladu s tim, ovdje morate primijeniti napon od +5 V s odgovarajućeg pina na Arduinu.

2. Joystick također ima dva konektora koji se nazivaju L/R i dva U/D konektora. Potrebno ih je spojiti na analogne izlaze A3 i A4.

3. Pa, u zaključku, masu na joysticku treba spojiti s masom na Arduinu.

Nakon montaže potrebno je ponovno provjeriti vezu. Pogreške u povezivanju uzrokuju probleme u većini slučajeva. Ovo je osobito istinito kada se koristi tiskana ploča i na njoj ima mnogo priključaka.

Treći korak. Skica za Arduino
Kod je vrlo jednostavan i sadrži detaljne komentare. Gornji kod samo treba kopirati u Arduino IDE. Nakon što se kod učita, motori se ne bi trebali pomicati. Trebali bi se početi kretati tek kada pritisnete gumb na joysticku.


Problemi koji se mogu pojaviti i načini njihovog rješavanja
1. Ako se motori ne uključe, trebate ponovno provjeriti vezu. Izlazi tipa PWM koriste se za spajanje motora, a analogni izlazi za spajanje joysticka.

2. Dešava se da odmah nakon učitavanja koda motori počnu vibrirati. To se događa ako neispravno spojite pinove U/D+ L/R+. Veza se mora pažljivo provjeriti. Kako biste izbjegli spaljivanje ploče tijekom testiranja, mora se odspojiti s računala.

3. Ako je sve ponovno provjereno, ali motori i dalje ne žele raditi, možete pokušati ponovno spojiti joystick. Potrebno ju je ukloniti s tiskane ploče i potom instalirati natrag uz određenu snagu. Priključci joysticka trebaju dobro pristajati u matičnu ploču.

Ako je sve uspjelo, sada možete početi stvarati neke domaće proizvode pomoću joysticka. Na primjer, možete napraviti robota kojim se može upravljati pomoću joysticka i još mnogo toga.

Je modul za unos podataka. Uz njegovu pomoć možete upravljati robotima, manipulatorima, alatnim strojevima, razni modeli(automobili, tenkovi, zrakoplovi, helikopteri, kvadrokopteri, brodovi itd.), a također se koriste za izradu igraćih konzola, odabir stavki izbornika na displejima i indikatorima, unos vrijednosti itd. Joystick se ne može samo pomicati duž X i Y osi, već i pritisnuti.

Video:

Specifikacija:

  • Napon napajanja: 5 V / 3,3 V (oba napona su unutar prihvatljivog raspona).
  • Trenutna potrošnja:< 10 мА
  • Dimenzije: 30x30 mm

Svi moduli linije "Trema" izrađeni su u istom formatu

veza:

  • Pinovi “X” i “Y” modula povezani su s bilo kojim analognim ulazima Arduina. Vrijednosti očitane s ovih pinova rastu kako pomičete joystick slijeva nadesno i odozdo prema gore.
  • "K" pin je digitalni i spaja se na bilo koji Arduino pin. U normalnom stanju ima logičku razinu "0", a kada pritisnete joystick, mijenja se u logičku "1".
  • Pinovi "V" i "G" su pinovi za napajanje.

Prikladno je spojiti modul na 3 načina, ovisno o situaciji:

Metoda - 1: Korištenje žičanog kabela i Piranha UNO

Pomoću žica "Otac - mama" povezujemo se izravno s Piranha UNO kontrolerom


Metoda - 2: Korištenje Trema Set Shielda

Modul se može spojiti na bilo koji od analognih ulaza Trema Set Shielda.


Metoda - 3: Korištenje žičanog kabela i oklopa

Korištenje 5-žilnog kabela za Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO itd.


Prehrana:

Ulazni napon 5V ili 3,3V DC, isporučuje se na pinove Vcc (V) i GND (G).

Više detalja o modulu:

Podaci modula se očitavaju s dva potenciometra i taktičnog gumba, mehanički spojenog na polugu joysticka. Gumb je spojen na Vcc napajanje i izlaz "K", koji je pritisnut na GND preko otpornika. Prema tome, na izlazu "K" mogu se postaviti samo dva stanja: logička "0" (gumb je otpušten) ili "1" (gumb je pritisnut). Koordinatni pinovi "X" i "Y" su analogni izlazi modula; spojeni su na potenciometre tako da se napon uklonjen između ovih pinova i GND-a povećava kada se joystick pomiče slijeva na desno i odozdo prema gore.

Primjeri:

Detektiranje položaja joysticka i uključivanje LED-a pritiskom na tipku

const int8_t Xos = A0; // Odredite broj pina na koji je spojen kontakt X-osi joysticka const int8_t Yaxis = A1; // Odredite broj pina na koji je spojen kontakt osi joysticka const int8_t Button = 2; // Odredite broj pina na koji je spojen kontakt gumba joysticka const int8_t LED = 7; // Odredite broj pina na koji je spojena LED uint16_t XborderMIN = 505; // Postavite granicu vrijednosti, ISPOD koje će se smatrati da je joystick nagnut duž X osi ulijevo uint16_t XborderMAX = 515; // Postavite granicu vrijednosti, VIŠA od koje će se smatrati da je joystick nagnut duž X osi udesno uint16_t YborderMIN = 505; // Postavite granicu vrijednosti, ISPOD koje će se smatrati da je joystick otklonjen prema dolje Y osi uint16_t YborderMAX = 515; // Postavite granicu vrijednosti, IZNAD koje će se smatrati da je joystick otklonjen prema gore duž Y osi uint16_t Xvol = 0, Yvol = 0; // Postavite varijable koje će uzimati vrijednosti očitane s osi joysticka void setup() ( Serial.begin(9600); // Pokretanje prijenosa podataka na monitor serijskog porta pinMode(LED, OUTPUT); // Postavljanje LED-a izlaz za rad u izlaznom načinu rada pinMode(Button, INPUT); // Postavite pin gumba da radi u načinu unosa) void loop() ( Xvol = analogRead(Xaxis); // Čitajte vrijednosti X-osi ​​Yvol = analogRead (Yaxis); // Pročitajte vrijednosti osi If (Xvol< XborderMIN) { // Проверяем, полученное значение Х меньше нижней границы центрального положения или нет. Если да, то if (Yvol < YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Left-Down"); // значит джойстик находится в положении ВЛЕВО-ВНИЗ } else if (Yvol >YborderMAX) ( // Ako je rezultirajuća vrijednost Y veća od gornje granice središnjeg položaja, onda Serial.println("Left-Up"); // znači da je joystick u položaju LIJEVO-GORE ) else ( Serial. println("Lijevo"); // Ako je primljena vrijednost Y unutar granica središnjeg položaja duž Y osi, tada je joystick skrenut ULJEVO ) ) else if (Xvol > XborderMAX) ( // Provjerite je li primljena vrijednost X je veća od gornje granice središnjeg položaja ili nije. Ako je tako, onda ako (Yvol< YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Right-Down"); // значит джойстик находится в положении ВПРАВО-ВНИЗ } else if (Yvol >YborderMAX) ( // Ako je rezultirajuća vrijednost Y veća od gornje granice središnjeg položaja, tada Serial.println("Right-Up"); // znači da je joystick u položaju RIGHT-UP) else ( Serial. println("Right"); // Ako je primljena vrijednost Y unutar granica središnjeg položaja duž osi Y, tada je joystick nagnut UDESNO) ) else ( // Ako je primljena vrijednost X unutar granica središnjeg položaja duž X osi, tada ako (Yvol< YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Down"); // значит джойстик находится в положении ВНИЗ } else if (Yvol >YborderMAX) ( // Ako je rezultirajuća vrijednost Y veća od gornje granice središnjeg položaja, onda Serial.println("Up"); // znači da je joystick u GORE položaju) else ( Serial.println("Center "); // Ako je rezultirajuća Y vrijednost unutar granica središnjeg položaja duž Y osi, što znači da je joystick u sredini) ) if (digitalRead(Button)) ( // Provjerite je li gumb pritisnut odgoda (1); // Ako je tipka pritisnuta, tada odbijamo digitalWrite(LED, !digitalRead(LED)); // i mijenjamo stanje LED izlaza Serial.println("Button click!"); // Ispisuje tekst da je tipka pritisnuta dok je (digitalRead(Button)) () // Ako je tipka zadržana, ne činimo ništa delay(10); // Ako je tipka otpuštena, tada potiskujemo odskakanje ) )

Na monitoru serijskog porta vidjet ćete.

Korištenje joysticka jedan je od načina razmjene informacija između osobe i uređaja (računala, mikrokontrolera) temeljenog na Arduinu. Najčešće se koriste za upravljanje mehanizmima ili robotima. Po analogiji s poznatim svijetom igara, joystickovi se često nazivaju i gamepadima. Gamepad je jednostavan i lagan za korištenje. Danas postoji veliki broj vrste joysticka prema broju stupnjeva slobode, učestalosti čitanja informacija i korištenoj tehnologiji. U ovom članku ćemo pogledati najpopularniju opciju, naučiti kako upravljati joystickom i saznati kako ga povezati.

Analogni joystick izgleda kao ručka koja je postavljena na šarku s dva potenciometra koji definiraju osi X i Y, a tipka Z naginjanje ili okretanje ručke okreće poseban pokretni kontakt, koji mijenja izlazni napon. Sam gamepad opremljen je oprugom, zahvaljujući kojoj se glatko vraća u prvobitno središnje stanje nakon otpuštanja iz bilo kojeg položaja. Uređaj vam omogućuje glatko praćenje stupnja odstupanja od središnje (nulte) točke.

Spajanje joysticka na Arduino

Spajanje joysticka na Arduino Uno vrši se prema dijagramu ispod.

Modul ima 5 izlaza - Vcc, Gnd, X, Y i Key (oznake mogu varirati ovisno o uređaju).

Podaci duž X osi izlaze na ulaz A0, a podaci duž Y osi izlaze na A1. Za vizualnu kontrolu pritiska tipke možete spojiti i D11 LED. Napajanje se napaja naponom od 5 volti. GND pin se spaja na isti pin na Arduino ploči. SW pin se može spojiti na bilo koji digitalni pin.

Kao što vidite, povezivanje modula joysticka nije teško. Ako uređaj ne radi nakon spajanja, provjerite jeste li pravilno spojili sve pinove.

Kako pratiti trenutni položaj ili smjer joysticka

Da bismo koristili joystick u stvarnom projektu, morat ćemo napisati skicu za obradu podataka koje joystick šalje tijekom svog rada.

Saznajte u kojoj poziciji trenutni trenutak uređaj se nalazi, ovisno o vrijednostima potenciometara. Kretanje se događa u smjeru osi X i Y koje su okomite na njih. Informacije se čitaju s gamepada pomoću - prikazuje vrijednosti u rasponu od 0 do 1023. Prima brojeve pinova na koje je spojen joystick. kao argumenti:

Serial.println(analogRead(A0)); // pokazuje poziciju X koordinate

Serial.println(analogRead(A1)); // prikazuje položaj Y koordinata

Radi praktičnosti, preporučuje se korištenje konstanti za smanjenje i pojednostavljenje konačnog koda. Analogni pinovi se jednostavno mogu proglasiti konstantnim:

const bajt PIN_ANALOG_X = A0; // konstanta za X koordinatu

const bajt PIN_ANALOG_Y = A1; // konstanta za Y koordinatu

Određivanje smjera kretanja joystickom

Kontrola joysticka znači da moramo znati smjer kretanja ručke joysticka. Da bismo to učinili, morat ćemo prikupiti i interpretirati podatke na svim osima.

Po položaju X i Y osi možete odrediti je li joystick u sredini ili se pomaknuo. Vrijednosti u svim smjerovima kreću se od 0 do 1023, kao što je ranije objašnjeno. Prije svega, dolazi pomisao da će središnja točka biti otprilike na vrijednosti 511-512. Ovaj zaključak nije sasvim točan, jer se ne može odrediti apsolutno točan položaj.

Neuspješno određivanje središnje vrijednosti može rezultirati dobivanjem pogrešnih informacija o kretanju joysticka ako je joystick nepomičan. Da biste to učinili, trebali biste odabrati numerički raspon i uvjetno pretpostaviti da će bilo koja vrijednost u njemu biti središnja točka. Vrijednosti se moraju prilagoditi za svaku vrstu joysticka, ali približno će biti u rasponu od 505-518. Rezultirajuće vrijednosti zapisuju se u kod kao konstante:

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 518;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

Sljedeći korak je pretvorba koordinata u raspon od -1 do 1. Za X, -1 je kretanje ulijevo, 0 je bez kretanja, 1 je udesno. Duž Y -1 – kretanje prema dolje, 0 – središnja vrijednost, 1 – prema gore. U početku postavljamo sve vrijednosti na središte 0. Kako bismo provjerili događa li se kretanje, koristimo if/else izjave.

Zamke u radu gamepada

Kao i svaki drugi uređaj, joystickovi nisu bez svojih nedostataka. Prije svega, prisutnost opruge sprječava točan povratak ručke u središnji položaj zbog trenja u mehaničkim dijelovima. To dovodi do potrebe da se programski odredi središnji položaj, odnosno raspon vrijednosti u kojem će se bilo koja točka uvjetno smatrati sredinom.

Drugi problem može se nazvati prisustvom takozvanih mrtvih zona. Dvije krajnje vrijednosti s najvećim odstupanjima trebaju biti jednake 0 V i naponu napajanja. U stvarnosti se ove vrijednosti mogu razlikovati jer se ne koristi cijeli električni raspon promjena otpora. Da bi se riješio ovaj problem, ekstremne točke mogu odgovarati vrijednostima od 1 kOhm i 9 kOhm.

JoyStick shield ploča za proširenje

Za upravljanje robotima ili drugim mehanizmima ponekad morate koristiti joystick s gumbima i komunikacijama. Kako ne biste svaki put dolazili do novih dizajna, preporuča se kupiti gotovu Arduino ploču za proširenje za joystick, u koju će biti zalemljeni svi potrebni elementi.

Pogledajmo što je ovaj štit od svjetski poznatog Arduino proizvođača Sparkfun. Ovaj gamepad radi dobro i relativno je jeftin. Uređaj se može isporučiti malo rastavljen, stoga ga je potrebno prvo sastaviti.


Štit sadrži nekoliko standardnih gumba (4 obična sa strane i gumb za odabir). Ovisno o modelu, na ploču se mogu dodati konektori za povezivanje bluetooth ili wifi modula. Tradicionalno, vanjski uređaji mogu se spojiti pomoću pinskih i češljastih izlaza.

Zaključak

Arduino joystick neizostavna je stvar u mojim projektima. Zahvaljujući ovoj vrsti senzora, možete dodati prikladne i modernim sredstvima upravljanje. U nekim je situacijama gotovo nemoguće uopće bez joysticka: Arduino joystick koristi se za upravljanje robotima, pametnim strojevima, servosima, glasnoćom glazbe i svjetlinom pozadinskog osvjetljenja na monitoru, kao navigacija u raznim igrama i u mnogim drugim projektima.

Spajanje gotovog modula nije teško, a sama kontrolna skica također je vrlo dostupna. Najčešće se joystick koristi na mjestu s tipkama i u kombinaciji s bežičnim sučeljima, jer je joystickom na žici gotovo nemoguće upravljati brzim uređajima. Stoga se preporuča koristiti gotove štitove za rad, koji imaju sve što vam je potrebno.

Jednog lijepog dana na eBayu sam naišao na zanimljiv mali joystick modul koji je vrlo sličan onima koji se koriste u kontrolerima za PlayStation 2. Ispostavilo se da je modul vrlo jednostavan za korištenje s Arduinom i košta svega nekoliko dolara.

Postoji nekoliko tvrtki koje proizvode joystickove za Arduino, uključujući Adafruit, Sparkfun i veliki broj kineskih tvrtki. Drago mi je da im je princip rada potpuno identičan.

Opće informacije o modulu joysticka za Arduino

Modul ima 5 pinova: Vcc, Ground, X, Y, Key. Imajte na umu da se oznake na vašem modulu mogu razlikovati. Ovisi o proizvođaču. Joystick je analogan i pruža veću preciznost od jednostavnih "usmjerenih" joystikova koji koriste gumbe i mehaničke prekidače. Osim toga, joystick se može pritisnuti (na mom modelu potrebno je dosta truda za to. Možda samo još nije razvijeno). Nakon klika radit će gumb "pritisnite za odabir".

Za čitanje podataka s X/Y pinova, morate koristiti analogne izlaze na Arduinu. Zatik ključa se kratko spoji s masom kada se pritisne. Inače, ne sudjeluje ni u jednom lancu. Za pouzdano čitanje podataka s pinova Key/Select, oni moraju biti spojeni na napajanje (Vcc) preko otpornika za privlačenje. Vrijednost otpornika ugrađenih u Arduino bit će sasvim dovoljna za to.

Pogledajte video primjer kako joystick radi s Arduinom:

Dijagram spajanja joysticka na Arduino

    Arduino GND - GNG

    ARDUINO A0 - VER/Y

    Arduino A1 - HOR/X

Osnovna skica za korištenje joysticka s Arduinom

int buttonPin = 2;

int xPozicija = 0;

int yPozicija = 0;

int buttonState = 0;

// inicijalizacija razmjene podataka preko serijskog protokola brzinom od 9600 bps:

Serial.begin(9600);

pinMode(xPin, INPUT);

pinMode(yPin, INPUT);

// aktiviranje otpornika za povlačenje na iglici gumba

pinMode(buttonPin, INPUT_PULLUP);

// Za ranije verzije Arduina (manje od 1.0.1)

// pinMode(buttonPin, INPUT);

// digitalWrite(buttonPin, HIGH);

xPozicija = analogRead(xPin);

yPozicija = analogRead(yPin);

buttonState = digitalRead(buttonPin);

Serial.print("X: ");

Serial.print(xPozicija);

Serial.print(" | Y: ");

Serial.print(yPozicija);

Serial.print(" | Gumb: ");

Serial.println(buttonState);

kašnjenje (100); // dodaj odgodu između čitanja podataka

Kao što je gore spomenuto, postoji mnogo proizvođača modula joysticka. Zanimljivo rješenje Sparkfun ga ima. Objavili su Joystick Shield, o kojem ćemo govoriti sljedeće. Izgled Navigacijska palica Shield prikazana je na donjoj slici.


Sklop štitnika joysticka

Ovdje je vrijedno spomenuti da se štitnik isporučuje nesastavljen. Dakle, morat ćete raditi s lemilom. Potpune upute vodič za sastavljanje nalazi se na ovoj adresi: Vodič za sastavljanje štitnika za upravljanje. Materijal od proizvođača engleski, ali ima dovoljno foto materijala. Dakle, nije teško to shvatiti.

Za što možete koristiti joystick?

Štitnik joysticka ima četiri gumba s desne strane, jedan gumb izravno na joysticku i sam analogni joystick. Štit se može koristiti za kontrolu melodije ili piksela na monitoru. Gumbi se mogu koristiti za navigaciju i kontrolu igara.

Za dodatna motivacija možete pogledati video ispod:

Nakon što sastavite svoj joystick shield, možete sigurno mijenjati skice kako biste izvršili svoje zadatke.

Kako pratiti trenutni položaj joysticka?

Položaj joysticka izračunava se ovisno o vrijednostima dva potenciometra koji su u njemu ugrađeni. Joystick se pomiče u dva smjera, koji se obično označavaju kao X i Y. Za čitanje podataka s potenciometara koristimo funkciju analogRead(), koja vraća vrijednost u rasponu od 0 do 1023. Da bismo to učinili, moramo proslijediti brojeve pinova na koje je joystick povezan s funkcijom. U ovom primjeru spajamo se na analogni pin 0 za X i analogni pin 1 za Y.

Serial.println(analogRead(0)); // prikazuje X koordinate trenutne pozicije

Serial.println(analogRead(1)); // prikazuje Y koordinate trenutne pozicije

Vrlo prikladan pristup je korištenje konstanti za vrijednosti koje se neće mijenjati tijekom programa. Tako ćemo u donjem kodu deklarirati konstante za analogne pinove koje koristimo i prikazati trenutni X i Y položaj u Arduino IDE serijskom monitoru:

const bajt PIN_ANALOG_X = 0;

const bajt PIN_ANALOG_Y = 1;

Serial.begin(9600);

Serial.print("x:");

Serial.print(" ");

Serial.print("y:");

Serial.print(" ");

Serial.println();

Kako pratiti trenutni smjer joysticka?

Vrlo koristan dio koda. Na temelju vrijednosti položaja X i Y možemo odrediti je li joystick centriran ili pomaknut u jednom od osam smjerova (gore, gore-desno, desno, dolje-desno, dolje, dolje-lijevo, lijevo, gore-lijevo).

Budući da će vrijednosti u svakom smjeru biti u rasponu od 0 do 1023, možemo pretpostaviti da će središte biti u rasponu od 511-512. Ali to nije posve točno. Trenutnu vrijednost nećemo dobiti tako točno. A ako odredimo krivu vrijednost, možemo dobiti informaciju o kretanju joysticka, iako je stajao u sredini i nije se pomicao.

Da bismo to učinili, unijet ćemo raspon vrijednosti i pretpostaviti da će se bilo koja vrijednost unutar tog raspona smatrati središtem:

Ovaj raspon nije "konačna istina". Morate ga prilagoditi svom joysticku, zar ne. Ove vrijednosti se unose u kod kao konstante:

Sada pretvaramo svaku koordinatu iz raspona od 0 do 1023 u raspon od -1 do 1. Za X koordinatu, 1 znači kretanje lijevo, 0 znači nepomicanje, a 1 znači kretanje desno. Za smjer Y, -1 znači kretanje prema dolje, 0 znači da nema kretanja, a 1 znači kretanje prema gore.

Počet ćemo postavljanjem vrijednosti u svakom smjeru na 0 ("centar"). Nakon toga koristimo if/else izjave da provjerimo je li vrijednost pozicije u bilo kojem smjeru veća ili manja od našeg raspona:

x_smjer = 0;

y_smjer = 0;

if (x_position > X_THRESHOLD_HIGH) (

x_smjer = 1;

) else if (x_pozicija

x_smjer = -1;

if (y_position > Y_THRESHOLD_HIGH) (

y_smjer = 1;

) else if (y_pozicija

y_smjer = -1;

Arduino IDE ima funkciju map(), koja se teoretski može koristiti umjesto if/else, ali u u ovom slučaju Metoda postaje kompliciranija zbog problema s centriranjem, tako da ovdje nećemo koristiti kartu.

U donjem primjeru vidjet ćete da se kasnije if/else koristi za prikaz smjera - možete jednostavno promijeniti ovaj primjer kako bi odgovarao vašim potrebama:

const bajt PIN_ANALOG_X = 0;

const bajt PIN_ANALOG_Y = 1;

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 515;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

int x_smjer;

int y_smjer;

Serial.begin(9600);

x_smjer = 0;

y_smjer = 0;

x_position = analogRead(PIN_ANALOG_X);

y_position = analogRead(PIN_ANALOG_Y);

if (x_position > X_THRESHOLD_HIGH) (

x_smjer = 1;

) else if (x_pozicija

x_smjer = -1;

if (y_position > Y_THRESHOLD_HIGH) (

y_smjer = 1;

) else if (y_pozicija

y_smjer = -1;

if (x_smjer == -1) (

if (y_smjer == -1) (

Serial.println("lijevo-dolje");

Serial.println("lijevo");

// y_smjer == 1

Serial.println("lijevo gore");

) inače ako (x_smjer == 0) (

if (y_smjer == -1) (

Serial.println("dolje");

) else if (y_smjer == 0) (

Serial.println("centrirano");

// y_smjer == 1

Serial.println("gore");

// x_smjer == 1

if (y_smjer == -1) (

Serial.println("desno-dolje");

) else if (y_smjer == 0) (

Serial.println("desno");

// y_smjer == 1

Serial.println("desno gore");

Kako konfigurirati Arduino da prati stanje gumba (je li pritisnut)?

Prije nego što saznate je li pritisnut gumb na štitniku joysticka, trebate konfigurirati Arduino da prepozna gumbe. Iznenađujuće, ovo je implementirano u tijelu funkcije setup()!

Prvo definiramo konstante za Arduino pinove koji su povezani s gumbima:

// Odaberite gumb koji se aktivira kada se pritisne joystick

const byte PIN_BUTTON_UP = 4;

Ako ste ikada prije koristili gumbe s Arduinom, možda ste primijetili da za određivanje napona kada se gumb pritisne morate koristiti otpornik. Kako bi se smanjio broj dijelova, štit joysticka je dizajniran na takav način da otpornici nisu potrebni. Možete se zapitati: "Ako tipke zahtijevaju otpornike, zašto štit radi bez njih?" Samo nisi uzeo u obzir da Arduino ima ugrađene otpornike. Možete ih jednostavno aktivirati i koristiti s našim štitom!

Da biste koristili ove ugrađene pull-up otpornike, morate postaviti pin na INPUT mod, a zatim ga aktivirati pomoću sljedećih redaka:

Ako koristite pull-up otpornik, važno je upamtiti da gumb koji nije pritisnut proizvodi VISOKI signal, a pritisnut gumb proizvodi NISKI signal.

Kako biste konfigurirali svaki pin za rad u načinu unosa i aktivirali pull-up otpornike, možete koristiti sljedeći kod:

pinMode(PIN_GUMB_DESNO, ULAZ);

digitalWrite(PIN_GUMB_DESNO, VISOKO);

Kako mogu saznati kada je pritisnut gumb na štitniku joysticka?

Nakon dovršetka prethodnih koraka, pomoću funkcije digitalRead() možete odrediti je li gumb pritisnut. Kada je očitana vrijednost NISKA, tipka se pritisne, a kada je vrijednost VISOKA, tipka se ne pritisne.

if (digitalRead(PIN_BUTTON_LEFT) == LOW) (

// Gumb pritisnut

// Gumb nije pritisnut

Sljedeći primjer prikazat će stanje svakog gumba i vrijednost s joysticka u Arduino IDE serijskom monitoru:

const byte PIN_BUTTON_SELECT = 2;

const byte PIN_BUTTON_RIGHT = 3;

const byte PIN_BUTTON_UP = 4;

const byte PIN_BUTTON_DOWN = 5;

const byte PIN_BUTTON_LEFT = 6;

const bajt PIN_ANALOG_X = 0;

const bajt PIN_ANALOG_Y = 1;

Serial.begin(9600);

pinMode(PIN_GUMB_DESNO, ULAZ);

digitalWrite(PIN_GUMB_DESNO, VISOKO);

pinMode(PIN_GUMB_LIIJEVO, ULAZ);

digitalWrite(PIN_GUMB_LIJEVO, VISOKO);

pinMode(PIN_GUMB_GORE, ULAZ);

digitalWrite(PIN_GUMB_GORE, VISOKO);

pinMode(PIN_GUMB_DOLJE, ULAZ);

digitalWrite(PIN_GUMB_DOLJE, VISOKO);

pinMode(PIN_BUTTON_SELECT, INPUT);

digitalWrite(PIN_BUTTON_SELECT, HIGH);

Serial.print("l:");

Serial.print(digitalRead(PIN_BUTTON_LEFT));

Serial.print(" ");

Serial.print("r:");

Serial.print(digitalRead(PIN_BUTTON_RIGHT));

Serial.print(" ");

Serial.print("u:");

Serial.print(digitalRead(PIN_BUTTON_UP));

Serial.print(" ");

Serial.print("d:");

Serial.print(digitalRead(PIN_BUTTON_DOWN));

Serial.print(" ");

Serial.print("x:");

Serial.print(analogRead(PIN_ANALOG_X));

Serial.print(" ");

Serial.print("y:");

Serial.print(analogRead(PIN_ANALOG_Y));

Serial.print(" ");

Serial.print("s:");

Serial.print(digitalRead(PIN_BUTTON_SELECT));

Serial.print(" ");

Serial.println();

Ostavite svoje komentare, pitanja i podijelite svoja osobna iskustva u nastavku. Nove ideje i projekti često se rađaju u raspravama!