Hangaktív LED-ek kezelése az Arduinóval
Egy hangérzékeny szenzor aktiválása izgalmas funkciókkal bővíti eszköztáradat. Bemutatunk néhány mintaprogramot, amelyekkel tesztelheted a működését.
Elsőre ijesztőnek tűnhet az a tény, hogy egy aprócska kiegészítő beszerelése után már a mikrovezérlőd is képes hallgatózni, de nem kell amiatt aggódnod, hogy érdemi információkat is rögzít az eszköz mikrofonja, mert a beérkező adatokat a saját kódjaid dolgozzák majd fel. Cikkünkben bemutatunk néhány projektet, amelyek remekül kiaknázzák a hangérzékeny hardverkomponens képességeit, és természetesen a megvalósításukban is segítünk. Szerencsére extra kiegészítőből viszonylag kevés kell, ha leírásunk alapján szeretnéd elkészíteni a projekteket.
Mi az egyszerűség kedvéért a Grove Starter Kitben található Sound-sensort, shield modult, valamint LED-socketet vetettük be, amelybe még egy LED-et is elhelyeztünk. Természetesen számos egyéb hangérzékelő modul közül is választhatsz, de figyelj rá, hogy egy prototípuslapka, elegendő mennyiségű kábel és ellenállás is a rendelkezésedre álljon. Az összeállításban tehát az Unóra pattintott shield-modul D4-es portjához kösd a villogtatni kívánt lámpát (shield nélkül ez a 4-es pint jelenti), míg a D2-es jelzésűhöz (2-es pin) a sound-szenzort kapcsold.
Jár a taps
A komponensek összeállítása után először egy olyan szoftvert készíthetsz el, amely tökéletesen imitálja a hangaktivitásra felkapcsoló, majd a következő ingerre sötétre váltó lámpák elvét. Az Arduino IDE indítása után hozz létre egy új programot, és a setup függvény elé ékeld be a változóidat, jelen esetben ezekből háromra lesz szükséged.
Egyik segítségével a csatlakoztatott LED pinjét jelöld meg (int LED=4; ), következővel az aprócska bemeneti hangérzékelőt címkézd fel (int hangSzenzor=2; ), végül pedig egy státuszváltozót is kreálj, amelynek majd a fel és lekapcsolás kontrollálása során lesz jelentős szerepe (boolean LEDallapot=false; ). Ha ezekkel elkészültél, beléphetsz a setup függvény belsejébe, ahol a hangérzékelőt jelző pint bemenetként, a LED-et pedig kimenetként jelöld meg ( pinMode(soundSensor,INPUT); pinMode(LED,OUTPUT); ) és már át is térhetsz a loopra.
A függvényen belül azt kell elérned, hogy az ismétlések során egy bejövő hanghatásra állapotváltást hajtson végre eszköz, és így fel- és lekapcsoljon a lámpád. Ehhez először is fel kell dolgoznod a szenzortól kapott jeleket,a melyeket egy szenzorAdat nevű, szám típusú változóban tárolj el (int szenorAdat=digitalRead(hangSzenzor); ). Mivel jelen esetben digitális bemenetet használunk, az aprócska érzékelőbe rejtett mikrofon két állapottal rendelkezik: 0-val és 1-gyel.
Amennyiben nem érzékel hanghatást, folyamatosan a 0 értéket adja át a szenzor a felületnek, amennyiben valamilyen zajt hall, azonnal 1-re vált. Elágazásodat tehát ehhez a státuszhoz kell igazítanod. A kapcsolgatást tehát csak akkor hajtja végre a szoftver, ha a szenzorAdat változó értéke 1-et vesz fel, minden más esetben újraindul a loop.
Amint 1-es adat érkezett, ismételten szükséged lesz egy elágazásra, amely az aktuális LEDallapot változó értéke alapján eldönti, hogy most épp a dióda fel- vagy lekapcsolása következik. Mivel kezdetben hamisra állítottad az értékét, így első körben érdemes a feltételben is a fals értékkel ellenőrizni az egyezést, ha pedig belépünk ebbe az ágba, akkor máris átállíthatsz néhány értéket. Egy sornyi kóddal áramot vezethetsz a diódádba (digitalWrite(LED,HIGH); ), míg a LEDallapot változót szintén egy ilyen rövidke értékadással állíthatod igazra (LEDallapot =true; ).
Az else ágban ezek után már csak annyi a teendőd, hogy az előzőleg módosított értékeket most az ellentétes állapotukba kapcsolod, vagyis a diódád áramellátását megvonod a digitalWrite(LED, LOW); parancs begépelésével, ezenkívül pedig a LEDallapot változót false-ra állítod. Hogy a gyors egymás utáni érzékelés ne okozzon anomáliákat, az else után egy kis késleltetést is érdemes beszúrnod (delay(500); ). Ha mindent hibátlanul begépeltél, akkor el is készült az alkalmazásod, amely egy kis tapsikolás hatására képes kapcsolgatni a LED-lámpádat.
Diszkófény
Most, hogy már láttad, milyen egyszerű a LED aktiválása és deaktiválás, egy kicsit mélyebben is beleáshatod magad a lehetőségekbe, és egy ritmuslámpa elkészítésével is megpróbálkozhatsz, mely az éppen játszott dallamot követi le villogásával. Ehhez tökéletesen használható alapot kínál az előzőekben bevetett kód, csupán a loopban kell pár dolgot módosítanod a sikerhez.
Elsőként az adatok beolvasásának folyamatát kell megváltoztatnod, hogy ne csak a kételemű opciókat, hanem konkrét értékeket kapj a sound-szenzorról érkező adatfolyamban, vagyis a digitálisról analógra kell váltanod ( int szenzorAdat=analogRead(hangSzenzor); ). A feltételeket egyelőre törölheted, jelenleg ugyanis nem lesz rá szükséged, helyette egy map függvényt kell meghívnod, mely a nyelv beépített funkciói között a rendelkezésedre áll.
Segítségével azt érheted el, hogy a változó alsó és felső korlátai egy általad meghatározott intervallumon terülnek majd el. Jelen esetben a beérkező adatfolyam 0 és 1023 közötti adatait érdemes kicsit tömöríteni, és a végeredményt a 0-255 intervallumra átállítani (szenzorAdat = map(szenzorAdat, 0, 1023, 0, 255); ). Utolsó lépésként a kiíratási folyamatot kell elindítanod (analogWrite(LED, szenzorAdat); ), és már készen is áll az eszközöd a dallamok fogadására. Mivel folyamatosan szeretnéd változtatni az értékeket, mindenképp figyelj arra, hogy késleltetést még véletlenül se hagyj a kódodban, hisz így torzulhat a kapott eredmény.
A csend hangja
Amennyiben már találkoztál decibelmérő eszközzel, biztosan tisztában vagy vele, hogy - speciális laboratóriumi körülményeket leszámítva - bizonyos mértékű háttérzaj minden esetben van a környezetedben. Ezt az értéket pedig a mikrofonod is képes mérni, így elsőként nem lesz más teendőd, mint egy aprócska statisztikát készíteni arról, hogy mekkora is ez az adott zaj a környezetedben, ez segít ugyanis majd számszerűsíteni, hogy mennyire kell szűkítened a rendelkezésedre álló - 0 és 1023-as értékek közötti eredmény produkálására képes - eszközödön az intervallumot.
A tapsaktivált LED-ed kódját mindössze annyiban kell módosítanod e referenciaérték előállításához, hogy létrehozol egy extra változót var, illetve egyet szenzorAtlag néven, mindkettőt 0-ra állítod, majd a setup függvényben aktiválod a soros monitort (Serial.begin(9600); ). A loopban így már csupán annyi teendőd marad, hogy a szenzorAtlag-hoz minden körben hozzáadod az aktuálisan mért értéket, és egy adott intervallumon (mondjuk 100 ismétlés után) ezt az összeget leosztod a mérések számával, és kiíratod a soros monitorra. Persze, ezt követően ne felejtsd el lenullázni a var és a szanzorAtlag értékeket, hogy az első eredmény megjelenítése után is folytatódjanak a mérések, illetve a digitális olvasások helyett itt is analógot használj majd.
Ezzel kapsz egy átlagos értéket, amit egy akár okostelefonos decibelmérő alkalmazással összevethetsz, hogy kiderítsd, ez a mért alapzaj a valóságban mekkora hangzavart jelent. Ezek alapján aztán egy map függvénnyel szűkítheted a szoftvered mérési intervallumát, sőt némi fizikatudással akár elindulhatsz egy saját decibelmérő készítésének irányába is.
Kód 1
int hangSzenzor=4; int LED=2; boolean LEDallapot =false;
void setup() { pinMode(hangSzenzor,INPUT); pinMode(LED,OUTPUT); }
void loop() { int szenzorAdat =digitalRead(hangSzenzor);
if(SensorData==1){
if(LEDStatus==false){ LEDStatus=true; digitalWrite(LED,HIGH); }
else{ LEDStatus=false; digitalWrite(LED,LOW); }
delay(1000); } }
Kód 2
int hangSzenzor=4; int LED=2; boolean LEDallapot =false;
void setup() { pinMode(hangSzenzor,INPUT); pinMode(LED,OUTPUT); }
void loop() { int szenzorAdat =analogRead(hangSzenzor); szenzorAdat = map(szenzorAdat, 0, 1023, 0, 255); analogWrite(LED, szenzorAdat); }