Hľadať kód

Lekcia 13/31: Použitie XY joysticku s Arduinom a zapínanie bzučiaka pohybom joysticku | Robojax

Lekcia 13/31: Použitie XY joysticku s Arduinom a zapínanie bzučiaka pohybom joysticku | Robojax

V tej lekcii preskúmame modul XY joysticku a ako ho pripojiť k Arduinu na detekciu smerového pohybu a stlačení tlačidiel. Toto všestranné vstupné zariadenie obsahuje dva potenciometre (jeden pre os X a jeden pre os Y) a tlačidlo, čo vám umožňuje zachytiť celý 360-stupňový rozsah pohybu spolu s akciou kliknutia. Okrem jednoduchého čítania surových hodnôt si ukážeme, ako spustiť akcie—napríklad zapnutie bzučiaka—keď sa joystick posunie do konkrétnej polohy. Tento princíp tvorí základ pre nespočetné množstvo interaktívnych projektov.

sunfounder-13-JoyStick-2

Táto príručka je ideálna na vytvorenie:

  • Dvojosového diaľkového ovládania pre robotické auto alebo pan-tilt kamerový držiak.
  • Vlastného herného ovládača pre PC alebo mobilné zariadenie.
  • Systému navigácie v menu pre LCD alebo OLED displej.
  • Presného ovládača rýchlosti a smeru motora pre priemyselné alebo hobby aplikácie.
  • Interaktívneho poplašného systému, kde konkrétna poloha joysticku aktivuje sirénu alebo upozornenie.

Hardvér a komponenty

Na realizáciu tohto projektu budete potrebovať nasledujúce komponenty. Konkrétna súprava použitá vo videu je SunFounder 3-v-1 Arduino kit, ale tieto diely sú bežne dostupné aj samostatne.

  • Arduino Uno (alebo akákoľvek kompatibilná doska)
  • Modul XY joysticku
  • Pasívny bzučiak
  • Prepojovacie vodiče
  • USB kábel na programovanie a napájanie
LB-LR0001_Dual-axis_XY_Joystick_Module

Pochopenie modulu XY joysticku

XY joystick je samostatné vstupné zariadenie. Ako je vysvetlené vo videu (vo videu o 01:20), kombinuje dva 10k ohmové potenciometre usporiadané kolmo. Pohyb páčkou pozdĺž osi X otáča jedným potenciometrom, zatiaľ čo pohyb pozdĺž osi Y otáča druhým. To umožňuje Arduinu čítať analógové napätie pre každú os, ktoré predstavuje presnú polohu páčky. Modul tiež obsahuje tlačidlo, ktoré sa aktivuje stlačením páčky priamo nadol.

Joystick-Module-Internal-Structure

Tu je prehľad jeho pinov:

  • GND: Pripojí sa na zem (0V) Arduina.
  • VCC: Pripojí sa na 5V napájanie Arduina.
  • VRX: Analógový výstup pre polohu osi X.
  • VRY: Analógový výstup pre polohu osi Y.
  • SW: Digitálny výstup pre tlačidlo (aktívny v nízkej úrovni).

Video tiež ukazuje, že dva vnútorné potenciometre sú zapojené paralelne medzi VCC a GND, čo vedie k celkovému odporu približne 5k ohmov, čo je normálna hodnota pre tento modul (vo videu o 04:30).

Schéma zapojenia

sunfounder-13_xy_joystick_wiring_bb

Zapojenie pre tento projekt je jednoduché. Video zobrazuje schému zapojenia z dokumentácie SunFounder, ale my pripojíme joystick priamo na piny Arduina, ako je opísané. Bzučiak je pridaný pre akčnú časť projektu.

Tu sú pripojenia vytvorené vo videu (vo videu o 06:24):

  • Joystick GNDArduino GND (čierny vodič)
  • Joystick VCCArduino 5V (červený vodič)
  • Joystick VRXArduino A0 (žltý vodič)
  • Joystick VRYArduino A1 (zelený vodič)
  • Joystick SWArduino Pin 8 (modrý vodič)
  • Bzučiak kladný (dlhý pin)Arduino Pin 2
  • Bzučiak záporný (krátky pin)Arduino GND

Vysvetlenie kódu

Poskytnutý kód je navrhnutý na čítanie polohy joysticku a aktiváciu bzučiaka, keď je splnená konkrétna podmienka. Kľúčové časti, ktoré môžete nakonfigurovať, sú na začiatku náčrtu.

Najprv sú nastavené definície pinov. Môžete ich zmeniť podľa vášho konkrétneho zapojenia:

const int xPin = A0;  //na ktorý je pripojený VRX
const int yPin = A1;  //na ktorý je pripojený VRY
const int swPin = 8;  //na ktorý je pripojený SW
const int alarmPin=2;//na bzučiak

Ďalej sú deklarované globálne premenné na uloženie stavu joysticku. Tieto sa aktualizujú pri každom volaní funkcie readJoystick().

int xValue;//na uloženie xValue
int yValue;//na uloženie yValue
int swValue;//na uloženie hodnoty spínača

Vo funkcii setup() je pin spínača nakonfigurovaný s interným pull-up rezistorom. Toto je kľúčový krok, pretože eliminuje potrebu externého rezistora. Nastavením na INPUT_PULLUP bude pin štandardne čítať HIGH a prejde na LOW po stlačení tlačidla.

pinMode(swPin, INPUT_PULLUP);  //nastaví pin SW na INPUT

Jadro logiky je vo funkcii loop(). Volá vlastnú funkciu readJoystick(), aby získala čerstvé údaje. Potom kontroluje podmienku: ak je hodnota osi X väčšia ako 600 a hodnota osi Y menšia ako 300, spustí sa bzučiak. Tieto prahové hodnoty môžete upraviť, aby ste definovali inú „aktívnu zónu" pre joystick. alarmPin sa nastaví na HIGH, čím sa aktivuje bzučiak, a na Serial Monitor sa vypíše správa.

if(xValue >600 && yValue <300)
{
  digitalWrite(alarmPin, HIGH);
  Serial.print("Alarm X:");
  Serial.print(xValue);
  Serial.print(" Y:");
  Serial.println(yValue);
}else{
  digitalWrite(alarmPin, LOW);
  // ... kód na výpis hodnôt, keď je alarm vypnutý
}

Nakoniec je definovaná vlastná funkcia readJoystick(). Táto funkcia číta analógové hodnoty z pinov X a Y a digitálny stav spínača, pričom ich ukladá do globálnych premenných. Tento modulárny prístup udržiava hlavnú slučku čistú a prehľadnú.

void readJoystick()
{
  xValue =analogRead(xPin);//číta hodnotu xPin
  yValue =analogRead(yPin);//číta yPin
  swValue =digitalRead(swPin);//číta spínač 
}

Živý projekt a demonštrácia

Po nahratí kódu je možné otvoriť Serial Monitor, aby ste pozorovali surové hodnoty. Na začiatku, keď je joystick v strede, budú hodnoty X a Y okolo 512, čo je stred rozsahu 0-1023. Stlačením joysticka nadol sa hodnota spínača zmení z 1 na 0 (vo videu o 10:15).

Posunutím joysticka do krajných polôh sa zobrazí celý rozsah: posunutím úplne doprava sa zobrazí hodnota X 1023 a úplne doľava 0. Podobne posunutím hore a dole sa hodnota Y zmení medzi 0 a 1023 (vo videu o 10:37).

Demonštrácia potom ukazuje akčnú časť projektu. Keď sa joystick posunie do pravého horného rohu (kde X > 600 a Y < 300), bzučiak zaznie a Serial Monitor vypíše správu „Alarm". Posunutím mimo túto zónu sa bzučiak vypne. To dokazuje, že polohu joysticka môžete použiť na ovládanie výstupného zariadenia, čo možno rozšíriť na ovládanie relé, LED diód alebo motorov pre rôzne aplikácie.

Kapitoly

  • [00:00] Úvod do projektu XY Joystick
  • [01:20] Pochopenie hardvéru a vnútorných komponentov
  • [03:33] Schéma modulu a meranie odporu
  • [05:51] Zapojenie joysticka k Arduinu
  • [07:00] Nastavenie kódu a aktivácia pull-up rezistora
  • [09:23] Nahrávanie kódu a testovanie surových hodnôt
  • [12:21] Akcia: Ovládanie bzučiaka polohou joysticka
  • [16:02] Živá demonštrácia alarmového systému

Obrázky

Sunfounder car assembled
Sunfounder car assembled
LB-LR0001_Dual-axis_XY_Joystick_Module
LB-LR0001_Dual-axis_XY_Joystick_Module
sunfounder-13-JoyStick-1
sunfounder-13-JoyStick-1
sunfounder-13-JoyStick-2
sunfounder-13-JoyStick-2
Joystick-Module-Internal-Structure
Joystick-Module-Internal-Structure
sunfounder-13_xy_joystick_wiring_bb
sunfounder-13_xy_joystick_wiring_bb
922-Lesson 13/31: How to read position and values of X-Y Joystick
Jazyk: C++
/*
This sketch reads the x-y joystick and push button
Download and resource page https://robojax.com/RJT596
watch video https://www.youtube.com/watch?v=-3diSIK_iAU
*/

const int xPin = A0;  //the VRX attach to
const int yPin = A1;  //the VRY attach to
const int swPin = 8;  //the SW attach to
const int alarmPin=2;//to buzzer

int xValue;//to store xValue
int yValue;//to store yValue
int swValue;//to store value of the switch

void setup()
{
  pinMode(swPin, INPUT_PULLUP);  //set the SW pin to INPUT
  pinMode(alarmPin, OUTPUT);//define alarm pin
  Serial.begin(9600);
}

void loop()
{
  readJoystick();//call our function to read the avlues
  

  if(xValue >600 && yValue <300)
  {
    digitalWrite(alarmPin, HIGH);
    Serial.print("Alarm X:");
    Serial.print(xValue);
    Serial.print(" Y:");
    Serial.println(yValue);
  }else{
    digitalWrite(alarmPin, LOW);
    Serial.print("X: "); 
    Serial.print(xValue, DEC);  // print the value of VRX in DEC
    Serial.print("|Y: ");
    Serial.print(yValue, DEC);  // print the value of VRX in DEC
    Serial.print("|SW: ");
    Serial.println(swValue);   // print the value of SW    
  }
   delay(50); 
}

/*
 * @brief reads joystick x, y and sw 
 * @param none
 * @return returns nothing
 * Written by Ahmad Shamshiri on Dec 11, 2022
 * for Robojax Tutorial Robojax.com
 */
void readJoystick()
{
  xValue =analogRead(xPin);//read xPin value
  yValue =analogRead(yPin);//read yPin
  swValue =digitalRead(swPin);//read switch 
}

Zdroje a referencie

Súbory📁

Knižnice Arduino (zip)

Používateľská príručka