Az arduinós médiavezérlés rejtelmei

|

Lespórolták a billentyűzetedről a multimédiás gombokat? Sebaj, könnyen pótolhatod őket mikrovezérlőddel.

Temérdek lehetőség létezik arra, hogy az Arduinóból valamilyen, a számítógéped kontrollálására alkalmas kiegészítőt fabrikálj, amellyel különösebb gond nélkül végrehajthatsz akár egészen nyakatekert, specifikus feladatokat is. Természetesen akadnak olyan mikrokontrollerek, amelyek mindenféle extra trükk nélkül, egyetlen könyvtárhívással lehetővé teszik számodra a Windows-vezérlést, a legnépszerűbb lapka, az Uno azonban nem segíti a munkádat ilyen beépített funkciókkal.

Aggodalomra viszont semmi ok, kiskapukat könnyen találhatsz, főként akkor, ha nemcsak az Arduino IDE-ben mozogsz otthonosan, hanem a Python nyelvet is ismered. Cikkünk segít, hogy a két környezet eszköztárának profi társításával megalkothass egy multimédiás vezérlőként bevethető kiegészítőt.

Elkerülhetetlen előkészületek

Szükségtelen hardveres pluszkomponensekből feltankolnod, ha csupán az alapfunkciókat szeretnéd elérni (persze nincs annak akadálya, hogy bővítsd a projektedet), mindössze egyetlen gombot és egy potenciométert kell a mikrovezérlőd mellé csapnod. Előbbi felel majd azért, hogy szüneteltethesd a lejátszást, míg utóbbival a hangerőt módosíthatod.

Ami pedig a feladat szoftveres részét illeti, először is gondoskodnod kell az Arduino fejlesztői környezetének (arduino.cc/en/software), valamint a Python és néhány kiegészítőjének beszerzéséről. Utóbbival kapcsolatban azt javasoljuk, hogy 3-as főverziójú csomaggal vágj bele a fejlesztésbe, ily módon garantáltan eléred majd azokat a funkciókat, amelyeket ebben a cikkben is megemlítünk.

Ha installáltad a környezetet, következhet a szükséges extrák telepítése. Ehhez nyiss egy parancssori ablakot (a Start menü keresőjébe írd be a CMD kulcsszót), és ellenőrizd a Python csomagtelepítőjének zavartalan üzemelését a pip -version parancs begépelésével. Amennyiben nem kapsz eredményt, akkor még ezt a komponenst is installálnod kell (használd a python -m ensurepip --default-pip utasítást).

Ha minden rendben, jöhetnek a kiegészítő komponensek: sorban elsőként telepítsd a soros monitor elérésére kiképzett pyserialt (pip install pyserial), majd jöhet a rendszer vezérléséhez elengedhetetlen pyautogui is (pip install pyautogui), és már készen is állsz a szoftverek összeállítására. Remélhetőleg nem ütközöl semmilyen problémába a telepítések során, ám ha mégis, akkor a parancssorban megjelenő hibaüzenetben részletes információt kapsz arról, melyik komponens okozta a galibát, és erre a világhálón némi keresgélést követően hamar találsz orvosságot.

Lejátszás megállítása

Az egyszerűbb feladat egyértelműen a videó szüneteltetése és újraindítása lesz. Mivel a legtöbb szoftverben a szóközgomb leütése szolgál erre, a Pythont is arra kell majd treníroznod, hogy ezt hajtsa végre. De még mielőtt belevágnál ebbe, jöjjön az Arduinóra szánt program. Nyisd meg a fejlesztői környezetet, és indíts egy új projektet.

A start() függvény elé helyezz el két változót, az egyikkel a gombodhoz tartozó csatlakozót jelöld meg (int buttonPin = 2;), a másikkal ennek a beviteli komponensnek az aktuális állapotát fogod monitorozni (int buttonState = 0;). A következő lépésed már a setup() belsejébe vezet, ahol a soros monitort kell útjára indítanod (Serial.begin(9600);), illetve a gombot felcímkézned (pinMode(buttonPin, INPUT);).

Ha ez is megvan, akkor vár a loop(), ahol az ismétlődő részben olvasd be és tárold el a gomb aktuális állapotát (buttonState = digitalRead(buttonPin);), majd egy feltételben vizsgáld meg a lenyomás hatására kapott HIGH értéket (if (buttonState == HIGH) {}), és ha ebbe az ágba lép a szoftver, akkor küldd el a 999-es adatot a soros monitorra (Serial.println(999);). Utolsó lépésként egy kis késleltetés hiányzik csupán ahhoz, hogy lezárd ezt a programrészt (delay(100);). Ezzel elkészült az Arduinóra szánt szoftvered, elindíthatod a feltöltést, és ellenőrizheted a gombnyomásra megjelenő számot.

Következhet a Python-kód szerkesztése, amihez a Notepad++ (https://notepad-plus-plus.org/downloads) igénybevételét javasoljuk, de persze céljaidnak megfelelően akár fejlesztői környezetben is dolgozhatsz. Az üres állomány első két sorába emeld be a serial (import serial) és az autogui (import autogui) csomagokat.

A kapcsolat létesítéséhez a következő sorban használd a ser = serial.Serial('COM3', 9600, timeout=.1) utasítást (feltéve, hogy az Arduino a COM3-as porton csatlakozik számítógépedhez). Hogy ne álljon le a program, indíts el egy végtelen ciklust (while True:), ezek után pedig jöhet a beolvasás (data = ser.readline()[:-2]). Amennyiben érkezett adat (if data:), és ez az adat megegyezik a 999-el (if data.decode("utf-8")=="999":), akkor a szoftverrel nyomd le a space-gombot (pyautogui.press('space')).

Ezzel lényegében kész a programod első változata, az indítás és a megállítás már működik.

Hangosan vagy halkan

Az összeállításba épített potenciométert se hagyd pihenni, belőle fogod ugyanis kialakítani a tekerhető hangerőszabályzót. Elsőként navigálj az Arduino IDE felületére, ahol a megállítást és az újraindítást már tökéletesen kivitelező kódot kell néhány további sorral kiegészítened. A kód elején hozz létre pár plusz változót: elsőként nevesítsd a kis tekerőt (int potpin = A0;), majd adj hozzá két egész szám típusút, ezekben az adatokat fogod tárolni (int val, oldVal;). A setup részt érintetlenül hagyhatod, és egyből a loop() belsejébe ugorhatsz.

Itt a val változóba olvasd be a tekerő aktuális állását (val = analogRead(potpin);), az értékskálát pedig szűkítsd le némileg (val = map(val, 0, 1023, 0, 50);). Azért válassz 50-es skálázást, mert a pyautogui hangerőszabályzója minden gombnyomás alkalmával két egységet csökkent, illetve növel a hangon, így egyszerűbb lesz 0 és 100 között állítgatni az értékeket. Egy feltételvizsgálatban hasonlítsd össze a val és az oldVal értékét, ha pedig nem egyeznek, akkor a soros monitorra írd ki az új adatot (if(oldVal!=val){ Serial.println(val);}), végül állítsd be az új értéket az oldVal=val; segítségével.

Most már az adatküldési résszel is végeztél, a kód mehet fel az Arduinóra, és jöhet az utolsó simítás a Python programon. Az editor megnyitása után hozz létre még a végtelen cikluson kívül egy last nevű változót, és ez vegye fel a 100 értéket. Ha készen vagy, a 999-es adat vizsgálathoz készíts egy else ágat, ahol elsőként tárold el egy adjust nevű változóban az utoljára mért adatod és a fogadott szám különbségét (adjust=last-int(data.decode("utf-8"))).

Amennyiben a szám a rendelkezésedre áll, akkor indíts egy for ciklust, amelyben ennek a számított eltérésnek az abszolút értékéig haladsz végig az elemeken (for i in range(abs(adjust)):), ezen belül pedig feltételben vizsgáld az eredeti differencia előjelét. Ha ez nullánál kisebb (if adjust<0:), akkor halkíts (pyautogui.press('volumedown')), máskülönben tekerd fel a hangerőt (pyautogui.press('volumeup')). Utolsó lépésként mentsd el az aktuális hurokban kapott értéket (last=int(data.decode("utf-8"))), és már kész is van a szoftver, jöhet a tesztelés.

Arra mindenképpen figyelj, hogy a soros monitor ne fusson az Arduino fejlesztői környezetében, mert blokkolja a Python felületének olvasási képességeit. Amennyiben mindent megfelelően hajtottál végre, akkor az indítás és a megállítás is működik, a potméter tekergetésével pedig állíthatod a hangerőt.

Kód

import serial

import pyautogui

ser = serial.Serial('COM3', 9600, timeout=.1)

last=100

data = ser.readline()

while True:

            data = ser.readline()[:-2]

            if data:

                        if data.decode("utf-8")=="999":

                                    pyautogui.press('space')

                        else:

                                    adjust=last-int(data.decode("utf-8"))

                                    print(data,adjust)

                                    for i in range(abs(adjust)):

                                               if adjust<0:

                                                           pyautogui.press('volumedown')

                                               else:

                                                           pyautogui.press('volumeup')

                                    last=int(data.decode("utf-8"))

 

Kód 2

int potpin = A0; int buttonPin = 2; int buttonState = 0; int val,oldVal;

void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); }

void loop() { val = analogRead(potpin);val = map(val, 0, 1023, 0, 50); buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) { Serial.println(999);}

if(oldVal!=val){ Serial.println(val);}

oldVal=val; delay(100); }

 

Ú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.