Összraktam egy Arduino - Joystickot, amit a Windows felismer és pazarul kezel, ennek a (meglepően gyors) tesztnek a folyamatát írom most le.
Mindez egy rövid videóban:
Szükséges hardver:
- Arduino Leonardo vagy Micro
- 10K potméter (lehet ez 20k, 100k is)
- breadboard
- vezetékek
- Micróhoz általában külön kell USB kábelt szerezni, a Leonardóhoz szoktak adni
Szükséges szoftver:
Hardver
Pakoljuk össze a hardvert először. Ha Arduino Micro lett a választás, a breadbordon helyezzük el. Szúrjuk le a potmétert, egy kis breadboardon még pont elfér a Micro mellett.
A poti egyik szélső lábát kössük össze az Arduino föld (GND) lábával, a másik szélső lába menjen az Arduino 5V-ot leadó lábára (VCC), a poti középső lábát pedig az Arduino A0 lábával.
Kész is a hardver! Már csak egy USB kábel kell és dughatjuk a gépre.
Szoftver
Indítsuk el az Arduino fejlesztő környezetét. Egyből egy üres vázlattal kezd, innen törölhetünk mindent, nem sok kódra van szükségünk.
Javaslom, hogy mielőtt belevágunk a világmegváltó programozásba, mindig állítsuk be, hogy milyen eszközre fejlesztünk. Ezt a Tools/Board menüpontban tehetjük meg. Kilistázza a lehetséges Arduino boardokat, válaszzuk ki a sajátunkat. Ha már rádugtuk a gépre, akkor a Tools/Port menüpontnál meg is fog jelenni a COM port, ahova csatlakozik az Arduinónk. Válasszuk ki!
... és akkor jöhet a programozós rész ...
Programozzunk
Egy nagyon egyszerű programmal kezdünk, csak lássuk végre működni :)
A feladata a programnak annyi, hogy az USB-n rádugott számítógépnek azt mondja magáról, hogy ő egy Joystick, és az egyik tengelyének az értékét úgy változtassa, ahogy tekerjük a potit (pl tolóerőt adunk a gépünknek). Picit visszafogjuk a 16Mhz-es kütyünket és teszünk bele egy korlátot, hogy 25ms várakozásokkal küldje csak a gépnek a tolóerőkarunk aktuális pozícióját. Ez azt jelenti, hogy másodpercenként 40szer fogja ellenőrizni, hogy hol áll a potméter és elküldeni azt a gép felé.
Meg kell mondanunk a program elején, hogy használni akarjuk a Joystick libraryt. Aztán példányosítunk egy Joystickot, majd beállítunk néhány változót, amit arra fogunk használni, hogy ne folyamatosan, csak 25 ezredmásodpercenként küldjünk adatot. Ez így néz ki:
#include "Joystick.h"
Joystick_ Joystick;
const unsigned long cycleDelta = 25;
unsigned long nextTime = 0;
Most jön a setup(). Erről azt kell tudni, hogy egyetlen egyszer fut le, amikor elindult az Arduino (amikor áramot kap, inicializálja magát és meghívja ezt a funkciót). Itt végzünk el minden olyan beállítást, ami ahhoz szükséges, hogy a programunk ciklikusan tudjon utána futni.
Itt beállítjuk, hogy a Throttle tengely értékkészlete 0-1023 tartományban lesz. Egyszerűen azért ez az intervallum, mert amikor az Arduino A0 lábáról analóg értéket olvasunk be, pont ezt a tartományt kapjuk vissza. 0 jelenti, hogy a potméter az egyik végállásáig van tekerve, 1023 pedig azt, hogy a másik végállásig.
Ahogy ezt beállítottuk, "megkérjük" az Arduinót, hogy mesélje el a gépnek, ő valójában egy Joystick.
void setup() {
Joystick.setThrottleRange(0, 1023);
//auto send mode false
Joystick.begin(false);
}
Ez után jön a loop(). Ez a programunk vezérlője voltaképpen. Ez futkározik körbe-körbe mindaddig, amíg az Arduino áramot kap. Voltaképp itt kell a logikát lefejlesztenünk.
A ciklusban mindig kiszámoljuk, mi az a következő időpont (25ms-el később), amikor megint küldeni kell adatot a gépnek (nextTime). Minden egyes ciklusban ellenőrizzük, hogy eltelt-e már 25ms. Ha eltelt, akkor beállítjuk a tolóerőt arra az értékre, ahol épp áll a potméter, ami az A0-s lábra van kötve és elküldjük a joystick aktuális állapotát.
void loop() {
if (millis() >= nextTime) {
Joystick.setThrottle(analogRead(A0));
Joystick.sendState();
nextTime = millis() + cycleDelta;
}
}
Ezek után nincs más hátra, mint a szerkesztő mező felett található "jobbra nyíl" megnyomásával feltöltjük az Arduinóra a programot. A sikeres feltöltés után a kütyü újraindul és a Windows örömmel értesít minket, hogy egy új játékvezérlő lett csatlakoztatva.
Nyissuk meg az USB Játékvezérlőket nagyszerű windowsunkban, tulajdonságokra kattintva látjuk is, hogy mennyi tengellyel és nyomógombbal rendelkezik.
A potmétert tekergetve pedig észrevehetjük ahogy a Throttle tengely értéke pontosan a poti állapotát adja vissza.
Ennyi az egész, csináltunk egy saját USB Joystickot, semmi sem állíthat meg minket, hogy egy teljes szimulátort építsünk! :)