Joystick egérvezérlés

Vezérli a számítógép kurzormozgását a Joystick segítségével, amikor egy gombot megnyomnak.


Utolsó felülvizsgálat: 2022.02.04 16:50


Az Mouse könyvtár segítségével vezérelheti a számítógép képernyőn megjelenő kurzorát egy Arduino Leonardo, Micro vagy Due segítségével. Ez a konkrét példa egy nyomógombot használ az egérvezérlés be- és kikapcsolására joystick segítségével.

A kurzor mozgása az Arduino-nál mindig relatív. Tehát minden alkalommal, amikor az analóg bemenetet olvassa, a kurzor pozíciója frissül az aktuális pozíciójához képest.

Két analóg bemenet 0 és 1023 közötti tartománya -12 és 12 közötti tartományba kerül átültetésre. A vázlat feltételezi, hogy a joystick nyugalmi értékei a tartomány közepe körül vannak, de egy küszöbön belül változnak.

A nyomógomb lehetővé teszi az egérvezérlés be- és kikapcsolását. Opcióként csatlakoztathat állapotjelző LED-et az 5-ös kivezetéshez, amely akkor világít, amikor az Arduino vezérli az egeret. Egy második nyomógomb is csatlakoztatható egy másik 10 kohmos (GND-hez) lehúzó ellenálláshoz a D3-hoz, hogy az bal egérkattintásaként működjön.

Megjegyzés: Amikor a Mouse.move() parancsot használja, az Arduino átveszi a számítógép kurzorát! Annak érdekében, hogy ne veszítse el az uralmat a számítógépe felett, miközben vázlatot futtat ezzel a funkcióval, feltétlenül állítson be egy vezérlőt, mielőtt meghívná a Mouse.move()-t. Ez a vázlat tartalmaz egy nyomógombot az egérvezérlés állapotának váltásához, így be- és kikapcsolhatja az egérvezérlést.

Hardver szükséglet

  • Arduino Leonardo, Micro vagy Due kártya

  • 2 tengelyes joystick

  • pillanat nyomógomb (esetleg a joystickbe integrálva)

  • LED

  • 220 ohmos ellenállás

  • 10 kohmos ellenállás (ha szükséges lehúzóként)

Az áramkör

Csatlakoztassa a Leonardo kártyáját a számítógépéhez mikro-USB-kábellel. A nyomógomb a 6-os kivezetéshez csatlakozik. Ha olyan alkatrészt használ, mint az alábbi képen látható Joystick shield, akkor lehet, hogy nincs szüksége lehúzó ellenállásra. A joystick x tengelye az analóg 0-hoz van csatlakoztatva, az y-tengely az analóg 1-hez.

Vázlat

A kód

/*
  JoystickMouseControl

  Az egeret az Arduino Leonardo, Micro vagy Due joystickjával vezérli.
  Egy nyomógombot használ az egérvezérlés be- és kikapcsolására, egy második 
  nyomógombot pedig a bal egérgombbal való kattintáshoz.

  Hardware:
  - 2 tengelyes joystick az A0 és A1 kivezetésekhez csatlakoztatva
  - nyomógombok, amelyek a D2 és D3 kivezetésekhez csatlakoznak

  Az egér mozgása mindig relatív. Ez a vázlat két analóg bemenetet olvas be,
  amelyek 0-tól 1023-ig terjednek (vagy mindkét végén kevesebb), és lefordítja
  őket -6 és 6 közötti tartományba.
  A vázlat feltételezi, hogy a joystick nyugalmi értékei a tartomány közepe
  körül vannak, de egy küszöbön belül változnak.

  FIGYELEM: Amikor a Mouse.move() parancsot használja, az Arduino átveszi az egeret!
  Az egérparancsok használata előtt győződjön meg arról, hogy rendelkezik a vezérléssel. Ez a vázlat
  tartalmaz egy nyomógombot az egérvezérlés állapotának váltásához, így be- és kikapcsolhatja
  az egérvezérlést.

  created 15 Sep 2011
  updated 28 Mar 2012
  by Tom Igoe

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/usb/JoystickMouseControl
*/

#include "Mouse.h"

// Kivezetés-számok beállítása a kapcsolókhoz, a joystick tengelyekhez és a LED-hez:
const int switchPin = 2;      // kapcsoló az egérvezérlés be- és kikapcsolásához
const int mouseButton = 3;    // bemeneti kivezetés az egér nyomógombjához
const int xAxis = A0;         // joystick X tengely
const int yAxis = A1;         // joystick Y tengely
const int ledPin = 5;         // Egér vezérlő LED

// parameters for reading the joystick:
int range = 12;               // X vagy Y mozgás kimeneti tartománya
int responseDelay = 5;        // az egér válaszkésleltetése, ms-ban
int threshold = range / 4;    // nyugalmi küszöb
int center = range / 2;       // nyugalmi helyzet értéke

bool mouseIsActive = false;    // irányítani kell-e az egeret vagy sem
int lastSwitchState = LOW;        // előző kapcsoló állapot

void setup() {
  pinMode(switchPin, INPUT);       // a kapcsoló kivezetés
  pinMode(ledPin, OUTPUT);         // a LED kivezetés
  // vegye át az irányítást az egér felett:
  Mouse.begin();
}

void loop() {
  // a kapcsoló olvasása:
  int switchState = digitalRead(switchPin);
  // ha megváltozott és magas, váltsd át az egér állapotát:
  if (switchState != lastSwitchState) {
    if (switchState == HIGH) {
      mouseIsActive = !mouseIsActive;
      // kapcsolja be a LED-et, hogy jelezze az egér állapotát:
      digitalWrite(ledPin, mouseIsActive);
    }
  }
  // kapcsoló állapotának mentése a következő összehasonlításhoz:
  lastSwitchState = switchState;

  // olvassa el és skálázza a két tengelyt:
  int xReading = readAxis(A0);
  int yReading = readAxis(A1);

  // ha az egérvezérlő állapot aktív, mozgassa az egeret:
  if (mouseIsActive) {
    Mouse.move(xReading, yReading, 0);
  }

  // olvassa el az egérgombot, és kattintson vagy ne kattintson:
  // ha megnyomja az egérgombot:
  if (digitalRead(mouseButton) == HIGH) {
    // ha az egér nincs lenyomva, nyomja meg:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT);
    }
  }
  // else nincs megnyomva az egérgomb:
  else {
    // ha megnyomja az egeret, engedje el:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT);
    }
  }

  delay(responseDelay);
}

/*
  beolvas egy tengelyt (0 vagy 1 x-hez vagy y-hoz), és az analóg bemeneti tartományt
  0 és <tartomány> közötti tartományra skálázza
*/

int readAxis(int thisAxis) {
  // az analóg bemenet olvasása:
  int reading = analogRead(thisAxis);

  // az analóg bemeneti tartományból a kimeneti tartományra való leképezés:
  reading = map(reading, 0, 1023, 0, range);

  // ha a kimeneti érték kívül esik a nyugalmi helyzet küszöbén, használja:
  int distance = reading - center;

  if (abs(distance) < threshold) {
    distance = 0;
  }

  // visszaadja a tengely távolságát:
  return distance;
}

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.