💻 Arduino programozás - Ganzduino

Utoljára frissítve: 2024. 06. 29. 19:42:52

Az Arduino egy szabad szoftveres, nyílt forráskódú elektronikai fejlesztőplatform, arra tervezve, hogy a különböző projektekben az elektronikus eszközök könnyebben hozzáférhetőek, kezelhetőek legyenek. Széles tömegek számára elérhető, mivel olcsó, könnyen beszerezhető, egyszerűen programozható, és csatlakoztatható más eszközökhöz.

Az Arduino eszközöket a saját programnyelvén az Arduino-n és többek között a GIM által kifejlesztett Ganzduino grafikus nyelven lehet programozni. Bár az Arduino nyelv nagyon ahsonló a C++-hoz, pár különbség mégis van. Ennek a segédletnek a célja, hogy az mindkét nyelv és függvénykészlet alapvető elemeit bemutassa.

A segédlet végén összegyűjtöttünk pár valós alakalmazásokra hasznos kódpéldát ill. egyszerű, komplett programokat, amelyek azonnal kipróbálhatóak és (remélhetőleg) megkönnyítik az Arduino felprogramozását.

A segédletet a Ganz Ifjúsági Műhely készíti és teszi nyilvánossá. A segédletet szerkeszti: Kimmel Gábor.

A tartalomhoz hozzájárultak:

  1. Kimmel Gábor (kimmelgabor@gmail.com)
  2. Kiss Attila (werdase@gmail.com)

Eszközbemutató

Az összes Arduino (és a velük kompatibilis egyéb eszköz, pl. az ESP32) mikrokontrollerekre épül. Ezek gyakorlatilag mini-számítógépek, processzorral és memóriával. Egy asztali PC-hez vagy egy okostelefonhoz kéepst nagyon lassúak, de nagyon olcsóak is, ezért egyszerűbb feladatokra, ahol programozni kell sokkal alkalmasabbak kisebb költségü és helyigényük miatt.

Az Arduinók négyféle módon tudnak a külvilággal kommunikálni. Az egyik a számítógéphez csatlakoztatott USB/soros kommunikáció. A második és harmadik a digitális és analóg portok, a negyedik egyéb, a soroshoz hasonló kommunikációs interfészek.

Digitális portból a legalapabb Arduino paneleken 14 darab található, ezekből általában 12 szabadon felhasználható (a 0 és 1 lábakat a PC-s kommunikáció használja). Ezek az Arduino szemszögéből lehetnek bemenetek (inputok) és kimenetek (outputok) is. Ha kimenet pl. ledeket lehet vele villogtatni, ha bemenet pl. kapcsolók, nyomógombok értékeit lehet vele megnézni.

A digitális eszközök két értéket tudnak felvenni. Ezeket többféleképpen is hívják, az egyik esetben nincsen feszültség, a másikban van.

TODO

Az analóg portok csak bemenetek tudnak lenni. Ellentétben a digitális portokkal amiknek csak kétfaja értékük lehet, 0 és 5 volt között több mint 1000 különböző értéket tudnak felvenni. 0 volt esetén az értékük 0, 5 volt esetén 1023 lesz. Az arudinók egy különlegessége, hogy az A0, A1, A2, A3, A4, A5 analóg portokra 14, 15, 16, 17, 18, 19 portszámokkal is tudunk hivatkozni.

Kommunikációs protokollokat kezdőként aránylag ritkán használunk, de a leggyakoribbak amiket Arduinón keresztül elérünk az SPI és az I2C.

Alapszabályok

Pár egyszerű szabály betartásával már el tudjuk kezdeni az Arduino nyelven írt programunk írását:

  • Egy parancsanak egy blokk felel meg
  • Blokkokat vagy egymás mögé vagy egymás mellé lehet csatlakoztatni.
  • A több blokkot fogadni képes blokkok elfordított "U" alakúak:

  • Elágazás egy ha és egy ha-különben blokk áll rendelkezésre:

  • Ciklusokhoz két blokk áll rendelkezésre, az egyik egy feltételt vizsgál a másik adott számszor ismétel:

  • Az Arduino programnak legalább a két következő blokkot kell tartalmaznia:

  • Az Aurduino rendszernek van egy nagy halmaz előre elkészített függvénykészlete.
  • Kommentet az erre speciális blokkal lehet létrehozni:

Jót teszünk magunknak és másoknak, ha a következő tanácsokat is betartjuk:

  1. A változónevek legyenek mindig egyértelműek.
  2. Mindig használjunk kommenteket. Nem muszáj minden sort kommentelni, de az összetartózó részek legyenek leírva, hogy mi mit csinálnak.
  3. Ha gyakran ismétlünk bizonyos részeket, törekedjünk arra, hogy metódusba szervezzük ezeket a részeket - NE a kódrészletet másoljuk le többször!

Nyelvi elemek listája

TODO

Változók, típusok

Típusok


A számítógép memóriája szigorúan véve csak egész számokat tud tárolni, de okos tervezéssel tudunk törtszámokat, karaktereket, szöveget, sőt, ennél összetettebb adatfajtákat is használni.

Logikai típusok


Egy darab logikai típus létezik, a bool. Ennek értéke igaz vagy hamis lehet, egy rombuszról ismerhető fel.

Számszerű típusok


A számszerű típusok a következők:

  • int: integer, egész számokat tud tárolni, hashtag (#) jelről ismerhető fel.

  • float: tört számokat is tud tárolni, 1/4 jelről ismerhető fel.

Karakteres típusok


Két karakteres típus létezik:

  • char: egy darab karakter tárol, jele ©

  • string: szöveget, vagyis több karaktert tárol, jele ""

Tipp!

Léteznek más, bonyolultabb típusok is, de ezek a GanzDuinóban nincsenek támogatva!

Változók


Egy program alapvetően parancsok egymás utáni végrehajtása, de hamar eljutunk odáig, hogy bizonyos értékeket, adatokat, állapotokat tudnunk kéne elmenteni és később hozzáférni. Tehát egy program - amíg csak megírjuk - addig parancsok egy sorozata, viszont amikor már futtatjuk, használjuk, igazából parancsok és adatok egy csoportja.

Adatok tárolására változókat tudunk használni. Ezek egyfajta "címkék", amik megmondják, hogy egy adott nevű adat hol helyezkedik el a számítógép memóriájában. Ha tárolni vagy elkérni akarjuk az adott változóját akkor elég csak a címke helyén megnézni mi van a memóriában.

Változókat nekünk kell kézzel létrehozni ha használni akarjuk őket. Először meg kell adni a típusukat, utána az azonosítójukat vagy nevüket. Egyből ezután érdemes nekik értéket is adni (ld Értékadás). A legjobb olyan értéket adni, amiről tudjuk, hogy az az alapértelmezett érték, tehát "valós" körülmények között nem fordulhat elő. Ha pl. 0-5 közötti számokat akarunk a változóba írni, egy jó alapértelmezett érték a -1.

Hozzuk létre a változót a "Változó létrehozása"" gombbal:

Adjuk meg a nevét és típusát a felugró ablakban:

Ezután már használhatjuk a változónkat:

Tipp!

A GanzDuinóban csak globális változókat lehet létrehozni!

Műveletek

Értékadás


Egy változót nem elég csak létrehozni, értéket is kell adni neki, hogy használható legyen. Egy változó értéke többféleképpen módosítható.

A legegyszerűbb értékadás, amikor egyértelműen megadjuk a változó értékét:

Aritmetikai műveletek


Az aritmetikai műveletek olyan műveletek, amiket számokon lehet használni. Mivel az Arudino nyelvben a legtöbb adat amivel dolgozunk számszerű, ezért a legtöbb változón használhatóak. Eredményük mindig egy igaz-hamis érték lesz. Leginkább fletételek írására használhatjuk ezeket a műveleteket.

A kettő legfontosabb ilyen művelet az egyenlőség- és különbözőségvizsgálat. Két további ilyen művelet a nagyobb- illetve kisebb vizsgálat.

Logikai műveletek


Az Arduino nyelv egy erősen kapcsolásokhoz kapcsolódó nyelv. Emiatt logikai függvényeket is lehet vele írni.

A logikai függvények alapvetően három műveletet ismernek

  1. ÉS (AND)
  2. VAGY (OR)
  3. NEM (NOT)

Ezekből lehet további műveleteket lérehozni

  1. ÉS-NEM (NAND)
  2. VAGY-NEM (NOR)
  3. EGYENLŐ (EQU)
  4. KÜLÖNBÖZŐ (XOR)

Érdekes módon az Arduino (és C++) nyelvben nincs logikai változótípus. Helyette használható bármelyik szám, ahol a 0 a hamis, bármelyik másik érték (pl. 1) az igaz értéket jelenti. Így már lehet írni logikai kifejezéseket is. Ezeket több jel feldolgozására, vagy feltételek írására lehet használni. Érdemes viszont mindig egy igaz értéket használni, mert az EGYENLŐ és KÜLÖNÖZŐ műveletek számszerű egyenlőséget vizsgálnak!

A kódrészletek között találsz egy egyszerű logikai típus implementációt!

A nyelvben a három alapvető, ill. az egyenlőség és különbözőség-vizsgálatra beépített parancsok vanak. A NAND és NOR kifejezéseket ezekből lehet létrehozni.

Mint a NAND és NOR kifejezéseken látható, a logikai műveletek szabadon kominálhatóak egymással. A műveletek sorrendje balról jobbra halad.

Bitműveletek


Mivel a mikrokontroller digitális lábait felfoghatjuk biteknek is (0 és 1 értékeik lehetnek), ezért a mikrokontrollereknél kiemelkedően fontos műveletek a bitek manipulálása. Sok esetben kisebb és gyorsabb kód írható, ha jól tudunk bárrni a bitek alacsony szintű kezeléséhez való eszközökkel

Két számot nem csak matematikailag lehet kombinálni, hanem bitentént is - ÉSelni és VAGYolni.

TODO

Ennél még hasznosabb, ha egy változó bitjeit tudjuk eltolni. Ez, ha számszerűen nézzük a változókat teljesen véletlenszerű eredményeket ad, de ha bitenként nézzük, akkor nehéznek gondolt feladatokat lehet meglepően egyszerűen megcsinálni.

TODO

Egy nagyon egyszerű Knight-Rider kódrészlet például valahogy így nézne ki (ld. Elágazáskezelés):

TODO

Elágazáskezelés

Ha meg akarunk vizsgálni egy változót, hogy mi az értéke, vagy attól függően, hogy mi az értéke, más és mást akarunk csinálni az if, else, és switch parancsokat használhatjuk.

If és else


A következő kód egy villogót valósít meg. Ha az i változó értéke 1, akkor világít a led, ha 0 nem. A következő lépéshez megcseréljük az értékét a változónak és várakozunk.

Ciklusok


A programozás egy másik alapja, hogy bizonyos műveletek egymás után többször, adott esetben ismeretlen sokszor kell ismételnünk.

Honnan tudhatjuk, hogy 3-zor kell villogtatni a ledet? Lehet, hogy a felhasználó akarja beállítani, hogy hány villogás legyen. Egyszerű kódisméléssel erre már nem tudunk felkészülni. Erre és hasonló feladatokra valóak a ciklusok.

While ciklus


Tegyük fel, hogy soros porton akarunk beolvasni adatot. Ehhez először küldünk egy olvasási kérelmet, és ezután megvárjuk, hogy megérkezzen az adat. Hogyan kezeljük, ezt a várakozást?

TODO

Ezzel a megoldással két baj van: ha gyorsan megjö az adat, akkor hiába vártunk 1 másodpercet. Másrészt semmi garancia nincs rá, hogy 1 másodperc alatt megjön az adat. Szerencsére a soros portnak van egy available metódusa, ami a még be nem olvasott karakterek számát jelzi. Tehát addig kell csinálnunk a semmit, amíg nincs mit beolvasni. Ezt a while paranccsal tudjuk megtenni.

TODO

A while parancs hasonlóan működik mint az if, azzal a különbséggel, hogy egészen addig fogja ismételni a benne lévő parancsokat, amíg a megadott feltétele igaz.

A while ciklusnak vagy egy ritkábban használt változata, a do-while. Ez egyszer mindenképpen lefut, utána pedig a feltételtől függően még többször (vagy másodszor már nem). Általában nem ajánlott használni, ezért ebbe a segédletbe nem kerül be.

For ciklus


A for ciklus alapvetően nem sokban különbözik a while ciklustól. Igazából csak egy rövidítés, de nagyon hasznos tud lenni, mert rövidebbé és olvashatóbbá teszi a kódot

A fenti három ciklus megegyezik. A for ciklus egyszerűen használható pl. olyan ciklusokban, ahol sorszámokra van szükségünk:

Ez sorrendben ki fogja írni 0-9 számokat és mindössze 5 sor kód. Ha az első 100 számot szeretnénk kiíratni - egy hosszú, de ismétlődő folyamat - akkor is ugyanígy nézne ki a kód, csak a feltétel részt kéne átírni. Ez sokkal átláthatóbb, mint 100 sorban ugyanazt minimális változtatással leírni.

Ahogy volt már róla szó, tömböket kifejezetten hasznos a ciklusokkal, egész pontosan a for ciklussal használni. Nagyon egyszerű pl. n darab elem kezelése (keresés, sorbarendezés, sorban kiírás stb.).

TODO

An unhandled exception has occurred. See browser dev tools for details. Reload 🗙