A/D konverzió, Arduino analóg jel mérés, Serial port

Szerzők: Makan Gergely, Somogyi Anikó, Dr. Mingesz Róbert és Mellár János
A tananyag elsősorban az Elektronikai alapok programozóknak és a Digitális architektúrák című kurzusokhoz készült, az elsajátításához szükséges idő: 45 perc.

Összefoglalás

A lecke bemutatja az analóg-digitális átalakító (ADC) működését, analóg feszültségek mérését Arduinóval, valamint a soros kommunikációt és használatát. A megértésben képek, szimulációk és egy videó segítenek. A lecke végén önellenőrző kérdések találhatók.

Tartalom

  • Az analóg-digitális átalakító működése
  • Analóg feszültségjel mérése – Arduino kód
  • Soros kommunikáció (UART protokoll)
  • Gyakran használt függvények soros kommunikációhoz
  • Videó analóg feszültség méréséről
  • Önellenőrző kérdések

Ismétlés

Arduino bemutatása tananyag

Az analóg-digitális átalakító működése

Az analóg jel értéke egy bizonyos intervallumon belül bármilyen értéket felvehet és általában feszültséget értünk alatta. Tehát míg például a digitális jel értéke kétféle értéket vehet fel (az Arduino UNO esetében 0 V és 5 V), addig egy analóg tetszőleges értéket felvehet egy adott tartományon belül (az UNO esetén 0 V és a beállításoktól függően maximum 5 V között tudunk mérni).

Analóg feszültség mérésére az Arduinóban megtalálható analóg-digitális átalakítót (ADC) használhatjuk. Az ADC az analóg feszültséget digitális számsorrá alakítja át (egy egész számmá), amit a processzor fel tud dolgozni a programnak megfelelően. A működésének lényege, hogy egy megadott feszültségtartományt sok, kisebb feszültségtartományra bontja fel és összehasonlítással megkeresi, hogy a mérendő feszültség melyik tartományhoz van legközelebb és kimenetként visszaadja az intervallum sorszámát (ADC kód).

Azt, hogy az ADC mennyi egyforma nagyságú, kisebb részre osztja fel a feszültségtartomány az ADC egyik legfontosabb paramétere a felbontás adja meg. A felbontást 2 hatványaként (bitekben) szokták megadni és minél nagyobb az értéke, annál pontosabban tudja megmérni az analóg feszültséget. Az Arduino UNO esetén 10 bites ADC-t használhatunk. Ez azt jelenti, hogy 2^10 = 1024 részre osztja fel az adott feszültségtartományt. A feszültségtartomány nagysága az ún. referenciafeszültségtől függ. Az UNO-n alapesetben 5 V-os az ADC referenciafeszültsége (ez átállítható még 1,1 V-os és külső feszültségre is). A referenciafeszültséget érdemes úgy megválasztani, hogy a mérendő jel maximális értéke minél közelebb legyen a referenciafeszültséghez (minél jobban kihasználja a mérhető tartományt).

A mérés során tehát az ADC visszaad egy egész számot 0 és 1023 (2^10 – 1) között, ami az alap referenciafeszültség esetén megfelel a 0 és 5 V-os feszültségtartománynak. Ahhoz, hogy a mért feszültséget ténylegesen feszültségben, azaz Volt egységben kapjuk meg és ne egy 0 és 1023 közötti számunk legyen, szükség van az ADC kód-feszültség konverzióra. Ehhez csak le kell osztanunk a kapott ADC kódot (X) a felbontással (1024) és megszorozni a referenciafeszültséggel (5 V), azaz V_be [V] = (X / 1024) * 5 V.

Analóg feszültségjel mérése – Arduino kód

Analóg jelek mérésére az A0-A5 kivezetéseket tudjuk használni. A setup függvényben most nem kell beállítanunk a mérendő kivezetést, mert minden kivezetés alapesetben analóg bemenet. Amit viszont a setup függvényben beállíthatunk az a referenciafeszültség értéke. Ezt az analogReference(type) függvénnyel és a DEFAULT (5 V-os feszültség), INTERNAL (1,1 V-os feszültség), EXTERNAL (0 és 5 V közötti tetszőleges külső feszültség) konstansokkal tehetjük meg. Az analogReference függvényt nem kötelező meghívni, ha mérni szeretnénk, mivel ebben az esetben az 5 V-os alapbeállítás érvényesül.

Az analogRead(pin) függvény meghívásával az Arduino a pin bemenetben megadott analóg bemeneten lévő feszültséget egyszer megméri és visszatér az ADC kóddal.

Soros kommunikáció (UART protokoll)

Az UART soros kommunikáció lényege, hogy küldés esetén egy digitális kivezetésen üzenetet küldhetünk azáltal, hogy előállítunk egy digitális jelet, azaz a digitális kimenetet valamilyen időzítéssel logikai magas és alacsony értékek időbeli sorozatát állítjuk elő (üzenet). Egy digitális bemeneten pedig egy másik eszköztől jövő üzenetet olvashatjuk be. A küldés vonalat TX-el, a fogadás vonalat pedig RX-el szoktuk jelezni. Az időzítésnek, azaz a kommunikáció sebességének (baud rate) meg kell egyeznie a küldő és fogadó oldalon, mivel ebben a protokollban nincs órajel vonal, azaz aszinkron a kommunikáció.

Az Arduino UNO esetén az RX a 0-ás kivezetésre, míg a TX az 1-es kivezetésre van bekötve. Ezeken a kivezetéseken tehát valamilyen másik eszközzel is kommunikálhatunk, leggyakrabban azonban a számítógéppel szoktunk kommunikálni. Az Arduino UNO áramköri lapon található egy UART – USB konverter, aminek segítségével az USB kábelen keresztül tudunk üzenetet küldeni a számítógépre, vagy üzenetet fogadni a számítógéptől. Az üzenet küldés azért hasznos, mert az Arduino UNO-n nincs kijelző, így pl. egy mérés eredményét a számítógép monitorán meg tudjuk jeleníteni. A számítógéptől érkező üzeneteket a programban feldolgozva pl. más-más utasítások hajthatók végre az Arduinón, ha megírjuk hozzá a kódot. Az Arduino felprogramozása is az UART – USB konverter segítségével történik.

Az előző tananyagrész végén már volt szó a Soros monitorról és a Soros plotterről. A Soros monitor ablakban szövegesen jeleníthetjük meg a szöveges vagy numerikus adatokat, a Soros plotter ablakban pedig grafikusan jeleníthetjük meg az Arduinótól érkező numerikus adatokat.

Gyakran használt függvények soros kommunikációhoz

A soros kommunikációt a Serial.begin(speed) függvénnyel inicializálhatjuk a setup függvényben. A speed paraméter a kommunikáció sebessége (baud rate), amire léteznek szabványos értékek, ezek közül leggyakrabban a 9600 b/s-os és a 115200 b/s-os értéket szoktuk használni. A 9600-as érték azt jelenti, hogy egy bit időbeli hossza 1/9600 másodperc.

Üzenetet küldeni leggyakrabban a Serial.println(val) függvénnyel szoktunk. A val paraméter az üzenet, ami tetszőleges érték lehet. Ha szöveget szeretnénk küldeni, akkor ahhoz azt aposztróf karakterek közé kell tenni, pl. “abc”. A println függvény az üzenet után még egy sortörést és kocsi vissza karaktert is küld, így a Serial monitor ablakban minden üzenet új sorba kerül.

További UART soros függvények: https://www.arduino.cc/reference/en/language/functions/communication/serial/

Hasznos tudni, hogy a 0 és 1-es kivezetéseket semmi másra nem ajánlott használni, ha a soros kommunikációt is használni szeretnénk és az USB kábel csatlakoztatva van, ugyanis ezek a kivezetések az áramköri lapon lévő UART – USB konverterre is közvetlenül rá vannak kötve.

A következő szimulációban egy analóg feszültségmérést találunk UART üzenetküldéssel. Ha elindítjuk a szimulációt és a Kód ablakban rákattintunk a Soros monitor gombra, akkor láthatjuk a feszültséget egymás alá kiírva, amint az Arduino másodpercenként elküldi egy újabb mérés eredményét.

A következő videóban az analóg feszültségmérést láthatjuk valódi hardverrel.

További segédanyagok az analóg feszültség mérése témakörhöz: http://dx.doi.org/10.6084/m9.figshare.11971794

Results

#1. A mérést megelőzően az analóg jel értéke 0 és 1023 közötti egész szám lehet.

#2. Az ADC kód arányos a mért feszültség nagyságával, azaz minél nagyobb a mért feszültség, annál nagyobb az ADC kód.

#3. Melyik referenciafeszültég hiányzik a beállításokból?

#4. Igaz-e a következő állítás? Ha nagyobb a referenciafeszültség értéke, akkor nagyobb ADC-kódot kapunk a mérendőfeszültség mérése során.

#5. Mekkora nagyságú feszültséget tud maximum megmérni az Arduino?

#6. Igaz-e a következő állítás? Az UART kommunikáció során nem ájánlott általános digitális kimenetként használni a 2-es és 3-as kivezetéseket.

#7. Melyik lépés szükséges mindenképp az analóg feszültség mérése során?

#8. Mekkora ADC kódot kapunk, ha 5 V-os referenciafeszültség mellett 2,5 V-os feszültséget kötünk a mérendő bemenetre.

finish