Arduino kezdőknek 7 – Adattípusok, analóg bemenetek alapjai, soros monitor használata
Szilágyi Sándor Zoltán Villamosmérnök, mérnök-informatikus
A cikket megírtam: 2022. 06. 08-án
A Rádiótechnikában megjelent: 2022. június-július dupla számban
Ez a blog oldal tehát az eredeti, saját tulajdonomban levő dokumentum, és nem a nyomtatásban megjelent másolata. A cikket én írtam, én küldtem be, és csak azután jelent meg nyomtatott formában is. A nyomtatásban megjelent cikkeimre szerződést nem kötöttek velem, és anyagi juttatást se kaptam soha érte. Mivel a magazin már nem kapható, ezért a megjelent 13 cikkemet itt folytatnám, mivel Magyarországon jelenleg nincs hobbielektronikával foglalkozó magazin.
Az előző cikkel befejeztük a multivibrátorokat. Mielőtt komolyabb digitális technikai alkalmazásokba kezdenénk, meg kell ismerni az analóg bemenetek kezelését is. Ezenkívül az alapokhoz tartozik az egyes változó típusok ismertetése is.
7.1. Adattípusok
A programozásban változókat használunk különböző értékek, adatok tárolására. Ezek olyan memória területek, melyeknek változhat az értéke. Viszont minden változónak van egy előre deklarált típusa is. Tehát a változó csak olyan értéket vehet fel, ami egyezik a típusával.
Mint a második cikkemben írtam (Rádiótechnika 2022/3, Arduino kezdőknek 2.), deklarációnál a változó típusát és nevét is megadjuk, míg a definíciónál a változóhoz értéket rendelünk, azaz olyan értéket, ami megegyezik a típusával.
7.2. Az Arduino adattípusai
Logikai adattípus:
- bool: két értéket vehet fel, ezek a „true” és a „false”. 1 byte memóriát foglal.
- boolean: nem szabványos adattípus az Arduino-k esetében. A referencia ajánlása szerint a bool-t használjuk helyette.
Egész számú adattípusok:
- byte: 1 byte-on (8 biten) tárol előjel nélküli számot 0 – 255-ig.
- word: pozitív számot tárol 2 byte-on 0 – 65 535 -ig
- short: 2 byte-on tárol, értéke elvileg megegyezik az int típussal. Gyakorlatilag mégis van köztük egy kis különbség, mégpedig az, hogy a short board-tól függetlenül mindig 16 bites, míg az int a lentebb említettek alapján board-tól függően lehet 16- és 32 bites is.
- int: számok tárolására az elsődleges adattípus (integer) az Arduino Reference alapján. 2 byte-ot (16 bitet) foglal el a memóriában. Értéke -32 768 – +32 767 között lehet. Kivétel az Arduino Due és a SAMD alapú board-ok, mert ott 4 byte-ot (32 bitet) foglal el. Az integer típus memória mérete tehát platformfüggő.
- unsigned int: Atmega alapú board-oknál 2 byte-on tárol pozitív számokat 0 – 65 535 -ig. Arduino Due esetében itt is 4 byte-on tárol, mégpedig 0 – 4 294 967 295-ig.
- long: nagyobb méretű számokat tudunk tárolni benne, 4 byte-on. Értéke: - 2 147 483 648 – +2 147 483 647 között lehet.
- unsigned long: pozitív számokat tárolhatunk benne 4 byte-on 0 – 4 294 967 295 -ig.
Lebegőpontos számú adattípusok:
- float: lebegőpontos számok tárolására használjuk. Tárolás 4 byte-on történik, -3.4028235E+38 – 3.4028235E+28 között.
- double: dupla pontosságú lebegőpontos szám tárolását teszi lehetővé. Atmega alapú board-oknál 4 byte helyet foglal el, Due típusú board-oknál viszont 8 byte-ot.
Szöveges adattípusok:
- char: Egy szöveges karakter tárolására képes. Értékadás kétféle lehet, vagy ' '-közé kell tenni az adott karaktert, vagy aposztrófok nélkül meg kell adni az adott karakter ASCII kódját. 1 byte-on tárol.
- unsigned char: a byte adattípussal megegyezik. Számokat tárolhatunk benne 1 byte-on 0 – 255-ig. Az Arduino referencia ajánlása szerint inkább a byte típust használjuk helyette.
- string: a referencia szerint szöveget kétféleképpen tudunk tárolni, az egyik a String() típus alkalmazása, a másik egy tömb, aminek az elemei char típusúak.
- String(): a referencia elég sokféle felhasználást ad. Pl szöveget tárolhatunk vele, amit idézőjelek közé teszünk. Konvertálhatunk vele char típusú értéket String() típusúra, összeláncolhatunk vele string-eket. Megadhatunk karaktereket ASCII kód alapján, illetve át lehet vele konvertálni decimális számot hexadecimálissá vagy binárissá.
Egyéb típusok:
- array: A tömb azonos típusú elemekből áll, ahol az egyes elemek indexelhetőek, és az indexük segítségével hivatkozhatunk az egyes elemekre. Jele a szögletes zárójel [], és az elemeit kapcsos zárójelek közt soroljuk fel, vesszővel elválasztva.
- size_t: egy olyan adattípus, ami képes bármilyen objektum méretét byte-okban ábrázolni. Példa a size_t használatára a sizeof() és a Serial.print() visszatérési típusa.
- void: bár a referencia szerint csak eljárások meghívására használható, valójában a függvények meghívására is ezt használjuk. A void-szó semlegest jelent, azaz eljárást, az Arduino Reference írja is, hogy nincs visszatérései értéke. (A függvényeknek van visszatérési értékük, az eljárásoknak nincs.) Korábbi cikkeimben már írtam, pl a főprogramot is vele hívjuk meg. „void loop()” viszont a megszakítási függvényt is: pl a „void intr()”-t az előző cikkemben.
7.3. Analóg beviteli eszközök
19. Program: az első analóg bemenet és a soros monitor
A digitális alapok bemutatása után az analóg alapok következnek. Szintén csak modell szinten, konkrét alkalmazások később. A modellekre az alapok megismerése miatt van szükség.
Az első, és legegyszerűbb analóg beviteli eszköz a potenciométer (vagy potméter). Ez egy ellenálláspálya, aminek egy bármely közbenső pontjáról adott ellenállás értéket vehetünk le. A feladatban egy 10K-s szénréteg potmétert alkalmaztam (ha lehet akkor inkább lineáris legyen), illetve kézi tekerésű változatot (csavarhúzót nem igényel), mert az kényelmesebb a kísérletezéshez. Az áramkör rajza a 30. ábrán látható. A potméter két végpontját 5V-ra, illetve GND-re kötjük, míg a középső pontját (csúszka) az A0 analóg bemenetre. A program a 31. ábrán látható.
Ellenőrzés, majd feltöltés után a TX led is felvillan a panelon. Az 5V rákerül a potméter egyik végpontjára, majd az áramkör a másik végpontján át a földponton záródik, illetve a középső pontja az A0 analóg bemenetre megy. Elforgatva a csúszkát, megváltozik a középső ponton levő feszültség, így az A0-ra menő jel értéke is. Ha a csúszóérintkező az 5V-ra kapcsolt pontnál helyezkedik el, akkor 5V-ot ad le az A0 felé (most a vezeték ellenállása és a potméter belső érintkezési veszteségeitől eltekintünk). Ha átforgatjuk a másik irányba, szintén ütközésig, azaz a GND-re kapcsolt pontig, akkor közel 0V-ot fog leadni. A board tartalmaz egy AD átalakítót, ami az analóg bemenetről beolvasott értéket (azaz feszültség értéket) egy 0-1023 közötti számmá alakítja át. 0V esetén tehát 0-át, 5V esetén 1023-at ad, köztes állapotban pedig az adott értékhez tartozó 0-1023 közötti értéket.
30. ábra
31. ábra
3 db változót deklarálunk, melyek közül az aktuális feszültség értékét tároló float adattípusú. Erre azért van szükség, mert a soros monitor két tizedes jegyig fogja kijelezni az adott értéket (valós időben).
A setup részben egy új, eddig nem használt sor látható. „Serial.begin(9600);”. Akkor gépeltük be jól a parancsot, ha az első szó vastag narancssárgára változott, a középső szó sima narancssárgára, köztük a pont, illetve a zárójeles rész fekete maradt. Ezzel tehát az adatsebességet állítjuk be bit/sec-ben soros adatátvitelhez. A zárójelben levő szám az adatsebesség: 9600 bit/sec.
A főprogramban az első sorban a „value” nevű változóba beletesszük A0 értékét. Ezután jön a float adattípusú „voltage” változó feltöltése egy olyan értékkel, melyet a program alapján számol ki, azaz az A0-ról beolvasott majd eltárolt értéket megszorozza az 5,0/1023,0 hányadossal. A program ezzel le is futott, azaz az ismétlődő (loop) rész kezdődik elölről, forgatva a potmétert, újabb és újabb értékeket olvas le és dolgoz fel. Mivel itt még nincs se led, se más kimeneti eszköz, ezért az Eszközök menü / Soros monitor-ra kattintva egy kis ablakban ellenőrizhetjük az aktuális feszültség értékeket, egymás után, egy oszlopban (32. ábra). Az ablakban több dolgot is beállíthatunk, pl sávszélességet (az átállítást nem ajánlom), új sort, vagy akár meg is állíthatjuk/újra elindíthatjuk az értékek kiírását.
32. ábra
Felhasznált irodalom:
https://www.arduino.cc/reference/en/
https://www.arduino.cc/reference/en/language/variables/data-types/bool/
https://www.arduino.cc/reference/en/language/variables/data-types/int/
https://www.arduino.cc/reference/en/language/variables/data-types/long/
https://www.arduino.cc/reference/en/language/variables/data-types/short/
https://www.arduino.cc/reference/en/language/variables/data-types/word/
https://forum.arduino.cc/t/using-the-short-data-type-in-arduino/42950
https://www.arduino.cc/reference/en/language/variables/data-types/byte/
https://www.arduino.cc/reference/en/language/variables/data-types/char/
https://www.arduino.cc/reference/en/language/variables/data-types/boolean/
https://www.arduino.cc/reference/en/language/variables/data-types/string/
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
https://www.arduino.cc/reference/en/language/variables/data-types/unsignedchar/
https://www.arduino.cc/reference/en/language/variables/data-types/unsignedint/
https://www.arduino.cc/reference/en/language/variables/data-types/unsignedlong/
https://www.arduino.cc/reference/en/language/variables/data-types/void/
https://www.arduino.cc/reference/en/language/variables/data-types/float/
https://www.arduino.cc/reference/en/language/variables/data-types/double/
https://www.arduino.cc/reference/en/language/variables/data-types/size_t/
https://www.arduino.cc/reference/en/language/variables/data-types/array/
Ezek mindegyike a 2022. 06. 02-i állapot szerinti.
https://www.arduino.cc/reference/en/language/functions/communication/serial/begin/
https://www.arduino.cc/en/Tutorial/BuiltInExamples/ReadAnalogVoltage
Ezek mindegyike a 2022. 06. 06-i állapot szerinti.
Angster Erzsébet: Objektumorientált tervezés és programozás – Java 1 (2. kiadás, 2002)
A cikket megírtam: 2022. 06. 08-án
A Rádiótechnikában megjelent: 2022. június-július dupla számban