Arduino-suli: Windows-vezérlés mikrokontrollerrel

|

Akár számítógéped felületét is irányíthatod egy Arduino bevetésével, csupán némi pythonos segítségre lesz szükséged ehhez.

Rengeteg izgalmas projektben alkalmazhatod az Arduino mikrovezérlőt, de a legérdekesebbek ezek közül egyértelműen azok, amelyek a mindennapok során is alkalmazható eszközök elkészítését tűzik ki célul. Mi is lehetne izgalmasabb hardveres kihívás, mint a számítógép vezérlése? Cikkünkben megmutatjuk, hogyan alakíthatod át az Arduino-lapka bemeneti adatait egy rövidke Python-kód segítségével a számítógépen is értelmezhető utasításokká.

Kiegészítők telepítése

Extra szenzoros kiegészítőket nem igazán kell beemelned a projektbe, vagyis rajtad múlik, hogy mennyi plusz komponenst kötsz a mikrovezérlőhöz. Első körben nem érdemes egy komplett billentyűzet elkészítéséhez szükséges inputszenzor-mennyiséget társítani - bár kellő elszántsággal akár ezt is megvalósíthatod. Azért legalább két gombot helyezz el a prototípuslapkán, ezekre a billentyűkre fogod ugyanis kiszervezni a rendszer hangerőszabályzását.

Ahhoz azonban, hogy ezt a lehető legegyszerűbben elkészíthesd, szoftveres csomaggal is bővítened kell a rendszert még a kódolás megkezdése előtt. Értelemszerűen kelleni fog az Arduino fejlesztői környezete, így amennyiben ezt még nem telepítetted, akkor indítsd ezzel az előkészületeket. Szükségtelen extra hardveres komponenseket installálni, hacsak nem valamilyen speciális mikrovezérlőt kívánsz életre kelteni.

Amint az Arduino IDE készen áll, jöhet a Python (python.org/downloads) telepítése. Ez a szkriptnyelv segít majd abban, hogy az üzenetsoron beérkező jeleket a számítógép által is értelmezhető utasításokká alakítsd. A demókód készítésekor a 3.7-es Python-verziót használtuk, de ettől igény szerint eltérhetsz (bár ekkor a kompatibilitás nem biztos, hogy tökéletes lesz).

Ha végeztél a program telepítésével, nyiss egy futtatási ablakot a Win+R billentyűkombinációval, és a CMD utasítás begépelésével indítsd el a parancssort, amelyen keresztül telepíthetsz majd extra kiegészítő komponenseket a nyelvhez. Ehhez felhasználhatod a Python beépített csomagtelepítőjét is (a 3.4-nél korábbi verziókban a python get-pip.py parancs segítségével külön kell installálnod).

Alkalmazása rendkívül egyszerű, a py -m pip install parancs végére oda kell biggyesztened a szükséges csomag nevét, és már indul is a parancssoros letöltés és telepítés. Elsőként installáld a pySerial csomagot, amely lehetővé teszi, hogy soros monitorról érkező adatokkal is dolgozz a Python felületén. A telepítés megkezdéséhez a parancssorba írd be a py -m pip install pyserial utasítást, és kezdetét veszi a szükséges elemek másolása, aminek a végén a felület jelzi, ha a beemelés sikeres volt.

A következő lépés - továbbra is a parancssoron belül -, hogy feltelepíted a PyAutoGUI-t, amelynek köszönhetően majd programkódon keresztül kontrollálhatod a rendszer bemeneti paramétereit. Még hiányzik a wheel csomagkezelő, enélkül elakadhat a szoftvertelepítés. Szóval elsőként gépeld a parancssorba a py -m pip install wheels utasítást, majd, ha a felület végzett, hozzáláthatsz a PyAutoGUI felmásolásához is a py -m pip install pyautogui segítségével.

Kezdődhet a kódolás

A csomagok beemelése után jöhet a programkód elkészítése, ami szerencsére nem túlzottan bonyolult. Az Arduino IDE felületén hozz létre egy új projektet, és a megjelenő ablakban a start() függvény elé ékelj be annyi,  int típusú változót, ahány gombot csatlakoztattál a mikrovezérlőhöz - esetünkben ez kettőt jelent -, majd add nekik értékül annak a pinnek a számát, amelyhez kapcsolódnak (például int gomb1=2;).

Ezek után a start() belsejébe mindössze egyetlen sornyi kódot kell beszúrnod, amelyben aktiválod a soros monitort (Serial.begin(9600); ). Ha ez sikerült, folytathatod a kódod készítését a loop()-ban, ahol a két gombhoz tartozó bekapcsolt állapothoz kell feltételeket társítanod. Elsőként vizsgáld meg azt a digitalRead(gomb1)==HIGH segítségével, amikor a gomb1-hez tartozó porton érkezik jel, vagyis a csatlakoztatott billentyűt lenyomtad.

Ebben az esetben a soros monitornak küldj egy 1-es értéket (Serial.println(1); ). Hasonlóan egy másik feltételben vizsgáld a gomb2-ről érkező információkat, és ha teljesül a kritérium, írj ki egy 2-es számot a monitoron (Serial.println(2);). Végezetül helyezz a loop végére egy minimális késleltetést a delay(40); utasítás begépelésével. Ezt követően a programod magja már készen áll, magyarán töltheted is fel a rövid kis szoftvert a mikrovezérlőre. Teszteléséhez nyiss egy soros monitort, és láthatod, hogy a megfelelő gomb lenyomásakor az általad kiválasztott szám jelenik meg a képernyőn.

Jöhet a kígyó

A Python-kódok elkészítéséhez nem érdemes külön fejlesztői környezetet feltelepítened, de ha rendelkezel ilyennel, bátran használd. Ezúttal a Notepad++ (https://notepad-plus-plus.org/downloads) felületét javasoljuk tanulmányozni a néhány soros program előállításához. Mivel a Python kiemelten érzékeny, a szóközökre és a tabulátorokra mindenképp figyelj oda: aktiváld a megfelelő behúzásokat a ciklusok és az elágazások létrehozása közben. 

A Notepad++ üres felületén emeld be a két telepített csomagot, azaz a futtatható állományod első sorába az import pyautogui, alá pedig az import serial kerüljön. Ezeknek köszönhetően már hozzáférhetsz a csomagokban található extra komponensekhez.

Következő lépésként a monitor = serial.Serial('COM3') sor segítségével adhatod meg, hogy melyik porton keresztül csatlakozzon mikrovezérlőd a számítógépedhez (az Arduino fejlesztői környezetben alul jelölt COM-értéket kell a zárójelbe írnod), a következő sorba pedig a monitor.baudrate = '9600' kerüljön, feltéve, hogy az általunk is használt 9600-as csatornán nyitottad meg a soros monitort az IDE-ben (ha nem, akkor itt a saját értékedet helyezd el).

Mivel már "látod" a mikrovezérlőt, a Python felületéről elkezdheted feldolgozni az érkező adatokat. Ehhez indíts egy végtelen ciklust a while True: begépelésével, majd tárold el egy data változóban a soros monitorról beolvasott információt (data=monitor.readline()). Következő lépésként elengedhetetlen egy feltétel, ami akkor teljesül, ha van bármilyen bejövő adatunk (if data:), és mivel tudjuk, hogy számokat kell kapnunk a beérkező információfolyamban, bátran át is konvertálhatjuk a szam = int(data.decode('utf-8')) sorral.

Jelenleg a szam változód már a soros monitorról beérkezett értéket tartalmazza, vagyis nincs más teendőd, mint egy feltételben vizsgálni az 1-es és a 2-es számok megjelenését. Teljesülés esetén aktiváld a pyautogui.press('gombhivatkozás') függvényt, amelynek gombhivatkozás-értéke helyett a megfelelő billentyűreferenciát kell idézőjelek között megadnod.

Ha érdekel, hogy itt milyen formában hívhatod meg az egyes billentyűket, akkor a PyAutoGUI dokumentációjában (pyautogui.readthedocs.io/en/latest/keyboard.html) részletes leírást találhatsz a bevethető parancsok listájáról. Mivel a jelenlegi programmal a kétgombos hangosítást és halkítást szeretnénk megvalósítani, célirányosan a volumeup és a volumedown értékeket is használhatod mindenféle extra kutatás nélkül.

Ha elkészültél a kóddal, mentsd el hangero.py néven, és a parancssorban a cd…, valamint a cd könyvtárnév utasításokkal navigálj abba a könyvtárba, ahol ez az állomány található (vagy csak az intézőben ugorj a megfelelő mappába, a címsorba gépeld be a CMD utasítást, és üss egy Entert). Ezek után a py hangero.py utasítással aktiválhatod Python-fájlodat, amely - ha megfelelően készítetted el a kódot - figyeli az Arduino irányából érkező jeleket, gombnyomásra pedig el is kezdi állítgatni a hangerőt.

Kód 1

int gomb1 = 4; int gomb2 = 2;

void setup() { Serial.begin(9600);}

void loop() {

if(digitalRead(gomb1)==HIGH){ Serial.println(1); }

if(digitalRead(gomb2)==HIGH){ Serial.println(2); }

delay(40); }

Kód2

import pyautogui

import serial

monitor = serial.Serial('COM3')        

monitor.baudrate = '9600'

while True:

            data=monitor.readline()

            if data:

                        szam = int(data.decode('utf-8'))

                        if szam== 1:

                                    print('Halkitas\n')

                                    pyautogui.press('volumedown')

                        if szam== 2:

                                    print('Hangositas\n')

                                    pyautogui.press('volumeup')

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.helloworldonline.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.