2. Egyszerűbb kísérleti projektek

2.1. Az elektromos áram

Némi egyszerűsítéssel élve az anyag atomokmól áll, az atom pedig pozitív töltésű protonokat tartalmazó atommagból és a körülötte keringő negatív töltésű elektronokból áll. A protonok és elektronok száma az atomban általában megegyezik, így kívülről nézve semleges (se nem pozitív, se nem negatív) össztöltése van. Ha valamilyen módon elvonunk néhány elektront egy atomból, az egyensúly felborul, a semlegesség megszűnik, az atom töltése pozitív lesz.

És fordítva, ha valahogy bepaszírozunk egy atom elektonfelhőjébe plusz elektronokat, akkor annak az atomnak negatív töltése lesz. 

Közismert, hogy az azonos polaritású töltések taszítják, az ellentétes polaritású töltések pedig vonzák egymást.

Az elektromos áram nem más, mint elektromos töltéssel rendelkező részecskék rendezett áramlása. A fémekben és más vezetőkben az elektromok lazábban kötődnek az atomokhoz (szabad elektronoknak is hívják őket), ezért alkalmasak elektromos áram átvitelére. Ha egy vezetőn áram folyik át, akkor az gyakorlatilag azt jelenti, hogy elektromos töltésű részecskék áramlanak át rajta. A vezetőn egységnyi idő alatt átáramló töltés mennyiségét áramerősségnek (current) hívjuk, I-vel jelöljük a képletekben és amper-ben (vagy miliamperben) mérjük.

Az áramlás kiváltó oka az úgynevezett feszültég (voltage) vagy potenciál-különbség, amit egy árramforrás szolgáltat. Ez azt jelenti, hogy az egyik póluson elektron felesleg (negatív pólus, va gy más néven föld (groud)), a másikon pedig elektronhiány (pozitív pólus) van. A rendszer törekszik az egyensúlyra, ezért az elektonok áramlása megindul a negatív pólustól a pozitív irányba. Ennek ellenére az áram megállapodás szerinti technikai iránya a pozitív >> negatív irány. A haladásuk során a töltött részecskék akát munkát is hajlandók végezni az áramkörbe kapcsolt fogyasztók révén, csakhogy átjussanak a pozitív oldalra. Ezt nevezzük elektromos áramnak. Végül kialakul az egyensúlyi állapot, a feszültség csökken, az elem lemerül. A feszültség jele a V, mértékegysége pedig a volt. Az elektromos hálózat feszültsége 230V, aminek az érintése életveszélyes!!

Az elektronok mozgása a vezető közegben nem akadálymentes, pl. beleütköznek már részecskékbe. A vezető anyagától függ, hogy ez mennyire gyakran következik be. Ezt a jelenséget hívjuk elektromos ellenálásnak (resistance). Az ellenállás jele az R, a mértékegysége Ohm (Ω). Az áthaladáskor végzett munka lehet fénydióda világítása, hangszóró hangja, relé bekapcsolása, motor tengelyének forgatása, stb. Ha egy áramkörben kicsi az ellenállás vagy nincs fogyasztó, rövidzár (short circuit) keletkezhet. Ekkor ellenállás hiányában nagy áram folyik át az áramkörön, ami kárt tehet az áramkörbe kötött alkatrészekben.

Ilyen esetekre szoktak beiktatni egy biztosítékot az áramkörbe, hogy túlfeszültség esetén az menjen tönkre (vagy szakítsa meg a zárlatos áramkört). 

Az áramerősség, feszültség és ellenállás közötti összefüggést az Ohm törvénye (Ohm's law) írja le, mely szerint:

U = R * I vagy R = U / I

Az áramerősség, feszültség és ellenállás fogalmait, illetve az Ohm törvényt az alábbi videó mutatja be.

2.2. Az ellenállás

Az ellenállás a legegyszerűbb, áramkörökben használt elektronikai alkatrész, az a funkciója, hogy korlátozza az áramkörön átfolyó áram mennyiségét. Többféle alakban fordul elő, a bekötési polaritása tetszőleges lehet. Az ellenállás mértékét mégmérhetjük multiméterrel vagy kiszámolhatjuk a színsávok alapján ezen a weboldalon, vagy egy kis gyakorlattal mi magunk. Ellenállással tudjuk például védeni a LEDjeinket túlfeszültség ellen, mivel azoknak nagyjából 2V feszültségre és max. 20mA áramerősségre van szükségük. Ehhez az áramköreinkben 220Ω és 360Ω közé eső ellenállást fogunk használni, a szükséges értéket az Ohm törvénye alapján lehet kiszámolni.

2.3. Üzenetküldés a számítógépre

Általában miután feltöltöttük a programunkat az Arduino kártyára, a működéshez nincs szükségünk a számítógépre, leszámítva a tápellátást (de ez kiváltható egy teleppel). Ezzel együtt néha jól jöhet (pl. hibakeresésnél), ha a kártyánk tud a számítógéppel kommunikálni, hiszen az Arduino-nak nincs képernyőre, ahol a működésével kapcsolatos információkat jeleníthetne meg. Ez a kommunikáció az USB kapcsolaton kereszüli soros kommunikációként valósítható meg mindössze három utasítással. 

  • Az első utasítás a Serial.begin(9600). Ez rendszerint a setup() függvénybe kerül és inicializálja a soros kapcsolatot. Az egyetlen paraméter a kapcsolat sebessége jel/másodpercben megadva (bitráta). Az alapértelmezett érték 9600.

  • A 2. és 3. soros kommunikációban használt utasítás a Serial.print(parSzöveg) és Serial.println(parSzöveg), amelyek a soros kapcsolatra küldik a paramáterként kapott szöveget, önmagában, vagy megtoldva egy újsor karakterrel. Ezeket a függvényeket rendszerint a loop() függvényben szoktuk meghívni.

​Az ezekkel a parancsokkal küldött üzeneteket PC oldalon az Arduino IDE Serial Monitor funkciójával jeleníthetjük meg (jobb szélső gomb az IDE menüsorában). A soros monitorban ugyanazt a bitrátát kell megadnunk, amit az arduino oldalán állítottunk be a Serial.begin() hívással, csak így lesznek képesek kommunikálni az eszközök egymással. Alább látható egy egyszerű példa a soros kommunikáció használatára.

 
atom.png
short_circ.jpg
 
 
serial_output1.png

A fenti kódban a következő új elemekkel találkoztunk:

  • egész változók deklarálása az int parancssal

  • változó értékének növelése egyel a ++ operátor segítségével

2.4. Analóg bemenet olvasása

Az Arduino Uno kártya 6 db analóg bementet tartalmaz, amelyekre különböző analóg eszközöket csatlakoztathatunk. Ilyen eszköz lehet például a potméter (potentiometer), melynek tekererőgombjának állásától függően alacsonyabb vagy magasabb értéket tudjuk kiolvasni. A két végállás között alapesetben a kiolvasott érték 0-1023 között változhat, de ez a tartomány módosíható, ha például kisebb felbontásra van szükségünk. Sokféle változata létezik a potméternek, a képen látható egy próbapanelre szerelhető változat.

 
pot_meter.jpg

Építsük meg az alábbi ábrán látható áramkört. A két szélső láb a tápellátást (+5V és GND) biztosítja, a középső pedig a mért értéket adja vissza.

task_green.png
serial_circuit.png

Nyissuk meg az IDE-ben a 01. Basics --> AnalogReadSerial vázlatot.  Az új elem a vázlat kódjában az analogRead() függvény használata. Az általa visszaadott érték 0 és 1023 közé fog esni a tekerőgomb állásától függően, ezek az értékek jelennek meg a soros monitorban is.

task_green.png
serial_output2.png

2.4.1. gyakorlat

Cseréld fel a potméter két szélső lábának bekötését. Figyeld meg, hogy mi történik a leolvasott értékekkel.

 

2.4.2. feladat
 

A 13. és GND pinekbe rakj egy fénydiódát. Módosítsd úgy a programot, hogy ha az analóg lábról beolvasott érték 800 fölé emelkedik, világítson a LED, illetve ha 800 alá sülyed, kapcsoljon ki. A feladathoz szükséged lesz az if-else utasításra, melynek formája a következő:

download.png
 

2.4.3. feladat
 

Fejleszd tovább az előző feladatban megépített áramkört úgy, hogy a probapanelen három LED legyen vezérelhető. Ügyelj arra, hogy mindhárom ledet egy-egy ellenállással védd a túlfeszültségtől az 1.5 pont alatt ismertetett módon. Az áramkör kapcsolási rajza pl. a  következő lehet:

f_2_2_2.png

A LED-ek a potméterről beolvasott érték függvényében világítsanak az alábbiak szerint:

  • 0-200 között: egyik LED se világítson

  • 201-500 között: az 1. LED világítson

  • 501-800 között: az 1. és 2. LED világítson

  • 801-1023 között: mindhárom LED világítson

download.png
 

2.5 Vezérlés nyomógombbal

Az előző projektekben megtanultuk, hogy az Arduino kártya hogyan tud vezérelni digitális kimenetet (és azokon keresztül pl. LED-eket) és használtunk egy potmétert is analóg érték beolvasásához és feldolgozásához. Egy másik gyakran használt beviteli elektronikai alkatrész a nyomógombos kapcsoló. Ez egyszerűen zárja vagy nyitja a lábain áthaladó áramkört, attól függően, hogy a gomb le van-e nyomva vagy sem. A projektjeinkben az alábbi típusú nyomógomb kapcsolót fogjuk használni.

 
push_button.png

Az egymással szemben lévő lábak folyamatosan össze vannak kötve, az egymás mellett lévőket tudja a kapcsoló bontani vagy zárni. Építsük meg az alábbi áramkört. Ha lenyomjuk a gombot, a LED kigyullad mindenféle kód nélkül. Ez érthető, mert az áramkört az Arduino csupán táplálja, az érzékelők és kimenetek nincsenek használva, semmilyen feltöltött kódra sincs szükség. Ennek a megoldásnak pont ez a hátránya: a működést nem tudjuk vezérelni, kódból befolyásolni, mivel le sem tudjuk kérdezni a kapcsoló állapotát. 

btn_circuit1.png

Rakjuk össze az alábbi egyszerű áramkört, majd nyissuk meg az IDE-ben a 01. Basics --> DigitalReadSerial vázlatot, a forráskódban a nyomógomb pinjét állítsuk be az általunk használt hármasra. A vázlat annyit csinál, hogy beolvas a 3. pinről egy digitális értéket és azt kiírja a soros portra. 

btn_circuit2.png

A beolvasott értékből következtetni kellene tudnunk a nyomógomb állapotára. A soros monitorból azt látjuk, hogy a beolvasott érték lenyomott állapotban nullára vált, ez jó. Viszont felengedett állapotban a beolvasott értékek véletlenszerű nullák és egyesek. Ennek megvan a fizikai magyarázata, de ebbe most nem megyünk bele. Ahhoz, hogy különbséget tudjunk tenni a lenyomott és felengedett állapot között, azt kellene elérnünk, hogy felengedett állapotban konzisztensen egyeseket olvassunk be. Ezt a legegyszerűbben úgy tehetjük meg, hogy a kapcsoló pinjének módbeállításánál a pinMode(buttonPin, INPUT) helyett a 

pinMode(buttonPin, INPUT_PULLUP) parancsot használjuk. Ha ezt az apró módosítást végrehajtjuk, akkor stabil módon vagy nullát, vagy egyet olvasunk be a kapcsoló pinjéről a gomb állásának függvényében, ahogy ezt a soros monitorban is láthatjuk.

Most helyezzünk el egy LED-et a 13-as és GND pinekben, majd töltsük be 02. Digital --> Button vázlatot. A vázlatban cseréljük le a kapcsoló pin módját INPUT_PULLUP-ra és a sorszámát az általunk éppen használt pin sorszámára. A forráskód az alábbihoz hasonló lesz:

Ellenőrizzük le a programunkat és töltsük azt fel a kártyára. Ha mindent jól csináltunk, a gomb lenyomásakor a LED világítani fog. Az előző projekt forrásprogramjához képest itt a következő új elemekkel találkozunk:

  • egész konstansok deklarálása a const int parancssal

  • érték beolvasása bemeneti lábról a digitalRead függvénnyel.

2.5.1. gyakorlat

Érd el, hogy a LED viselkedése fordított legyen, azaz felengedett nyomógombnál világítson, lenyomottnál pedig ne.

download.png
 

2.5.2. gyakorlat

Próbálj meg összerakni egy a fentihez hasonló áramkört három leddel és az őket vezérlő nyomógombokkal .

download.png
 

2.6. Szervomotor használata

A motorok segítségével mozgásba hozhatjuk a projektünket, okos járművet, robotot építhetünk. Többféle elektromotort különböztetünk meg:

  • Váltóáramú (AC) motor: jellemzően ipari felhasználásúak, az elektromos hálózatból közvetlenül tápláltak.

  • Egyenáramú (DC) motor: egyenárammal hajtott motorok, kisebb feszültséggel működnek, jelemzően játékokban, kisebb háztartási eszközökben használtak. Tudjuk szabályozni a forgás sebességét és irányát, mást nem. 

  • Szervomotor: Szemben a DC motorral, a szervomotornál le tudjuk kérdezni és be is tudjuk állítani a tengely pillanatnyi állását. Viszont a tengely elfordulása korlátozott, legtöbbször max. 180 fokos.

  • Léptető motor: ugynazt tudja, amit a szervomotor, de az elfordulás nem korlátozott. Hátránya, hogy összetettebb és drágább, mint a DC vagy szervomotor.

Itt a szervomotorral ismerkedünk meg, az általunk használt típus így néz ki:​

 
servo.jpg

Szervomotorokat elsősorban hobbiprojektekben használtnak, például távirányítású autók kormánzásához vagy repülőgép modellek magassági kormánylap szögének beállításához. Az utobbi időkben a robotikában is gyakran alkalmazzák, például robotkarok mozgatásához. A szervomotor három kivezetéssel rendelkezik, a barna a GND-ra kötendő, a piros az 5V-ra, a sárga pedig a vezérlő digitális pinre. Az alábbi kód bemutatja a szervomotor használatát:

A következő új elemekkel találkozunk a fenti forráskódban:

  • Az #include <Servo.h> utasítással beemeljük azt a könyvtárat, amely rendelkezésünkre bocsát pár egyszerű függvényt a szervókezeléshez és elrejti előlünk a megvalósítás bonyolult részleteit

  • Servo myservo; utasítással létrehozunk egy a motorunkat reprezentáló Servo típusú objektumot, amelyen keresztül vezérelhetjük azt

  • myservo.attach(9); parancs hozzárendeli a szervónk vezérlését a 9. pinhez

  • myservo.write(pos); utasítás beállítja a szervómotor tengelyének szögét.

  • for utasítással ciklukosat szervezhetünk más programozási nyelvekhez hasonlóan.

​Töltsük fel a vázlatunkat a kártyára. A motor "sepregető" mozgásba kezd.

2.6.1. gyakorlat

Kísérletezz a szervomotor forgási sebességének és szögtartományának megváltozta-tásával.

 

2.6.2. feladat
 

Építs egy áramkört, amelyben egy szervomotor és egy potméter van az Arduino kártyához kötve. A szervomotor tengelyének elfordulását szabályozza a potméter tekerőgombjának az állása. A teljesen "letekert" pozíciónál (ahol a beolvasott analóg érték 0) a motor álljon 0 fokos pozícióba, a "feltekert" potméter (1023-as beolvasott analóg érték) pedig feleljen meg a szervomotor 180 fokos állásának.

Tipp: Használjuk a map() függvényt, amellyel a potméterről beolvasott jel 0-1023 értéktartományát megfeleltethetjük a szervomotor tengeléynek 0-180 fokos elfordulásának.

download.png
 

2.6.3. feladat
 

Építs egy áramkört, amelyben egy szervomotor és egy nyomógomb van az Arduino-hoz csatlakoztatva. A szervomotor sorompóként funkcionáljon, azaz ha lenyomjuk a gombot, záródjon le, ha bedig felengedjük, akkor nyíljon fel. 

download.png
 

Az alábbi videó bemutatja, hogy egy kis kreativitással milyen izgalmas projekteket lehet megvalósítani a szervomotorokat felhasználva.

 

2.7. Analóg kimenet generálása

Eddig a digitalWrite() függvényt használtuk arra, hogy a kimeneti pinekre LOW vagy HIGH  jelet küldjünk. Előfordul viszont, hogy ettől a két szélsőértéktől eltérő analóg jelet szeretnénk kiküldeni. Ez például akkor lehet hasznos, ha egy LED fényerejét, vagy egy DC motor forgási sebességét akarjuk befolyásolni. Erre a célra az analogWrite() függvényt használhatjuk. A függvénynek két paramétere van: az első a pin sorszámát, a második pedig a kiküldendő értéket tartalmazza. Ez utóbbi a 0-255 tartományba eshet.

Az analóg kimenet előállítása a kártya számára nehezebb feladat, mint a digitális jel kiküldése és csak néhány pin támogatja ezt. Kártyatípusonként eltérő, hogy mely pineket használhatjuk az analogWrite() függvénnyel. Ezeket PWM-et támogató portoknak hívjuk és a  kártyán egy hullámvonallal (~) vannak jelölve. A PWM a Pulse Width Modulation (impulzus-szélesség moduláció) nevű technika rövidítése, amely lehetővé teszi, hogy analóg jelet szimuláljunk digitális jel nagyon gyors ki-be kapcsolgatásával. Az időnek azt a százalékát, amíg a jel bekapcsolva van, működési ciklusnak (Duty Cycle) hívjuk. 

Eddig egy LED-et csak ki vagy bekapcsolni tudtuk, de nem tudtuk beállítani a fényességét. Nézzük meg, hogy hogyan tudjuk változtatni egy LED fényerejét a PWM technikára épülő  analogWrite() függvény felhasználásával. Rakjunk össze egy áramkört, amelybe egy LED-et kötünk be egy ellenálláson keresztül a szokásos módon. Ügyeljünk arra, hogy PWM-et támogató pint használjunk. Másoljuk be az Arduino IDE-be az alábbi kódot:

pwm.png

2.7.1. gyakorlat

Próbáld ki, hogy mi történik, ha nem PWM-et támogató pin-t használsz.

download.png
 

2.7.2. feladat
 

Építs egy áramkört, amelyben egy PWM pinüre kötött LED és egy potméter van. Írj olyan programot, amellyel a potméterrel lehet szabálozni a LED fényességét.

download.png
 

2.7.3. gyakorlat

Multiméterrel mérd le a LED lábain, hogy hogyan változik a feszültség. Mérjük meg a működési ciklust különböző analóg értékeknél (pl. 255, 128, 50). 

 

2.8. Fotoellenállás használata

Ha a szerkezetünknek reagálnia kell a fényviszonyokra, használhatunk fotoellenálást, (photoresistor, light-dependent resistor) amely például így nézhet ki: 

 
pcc.jpg

A fotoellenállás egy olyan fényérzékeny anyagot használó elektronikai komponens, amelynek az elektromos elleneállása csökken a ráeső fény mennyiségének növekedésével. Az ellenállás pillanatnyi értékét analóg jelként tudjuk beolvasni. Ehhez speciálisan kell bekötnünk a fotoellenállást: az egyik lábra 5V feszültséget küldünk, a másik lábat egyrészt egy analóg pin-re kötjük (erről fogjuk beolvasni a mért értéket), másrészt egy 10KOhm-os ellenenálláson át a GND-be vezetjük. 

photores_circ.jpg

Ahogy a potenciométer esetében is, az analogRead() függvény által beolvasott érték itt is a fénymennyiségtől függően a 0-1023-as tartományba fog esni. 

2.8.1. feladat
 

Építsd meg a fenti áramkört. Írj olyan programot, amely a fotoellenállás beolvasott értékétől függően bekapcsolja a LED-et, ha túl sötét van (pl. a beolvasott érték nagyobb, mint 500), egzébként pedig kikapcsolja azt. Módosítsd úgy a programot, hogy PWM segítségével a LED fényereje arányos legyen a fotoellenállást érő fény mennyiségével.

download.png
 

2.9. RGB LED-ek használata

Léteznek olyan LED-ek, amelyeknek a színét mi állíthatjuk be programból, ezeket a három alapszín (Red-Green-Blue) után RGB LED-eknek hívjuk. A gyakorlatban ez három, egy tokba szerelt LED-et takar. Az egyes színeknek megfelelő LED-ek fényerejének szabályozásával (a 0-255 tartományban) "keverhetünk ki" színeket.

Az RGB LED-eknek két fő típusa van a közös anóddal (CA), illetve a közös katóddal (CC) rendelkező. E két típus külsőre ugyanúgy néz ki, ha nem tudjuk, hogy melyik típussal rendelkezünk, egy próba során kideríthetjük. Mi a CC változatot fogjuk használni.

 
rgb2.png

 

Az RGB LED-ek lábkiosztása a fenti ábrán látható, néhány modell esetében ez sajnos eltérhet. Annak ellenére, hogy a három alapszín LED-je egy tokba került, ezeket egy-egy ellenállással a már  megszokott módon védenünk kell a túlfeszültségtől. 

Létezik olyan változata is az RGB LED-nek, amely egy lapon tartalmazza már a feszültségkorlátozó ellenállásokat és így egyszerűbb a használata a próbapanelon.

Rakjuk össze az alábbi áramkört:

rgb_mod.jpg
rgb_circ.png

Másoljuk be az Arduino IDE-be és futtassuk az alábbi kódot: 

A fenti kódban egy fontos újdonság található: létrehoztunk egy saját color() függvényt, amely három paramétert vár: a beállítandó szín piros, zöld és kék komponensének a 0-255 közé eső értékét. A függvény hasonló a Scratch-ben és AppInventor-ban megismert saját blokk fogalmával. Ennek köszönhetően egy szín beállításához csak egy utasítást kell leírnunk, nem hármat. Épp ezért a függvények nagyon meg tudják növelni a programírás hatékonyságát.

2.10. Hanggenerálás

Hanghullámokat úgy kelthetünk, hogy adott frekvenciájú változó feszültséget küldünk egy hangszóróra. Többféle hangszóró létezik, az Ardunio projektjeinkben egy apró, berregőnek (buzzer) nevezett alkatrészt fogunk használni.

 
buzzer.jpg

A hangkeltés elektronikai hátterével szerencsére nem kell részletekbe menően foglalkoznunk, mivel az Arduino beépített függvényei elfedik azokat és lehetővé teszik, hogy inkább a "mit" kérdésre koncentráljunk a "hogyan" helyett. 

 

Kössük a berregőt a kártya nyolcas és GND pinjére ügyelve a polaritásra. A legfontosabb hangkeltéshez használt Arduino függvény a tone(). Ennek a függvénynek van kétparaméteres és háromparaméteres változata. A háromparaméteres változat így néz ki:

 

tone(pin, frekvencia, idő)

 

Pl. a tone(8, 600, 1000) függvényhívás egy másodpercen át fog megszólaltatni egy 600 Hz-es hangot. A hang megszólaltatása után a program rögtön folytatódik, nem várja meg a 3. paraméterben megadott idő leteltét, ezért rendszerint a tone() függvényhívást egy delay() függvényhívás követi, amelynek paramétere megegyezik a tone() 3. paraméterével.

 

kétparaméteres formában az idő paraméter elhagyható a függvényhívásból, viszont ekkor nekünk kell kikapcsolnunk a hangot a noTone(pin) függvényt meghívva. Mindkét forma használatára látunk példát az alábbi vázlatban.

2.10.1. gyakorlat

Töltsd rá a kártyánkra a fenti vázlatot és értsük meg a működését. Kísérletezz a konstansként használt értékekkel: változtasd meg a frekvenciatartományt, a lépésközt, a hang hosszúságát. Figyeld meg, hogy a generált hang hogyan változik. 

 
 

2.10.2. feladat
 

Rakj össze egy potmétert és egy berregőt tartalmazó áramkört. Olvasd be az analóg bemenetről a potméter értékét és szólaltass meg egy azzal arányos magasságú hangot a 30-5000 Hz tartományból. Használd itt is a map() függvényt.

Mérd le a generált frekvenciát multiméterrel.

 

2.10.3. gyakorlat

Nyissd meg az IDE-ben a 02.Digital --> toneMelody vázlatot. Láthatjuk, hogy pl. a 4. oktáv C hangja NOTE_C4-ként van megadva. Figyeld meg, hogy a melody tömb tartalmazza a lejátszandó hangokat, a noteDurations tömb pedig a hang hosszakat (egész, fél-, negyed-, nyolcadhang, stb).  

Módosítsd úgy a programot, hogy játsza le a Boci-boci-tarkát.

2.10.4. feladat
 

Építsük egy berregőt és egy-egy kék és piros LED-et tartalmazó áramkört. Írjunk egy programot, amely szírénázó hangot generál és közben azonos ütemben a LED-eket villogatja . 

 
3. fejezet >>