Kosárpalánk felokosítása az Arduinóval
Egy egyszerű sporteszközt is okosabbá tehetsz, csupán lépésről lépésre követned kell a cikkben foglaltakat.
Szépen lassan a klasszikus labdajátékok is elmozdultak az IoT irányába, és bizony ma már a futball-, a kosár- és a kézilabdapályákon is számos digitális eszköz segíti a sportolók felkészülését, valamint a mérkőzések zavartalan lefolyását. Persze arra is létezik megoldás, hogy jelentősen kisebb költségvetésből okosítsd fel házilag különféle sportszereidet. Ezen az oldalpáron arra mutatunk példát, hogyan alakíthatsz át egy kosárpalánkot egy Arduino és néhány kiegészítő segítségével olyan eszközzé, amely képes számolni a találatokat.
Ahogy te szeretnéd
A projekt egyik nagy előnye, hogy számos megközelítéssel belefoghatsz, ezért már az eszközbeszerzés során javaslunk néhány olyan hardverelemet, amelyekkel hasonló módon elérheted a végeredményt, de részletesebben csak az egyik metódust fejtjük ki. Amire mindenképp szükséged lesz, az valamilyen kijelzésre alkalmas komponens.
Szinte teljesen mindegy, milyen megoldást választasz, a trükkösen összekapcsolt LED-lámpáktól a pontmátrix kijelzőkön át egészen az érintőképernyőkig bármi működhet, amivel képes leszel a beérkező adatokat kiíratni (mi egy kétsoros LCD-megjelenítőt állítottunk csatasorba). Ha ez már a felhasználásra készen áll, akkor jöhet egy kicsit komolyabb dilemma, méghozzá a pontok számlálásának módszeréé.
Ezen a téren is szabadjára engedheted kreativitásodat, és a rendelkezésedre álló szenzorok közül kiválaszthatod azt, amelyik a leginkább megfelel a célra. Elsőként talán a legegyszerűbb megoldás, ha egy ultraszenzor segítségével egészíted ki a kosárpalánkot, a megfelelő paraméterezést és elhelyezést követően ugyanis már indulhat is a találatok lajstromba vétele. Ez a módszer együtt jár néhány buktatóval, ám ha sikerül ügyesen elhelyezned a komponenseket a palánkon, illetve a hálón, akkor a legtöbb esetben pontos értéket kapsz majd.
A mi választásunk egy ennél valamivel bonyolultabb, kém- és akciófilmekben látott megoldásra esett. Talán te magad is emlékszel olyan jelenetekre, amelyekben a mindenkori főhős egy lézersugarakkal összekötött riasztóberendezéssel találja szemben magát.
Nos, ez az elképzelés is hasonló, ha ugyanis a kosárpalánkra applikált fényszenzor és az aktivált lézerből érkező sugár kapcsolata megszűnik, akkor valamilyen objektum - jelen esetben a labda - áthaladt a kosárpalánk gyűrűjén, azaz növelheted a sikeres találatok számát. Ehhez a már említett fényszenzort és egy lézert kell beszerezned.
Utóbbit az Arduinóhoz csatlakoztatható komponens formájában is elérheted, de valójában egy sima pointer is megfelel a célra (ekkor viszont meg kell oldanod, hogy folyamatosan nyomás alatt tartsd a lézer aktiválásáért felelős gombot, például úgy, hogy leragasztod). Kelleni fog továbbá valamilyen külső tápegység (elemes átalakító, akkumulátor vagy powerbank), mivel érdemes hordozhatóvá tenni a szerkezetet.
Kezdődhet a kódolás
Amint a fényszenzort sikeresen hozzákapcsoltad a mikrovezérlődhöz, bele is vághatsz a projekt második fázisába. Indítsd el az Arduino fejlesztői környezetét, és hozz létre egy új, üres projektet. A kódfelületen elsőként a setup() függvény előtti sorokban készíts el néhány változót.
Az első amire szükséged lesz, a const int light=A2;, a mely a csatlakoztatott szenzor portját jelöli majd, továbbá helyezz el itt egy számlálót is (int count=0; ), ez a lézer jelének megszakításait segít majd nyomon követni. Ha megvagy mindezzel, át is léphetsz a setup belsejébe, ahol nem lesz más teendőd, mint a soros monitort aktiválni, hogy eljátszhassa a neki szánt szerepet a kezdeti adatgyűjtés során.
Ezek után áttérhetsz a loop()-ba, ahol tárold el a szenzorhoz tartozó beolvasott adatokat egy változóban (int sensorValue=analogRead(light);), majd ezt jelenítsd is meg a soros monitoron, és állíts be némi késleltetést, hogy az adatok ne záporozzanak a képernyőn (delay(100);). Ha sikerrel jártál, jöhet az első elindítás, ami a szenzorról érkező adatok szűrése miatt bír jelentőséggel.
A pontosabb méréshez ajánlott elsötétítésről gondoskodni, hogy csak a lézer felőli irányból érkezhessen fény a szenzor felületére. Mihelyst megvannak az adatok, és kiderítetted, hogy mekkora a leárnyékolt felületet érő lézeres megvilágítás küszöbértéke (nálunk ez 600 volt), jegyezd is fel. Állítsd le a szoftver futtatását, és térj vissza a kódolási környezetbe, a következő lépés ugyanis az lesz, hogy detektálod a lézersugár megszakítását.
Ehhez ugorj a loopra, és a kiíratást követő sorban készíts egy feltételt, amelyben azt vizsgálod, hogy a szenzorról érkező információk mikor esnek a küszöbként beállított érték alá, tehát mikor szakad meg a lézer és a fényérzékelő közötti kapcsolat (if(sensorValue>600){}). Ha a vezérlés ebbe az ágba lép, akkor növelheted a számlálót ( count+=1;).
Mivel nem akarod, hogy amíg a kosárpalánk gyűrűjén áthalad a labda, folyamatosan növekedjék az érték, meg kell oldanod, hogy a lézersugarak a megszakítást követően csak némi késleltetéssel folytassák a pásztázást. Ez történhet úgy is, hogy egy ügyesen kiválasztott, néhány másodpercnyi delayt csempészel a kódba, de ennél elegánsabb megoldás is akad, és akkor nem kell hasraütésszerűen eldöntened, hogy mekkora legyen a kívánt ráhagyás.
Ha például a feltételben beolvasod egy új változóba (int sensorNew=analogRead(light);) a szenzorról érkező információkat, és elindítasz egy ciklust, amely addig fut, amíg ez az érték kisebb, mint a küszöbérték, akkor a késleltetést egészen addig kitolhatod, amíg a sugarak ismételten simogatni nem kezdik a fényszenzor felületét (while(sensorNew<600){sensorNew=analogRead(light);delay(100);}). Bármelyik módszert is válaszd, most már kész a digitális palánk alapja, a megfelelő rögzítést követően pedig már csak a találatok kijelzésére kell időt szánnod.
Írd ki az eredményt!
Mivel a pontok számlálását már elvégzi a szoftver, csupán annyi a teendőd, hogy a kapott eredményt nem a soros monitorra, hanem egy kijelzőre küldöd ki. Csatlakoztasd a kijelzőt a mikrovezérlőhöz, majd térj vissza a szoftver szerkesztői nézetébe. Itt először is csatold a kód elejéhez a kijelző könyvtárát (#include "rgb_lcd.h ), majd az rgb_lcd lcd; utasítással emeld be a képernyőt.
Ezután a setup() belsejében az lcd.begin(16, 2); lcd.setRGB(255, 255, 255); lcd.print("Points"); utasításokkal állítsd be a megjelenítő alapértékeit, végezetül pedig a lcd.setCursor(0, 1); lcd.print(count); utasításokkal még a szenzorértékek beolvasása előtt írasd ki az elért pontszámot. Ennek köszönhetően a pontokat tartalmazó információ csak azt követően frissül, amikor a lézer már ismételten a szenzorra világít. Most pedig veregesd meg a vállad, mert megérdemled; végre összeállt a nagy mű.
Fejlesztési lehetőségek
Mivel előfordulhat, hogy a lézeres megoldás nem minden esetben ad tökéletesen pontos eredményt, hardverelemeidet és a kódodat kiegészítheted egy második lézerrendszer csatlakoztatásával, amit valahol a háló alatt helyezel el, így aztán csak akkor írod jóvá a pontszerzést, ha az első, majd a második ellenőrzési ponton is áthaladt a labda (gondosan figyelve a sorrendre). Amennyiben szeretnéd továbbfejleszteni az eszközt, akkor már a labdát is érdemes lehet érzékelőkkel felszerelned, igaz, ekkor egy újabb megoldandó probléma vár rád: a pattogtatás miatt megrongálódhatnak a szenzorok.
Kód
#include "rgb_lcd.h"
rgb_lcd lcd; const int light = A2; int count=0;
void setup() { lcd.begin(16, 2); lcd.setRGB(255, 255, 255); lcd.print("Points"); Serial.begin(9600);}
void loop() { lcd.setCursor(0, 1); lcd.print(count); int sensorValue=analogRead(light); if(sensorValue<600){count+=1; Serial.println(count); int sensorNew=analogRead(light);
while(sensorNew<600){ sensorNew=analogRead(light); delay(100); } } delay(100);}