Fórum ElektroLab.eu

Arduino v praxi – obsluha modulu displeja

Arduino v praxi – obsluha modulu displeja
TME S.r.o. Pridal  TME S.r.o.
  126 zobrazení
1
 0
Arduino a príbuzné platformy

Hotové zariadenie sa skladá z funkčných blokov, ktoré sa často používajú opakovane. Napríklad, ak postavíme frekvenčný merač s mikrokontrolérom, budeme potrebovať takmer rovnaké komponenty ako pri budovaní časového relé, okrem bloku zosilňovača. Hovoríme o mikrokontroléri s „prostredím“ (odpory, kondenzátory, kremík a iné), displejom, tlačidlami a konektormi. Samozrejme, frekvenčný merač nebude potrebovať relé, ktoré zapína externé zariadenie, ale časové relé širokopásmového vstupného zosilňovača, jadro zostane pritom rovnaké. Kľúčom k tvorbe aplikácií na vlastnú päsť je pochopiť, ako každý funkčný blok funguje a potom kombinovať ich funkcionality.

Platformy ako Arduino nevyžadujú, aby používateľ vedel, ako jednotlivé komponenty fungujú. Základnú dosku môžete jednoducho pripojiť k rozširujúcemu modulu/nadstavbe a spustiť funkčnú aplikáciu. Na druhej strane, ak nemáte ani základné znalosti o komponentoch, potom v prípade problémov s fungovaním vášho zariadenia ste odsúdení na blúdenie naslepo. Pri rozhodovaní o komponentoch Arduino najčastejšie očakávame rýchly efekt. Je ťažké zosúladiť takéto očakávania s potrebou získať správne vedomosti, pretože stačí zadať niekoľko príkazov, aby ste videli prvé účinky na displeji, ale pochopenie, prečo sa to stalo, niekedy vyžaduje veľa času.

Vzhľadom na poznámku opísanú vyššie bude každý z článkov v tomto cykle rozdelený na dve časti. V prvej uvedieme, ako dosiahnuť efekt o ktorom bola reč v článku. Druhá časť predstaví, ako komponent alebo riešenie funguje.

Začneme s LCD modulom, pretože vďaka nemu môžete vidieť účinok vykonanej práce najrýchlejšie. Ďalej budeme diskutovať o ďalších prvkoch používateľského rozhrania a neskôr o vybraných externých systémoch – senzoroch a aktuátoroch. Medzitým sa zoznámime aj s niektorými trikmi a metódami programovania. A to všetko na báze platformy Arduino, ktorá je lacná, ľahko dostupná a navyše vám umožní využiť získané znalosti na vybudovanie hotových zariadení alebo ich prototypov.

Modul znakového LCD displeja

Základné rozhranie medzi mikrokontrolérom a používateľom sa zvyčajne skladá z displeja a tlačidla alebo tlačidiel. Ako nie je ťažké uhádnuť, ten prvý sa používa na informovanie používateľa o činnostiach mikrokontroléra, zatiaľ čo pomocou tlačidiel – niekedy nahradených impulzátorom – a môžete zadávať príkazy alebo údaje. V ponuke je veľa displejov (vrátane tých, ktoré sú vybavené dotykovým panelom), ale prvým neformálnym štandardom sa stali znakové displeje s ovládačom typu HD44780.

V prvom príklade programovania použijeme dosku Arduino UNO R3, kontaktnú dosku (tzv. breadboard), 2-riadkový LCD modul so 16 znakmi a niekoľko prípojných káblov. Samozrejme, je to len návrh – displej môže byť akýmkoľvek spôsobom pripevnený, dokonca ho je možné len napájkovať na dosku. Tu bola použitá metóda, ktorá dáva najväčšiu možnosť úpravy a zmeny rozloženia pripojenia.

Ak má modul displeja spájkované goldpiny, jednoducho ho zapojíte do kontaktnej dosky. Potom pripojíte displej k doske Arduino UNO, ako je popísané v tabuľke 1.

Tabuľka 1. Pripojenia znakového displeja k doske UNO Arduino

Číslo kontaktu displeja Názov signálu displeja Názov kontaktu Arduino Názov signálu Arduino
[1] VSS Power GND
[2] VDD Power +5V
[3] V0 Power GND
[4] RS Analog In A4 (PC4)
[5] R/W Power GND
[6] E Analog In A5 (PC5)
[7] DB0
[8] DB1
[9] DB2
[10] DB3
[11] DB4 Analog In A0 (PC0)
[12] DB5 Analog In A1 (PC1)
[13] DB6 Analog In A2 (PC2)
[14] DB7 Analog In A3
[15 (voliteľne)] LED+ Power 3.3V
[16 (voliteľne)] LED- Power GND

 

Nezabúdajte, že ak máte napríklad GND z napájacieho konektora Power na kontaktnú dosku, môžete sa pripojiť v rámci kontaktnej dosky a nemusíte sa zakaždým pripájať ku konektoru napájania Power.

Je potrebné použiť napájací konektor Power, pretože z neho budete čerpať energiu na napájanie displeja. Konektor Analog In je namontovaný hneď vedľa neho, takže pre pohodlie bolo rozhodnuté použiť výstupy mikrokontroléra, ktoré sú na ňom k dispozícii. Nenechajte sa však zmýliť názvom – na ovládanie modulu displeja sú potrebné digitálne výstupy, nie analógové vstupy/výstupy. Konektor sa nazýva Analog In, pretože má voliteľné analógové vstupy, ale môže byť nakonfigurovaný tak, aby fungoval v iných režimoch vrátane digitálnych výstupov. Analógový vstup A0 je teda port PC0, A1 je PC1 atď. (pozri: výstupy mikrokontroléra ATmega328PU).

Medzi mnohými možnosťami dostupných softvérových ovládačov pre Arduino, na ovládanie prevádzky displeja bola zvolená knižnica[LiquidCrystal]. Po vytvorení náčrtu ho pripojíte k prvému riadku programu pomocou príkazu #include. Po pripojení displeja k mikrokontroléru, ako je popísané vyššie, budete pripravení urobiť prvý ovládací náčrt modulu LCD displeja.

Dosku Arduino pripojte k USB portu vášho PC. V ponuke Arduino vyberte položku Súbor a potom Novýé (Ctrl+N). Na obrazovke sa zobrazí okno podobné obrázku 1. Kľúčové slovo void vám napovedá, že tu bude vytvorená funkcia, ktorá nevráti žiadnu hodnotu. Za slovom void nasleduje názov funkcie a zátvorka „{” označuje začiatok funkcie a zátvorka „}” označuje koniec funkcie.

Pri vytváraní nového náčrtu vás Arduino informuje, že musíte definovať dve špeciálne funkcie: jednu void setup(), popisujúcu konfiguráciu mikrokontroléra obsahujúcu inštrukcie vykonané raz na začiatku programu a void loop(), ktorá obsahuje akcie vykonávané v nekonečnej slučke.

Obrázok 1. Okno nového náčrtu pre Arduino

Prečo je potrebné spustiť aplikačný program v nekonečnej slučke? Aplikácie systému Windows alebo Linux pracujú pod kontrolou v operačnom systéme. Ak spustíte aplikáciu v systéme Windows, potom sa po dokončení práce vráti na miesto spustenia, takže najčastejšie na zobrazenie takzvanej pracovnej plochy, príkazového riadka atď. Od tohto okamihu operačný systém preberá kontrolu nad prácou procesora. Mikrokontrolér na doske Arduino UNO nemá predinštalovaný žiadny operačný systém, takže vývojár musí zabezpečiť, aby aplikácia fungovala bezpečne. To sa dá urobiť vypnutím mikrokontroléra (napr. jeho uvedením do režimu spánku) alebo cyklickým vykonaním pokynov, aby sa zabránilo vykonaniu pokynov mimo požadovaného rozsahu pamäte. To sa dá urobiť vo funkcii void loop() alebo akýmkoľvek iným spôsobom, príklady ktorých vám ukážeme ďalej.

Pred zobrazením informácií na displeji musíte nastaviť mikrokontroléra. V tomto príklade stačí nakonfigurovať výstupy ovládacieho prvku displeja zodpovedajúcim spôsobom.

Na začiatku nášho náčrtu prikladáme knižnicu prvkov displeja:

#include <

LiquidCrystal.h>

Potom, pre naše pohodlie a čitateľnosť programu, pomocou príkazu # definujeme názvy nôh – výstupu portu C mikrokontroléra:

//port PC

#define pc0 A0

#define pc1 A1

#define pc2 A2

#define pc3 A3

#define pc4 A4

#define pc5 A5

Teraz poinformujeme mikrokontrolér, ku ktorému je pripojený displej. Slúži na to funkcia lcd(), v ktorej zoznam argumentov inštruuje procesor, kde sú jednotlivé signály privedené. Pri výmene výstupov udržiavajte správne poradie: LiquidCrystal lcd(RS, Enable, D4, D5, D6, D7).Pri vytváraní zoznamu argumentov použite tabuľku 1, ktorá obsahuje zoznam spojení medzi Arduino a modulom LCD displeja: LiquidCrystal lcd(pc4, pc5, pc0, pc1, pc2, pc3).

Teraz je potrebné nastaviť výstupný režim – nastavte ho tak, aby fungoval ako digitálny výstup. Táto konfigurácia sa uloží do funkcie void setup():

pinMode(pc0, OUTPUT);

pinMode(pc1, OUTPUT);

pinMode(pc2, OUTPUT);

pinMode(pc3, OUTPUT);

pinMode(pc4, OUTPUT);

pinMode(pc5, OUTPUT);

Ďalej inicializujeme displej určením počtu stĺpcov, riadkov a v prvom kroku vyčistíme obrazovku. Po inicializácii by LCD obrazovka mala byť prázdna, ale pre bezpečnosť a správny začiatok práce stojí za to po tomto príkaze vykonať ešte jeden:

lcd.begin(16, 2);

lcd.clear();

Na záver stačí jeden príkaz na zobrazenie správy:

lcd.print("Hello!");

Do funkcie loop() nevkladáme žiadne príkazy. Program sa bude po zobrazení správy „krútiť" v nekonečnej slučke so zbytočným využitím času procesora. V zásade by bolo možné v tomto bode napríklad vstúpiť do režimu úspory energie, pretože správa na obrazovke by sa aj tak nezmenila, ale vyžadovalo by si to ďalšie rozšírenie hardvéru, čo sa v tejto fáze neodporúča.

Celý program zobrazujúci správu "Hello!" nájdete v ďalších materiáloch k tomuto textu. Ak je vyššie uvedený popis a dosiahnutý účinok uspokojivý, môžete preskočiť čítanie zvyšku textu. V ďalšom článku sa pozrieme na niektoré pokročilejšie operácie so zobrazeným obsahom než len na zobrazenie správy.

Fungovanie modulu LCD displeja

Bližšia analýza témy by mala začať diskusiou o konštrukcii mikrokontroléra, ktorý je namontovaný na doske Arduino, ale je to veľmi rozsiahla téma. Preto sa v prvom rade budeme zaoberať spôsobom, ako LCD modul funguje.

Pre pochopenie spôsobu ovládania LCD modulu sú základné znalosti pamäťových systémov a digitálnych obvodov vo všeobecnosti nevyhnutné. Je potrebné poznať také pojmy ako vysoká, nízka logická úroveň, tvar vlny, údaje, 8\bitové číslo, bajt, bit, zostupná a stúpajúca hrana. Je to potrebné, pretože z hľadiska operačného programu sa modul displeja považuje za typ digitálnej pamäte, s ktorou môže mikrokontrolér komunikovať obojsmerne. Medzitým má LCD zobrazovací modul svoj vlastný mikrokontrolér (je to práve ten, ktorý je uvedený na začiatku HD44780 alebo podobný), ktorý nielen prijíma údaje, ktoré sa majú zobraziť, ale tiež vykonáva príkazy súvisiace s prevádzkou LCD modulu a podporuje zobrazovanie. Vzhľadom k tomu, že v systéme má mikrokontrolér zabudovaný do modulu displeja vysoko špecializovanú, autonómnu funkciu, často sa hovorí, že takéto systémy sú podriadené alebo vykonávajú funkcie slave. Mikrokontrolér zabudovaný do dosky Arduino má riadiacu nadradenú funkciu. Takéto rozloženia sa zvyčajne označujú ako nadradené alebo master. Tieto pojmy sa opakovane nachádzajú v popisoch rôznych zariadení, ktoré sú súčasťou mikrokontroléra.

Logicky „0” a „1”

Vráťme sa na chvíľu k základom. V CMOS sústavách a v takejto technológii sa realizuje väčšina moderných integrovaných obvodov, logická „1" je aspoň 95% napájacieho napätia systému a logická „0" je napätie menšie alebo rovné 0,3 V. Ak má čip procesora vstavaný zdroj napájania, čo je často prípad zložitejších procesorov, potom sa logická „1" určuje s ohľadom na vnútorný zdroj napájania. Môže to byť aj inak – ak má čip CMOS vstupy kompatibilné s TTL úrovňami, logická „1" je napätie vyššie ako 2,4 V. Preto v prípade pochybností stojí za to pozrieť sa na katalógovú kartu daného systému. Bez problémov ju nájdete na internete.

Vzrastajúce a klesajúce hrany signálu

Zmena logickej úrovne znamená zmenu napätia. Táto zmena nastáva v skokoch, ale napriek tomu, v určitom okamihu. Keď sa úroveň zmení z "0" na "1", hovoríme o stúpajúcej hrane a keď z "1" na "0" o klesajúcej. Trvanie prechodu sa potom nazýva časom stúpania alebo klesania. Zvyčajne to trvá niekoľko nanosekúnd, ale nie je to pravidlo.

V mikrokontroléri sa jeden riadok nesúci úroveň "0" alebo "1" nazýva dátový bit. 8 takýchto riadkov tvorí bajt. AVR mikrokontrolér, ako napríklad ten vstavaný do Arduino UNO, má 8-bitové dátové slovo, takže dokáže spracovať 1-bajtové slová, desatinné miesta z rozsahu 0... 255. Ak je číslo väčšie ako 255, vyžaduje rozdelenie na „časti", vykonanie operácií na nich a potom zloženie výsledku. Nemusíte sa však báť, pretože to na pozadí robí kompilátor jazyka Arduino. Musíte si však uvedomiť, že čím viac bitov si daná premenná vyžaduje, tým dlhšie ju mikrokontrolér bude spracovávať.

Ovládanie LCD modulu

V tomto príklade nadradený mikrokontrolér ovláda LCD modul pomocou výstupných signálov. Zmenou výstupných signálov riadi logické úrovne na vstupoch zobrazovacieho modulu. To vám umožní vybrať okamih zaznamenávania údajov a oblasť pamäte, do ktorej budú údaje uložené:

  • Logická „1" na vstupe RS (Register Select) zapíše údaje do pamäte obrazu, zatiaľ čo logická „0” – zapíše údaje do riadiaceho registra zobrazovacieho modulu. Nadradený mikrokontrolér musí byť schopný ovládať tento vstup, aby bolo možné správne prenášať príkazy pre ovládač displeja (RS = 0) a údaje na zobrazenie (RS = 1). Skrátenie tohto vstupu na pevnú, vysokú logickú úroveň zabráni modulu displeja vykonávať príkazy typu „vyčistiť obrazovku" a neumožní správnu inicializáciu (kontrolný register nebude k dispozícii).
  • Logická „1" na vstupe R/W (Read/Write) a logická „0“ – zápis. V našom príklade sme natrvalo vynútili nízku úroveň na tomto vstupe LCD modulu a spojili sme ho s príkonom. Je to správne za predpokladu, že údaje uložíme len do displeja a nebudeme ich čítať. Pripojením tohto vstupu na konštantnú logickú úroveň strácame schopnosť čítať pamäť displeja a jeho riadiaceho registra, a tým aj signál „busy“. Testovanie „busy” zrýchľuje modul displeja a tiež umožňuje otestovať správnosť odpovede ovládača na prijaté údaje, ale zaberá aj ďalšiu portovaciu linku nadradeného mikrokontroléra a vyžaduje ešte jedno pripojenie a mierne komplikuje riadiaci program.
  • Padajúca hrana na vstupe „E” (Enable) prepíše logické úrovne (pozostávajúce zo 4- alebo 8-bitových slovných údajov) zo vstupov DB0... db7 do internej pamäte LCD modulu.

Pri ovládaní prevádzky znakového modulu LCD displeja máme dva režimy prevádzky – zvyčajne sa nazývajú 8\bit a 4\bit. V prvom pripojenie obrazovky vyžaduje aspoň 10 dátových riadkov (RS, E, D0... D7). Z pohľadu obslužného manipulátora je tento režim veľmi účinný, ak môžete pripojiť displej ako pamäť na 8\bitovej údajovej lište k nadradenému systému. Adresovanie zobrazovacieho modulu potom nastaví úroveň na vysokú na vstupe Enable, nízku alebo vysokú (v závislosti od toho, či ide o príkaz alebo údaje na zobrazenie) na RS, vystavenie údajov na terminál a zmenu úrovne na Enable na nízku. V niektorých systémoch to výrazne zjednodušuje program obsluhy.

V 4-bitovom režime stále používame 8\bitové slovo, ale k nadradenému systému sú pripojené iba vstupy D4...D7 modulu displeja a 8\bitové slová údajov sú rozdelené do dvoch blokov po 4 bitoch. To komplikuje program obsluhy a neumožňuje, aby bol zobrazovací modul ľahko pripojený k hlavnému systému, ale umožňuje šetrenie 4 GPIO liniek mikrokontroléra.

V zjednodušených obslužných manipulátoroch LCD modulov, ktoré nepoužívajú R/W linky sa a priori predpokladá, že zobrazovací modul pracuje správne. Nastavuje sa predvolený čas, napríklad vykonanie najdlhšie spusteného príkazu (zvyčajne približne 2 milisekundy) a predpokladá sa, že po tomto čase obrazovka vykonala príkaz alebo zobrazila znak a môže odoslať viac údajov. Zvyčajne je mikrokontrolér zabudovaný do zobrazovacieho modulu rýchlejší – dokončenie príkazu clear (čistenie obrazovky) trvá len 2 milisekundy. Na druhej strane, ak, ako v tomto príklade, máme na obrazovke 2 riadky s 8 znakmi, nezáleží na tom, či pošleme 16 bajtov za 32 milisekúnd alebo 100 mikrosekúnd. Aj tak si to žiadny používateľ nebude schopný všimnúť. Toto sa mení len vtedy, keď máme do činenia s grafickými displejmi, na ktoré sa vysiela oveľa väčšie množstvo dát.

Arduino nám nedáva príliš veľa priestoru na manévrovanie pri ovládaní displeja. Mikrokontrolér ATmega328 zabudovaný do Arduino UNOnemá žiadne externé riadky, takže ovládanie displeja v 8\bitovom režime s adresovaním takýmto spôsobom, ako je externá pamäť nie je možné. Ak však použijeme jeden GPIO port na ovládanie R/W signálu, potom môžeme otestovať príznak zaneprázdnenej zbernice a prečítať si obsah registrov a pamäte LCD modulu.

Ak chcete nakonfigurovať spôsob pripojenia displeja v knižnici LiquidCrystal.h, môžete použiť funkciu s rovnakým názvom, t. j. LiquidCrystal (). Spôsob pripojenia displeja je určený zoznamom argumentov pre vyvolanie funkcie:

  • LiquidCrystal(rs, enable, d4, d5, d6, d7) – 4\bitové rozhranie, bez ovládania vstupu R/W modulu displeja, a teda bez schopnosti čítať dáta.
  • LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) – 4\bitové rozhranie, s ovládaním R/W vstupu modulu LCD displeja a schopnosťou čítať dáta z displeja.
  • LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) – 8\bitové rozhranie, ale bez schopnosti čítať dáta.
  • LiquidCrystal (rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) – 8\bitové rozhranie, čitateľné dáta.

Ovládač HD44780 je univerzálnou sústavou určenou na podporu LCD obrazoviek s rôznym počtom znakov (stĺpcov a riadkov). To spôsobuje, že ovládač „nevie", aká obrazovka je pripojená, keď je napájanie zapnuté a je potrebné ho nakonfigurovať pre správnu prevádzku. V Arduino sa na to používa funkcia begin(), ktorej argumenty sú počet stĺpcov a počet riadkov. Ak máte napríklad obrazovku s 2 riadkami so 16 znakmi, vyvoláte begin (16, 2).

Vzorový program používa aj funkciu clear() na čistenie obrazovky. Je dobré ju použiť ako prvú, po inicializácii LCD modulu, pretože sa môžeme stretnúť s displejmi, ktoré po inicializácii zobrazujú náhodné znaky. Použili sme aj funkciu print() Argumenty pre jej vyvolanie sú údaje, ktoré sa majú zobraziť, napríklad číslo alebo text, a v prípade čísel základ, ktorý je pre desatinné čísla rovný „DEC", binárne "BIN", šestnástkové "HEX", osmičkové "OCT". Funkcia print() sa používa na konverziu čísel, ak je potrebné ich zobraziť v rôznych číselných systémoch:

  • print(10) alebo print(10, DEC) –> spôsobí zobrazenie 10,
  • print(10, BIN) –> spôsobí zobrazenie 1010,
  • print(10, HEX) –> spôsobí zobrazenie A,
  • print(10, OCT) –> spôsobí zobrazenie 12.
  • print("Hello!") –> spôsobí zobrazenie správy Hello!

Print umiestni zobrazené znaky z aktuálnej pozície kurzora. Po príkaze clear() sa kurzor zvyčajne nachádza v ľavom hornom rohu LCD obrazovky.

Knižnica LiquidCrystal.h obsahuje mnoho ďalších užitočných funkcií, ale povieme vám o nich v niektorom ďalšom článku.



Páčil sa Vám článok? Pridajte k nemu hodnotenie
 

     

Komentáre k článku

Zatiaľ nebol pridaný žiadny komentár. Pridáte prvý? Za obsah komentárov je zodpovedný užívateľ, nie prevádzkovateľ týchto stránok.
Pre komentovanie sa musíte prihlásiť.

Vyhľadajte niečo na našom blogu

Webwiki ButtonSeo servis