V predchádzajúcej časti sme ukázali konfiguráciu knižnice Octopus, ktorá obsahuje triedy funkcií na ovládanie rôzneho hardvéru a komunikačných rozhraní. Ukázali sme aj motivačný príklad, ako pomocou dvoch riadkov kódu je možné zobraziť čísla, alebo text na displeji zloženom zo sedem segmentových číslic, pričom doska displeja využíva zbernicu I2C, takže na pripojenie k doske mikrokontroléra jej stačia štyri vodiče.
Pokračujeme predstavením možnosti displejov. Príklady sú vo videu:
Doplnenie displeja je pre väčšinu amatérskych konštrukcií veľkou pridanou hodnotou, nielen pri finálnej funkcii, ale aj počas ladenia. Je to oveľa praktickejšie, než výpisy cez konzolovú aplikáciu.
Upozorňujeme, že na príklady v tejto časti musíte mať nainštalovanú knižnicu Octopus. Podprobný postup je v predchádzajúcej časti seriálu. Pomocou príkazu octopus() knižnicu inicializujete. Príkazom h() zobrazíte nápovedu. Vypíšeme len jej časť týkajúcu sa displejov:
>> displays ------------------|--------------------- d7 = disp7_init() > d7.show(123.567) d2 = lcd2_init() > d2.putstr(text) d2.clear() | o = oled_init() | o.fill(0/1) o.text(text, x, y) > o.show() o.hline(*) | d.vline(*) | o.pixel(x, y, 1)
Príkazom ios nakonfigurujete zoznam používaného hardvéru. Proto je potrebné importovať funcie pre tento hardvér:
>>> from util.octopus import *
octopus() --> autoInit: Led | piezzo | ws | SPI | disp7 | disp8 | I2C | OLED | lcd
Sériové zbernice na komunikáciu s displejmi
Najskôr stručne predstavíme komunikačné zbernice, ktoré sa používajú na komunikáciu s displejmi.
Pomocou zbernice SPI (Serial Peripheral Interface) sa najčastejšie pripájajú displeje, externé pamäte, či A/D prevodníky, prípadne sa toto rozhranie využíva pre vzájomnú komunikáciu medzi viacerými mikrokontrolérmi. V systéme využívajúcom rozhranie SPI môže byť zapojených dva alebo viac obvodov, pričom jeden z nich je označovaný ako Master, ktorý riadi komunikáciu a ostatné sú označované ako Slave. Komunikácia prebieha pomocou štyroch vodičov MOSI (Master Out, Slave In), MISO(Master In, Slave Out), hodinového signálu SCK, a SS (Slave Select).
I2C. je dvojvodičová obojsmerná sériová zbernica, určená napríklad na komunikáciu jednočipových procesorov s podriadenými obvodmi. Vodič SDA je určený na prenos sériových dát a vodič SLC na prenos taktovacieho signálu.
LED displeje
Ukážeme príklad pre obsluhu sedem segmentového displeja, pripojeného cez SPI. Displej má sériový driver MAX7219 a je zložený z dvoch modulov po 4 znaky, spolu je teda možné zobraziť 8 znakov.
- VCC – Napájacie napätie 3,3 V
- GND – elektrická zem
- DIN – data input – pripája sa na pin D23, ktorý má alternatívnu funkciu MOSI
- CS – chip select – pripája sa na pin D5 s funkciou CS0
- CLK – clock, taktovací signál pripája sa na pin D18 s alternatívnou funkciou SCLK
Môžete zreťaziť viac displejov, pričom výstup DOUT z jedného displeja pripojíte na DIN druhého displeja.
Modul 2x15 pins: [ROBOT Board]: ----------- (GPIO) EN - - D23 (23) MOSI [SPI_MOSI_PIN] [PIN_ANALOG] (36) VP - - D22 (22) SCL(I2C) [I2C_SCL_PIN] [I39_PIN] (39) VN - - TXD (1) D2 [I34_PIN] D34 - - RXD (3) D3 [I35_PIN] D35 - - D21 (21) SDA(I2C) [I2C_SDA_PIN] [ONE_WIRE_PIN] DEV1 D32 - - D19 (19) MISO [SPI_MISO_PIN] DEV2 D33 - (ESP32) - D18 (18) SCLK [SPI_CLK_PIN] [MOTOR_12EN] D25 - - D5 (5) CS0 [SPI_CS0_PIN] [MOTOR_1A] D26 - - TX2 (17) [PIN_PWM1] /Servo1 [MOTOR_4A] D27 - - RX2 (16) [PIN_PWM2] /Servo2 [MOTOR_3A] D14 - - D4 (4) [PIN_PWM3] /Servo3 [MOTOR_2A] D12 - - D2 (2) [BUILT_IN_LED] [MOTOR_34EN] D13 - - D15 (15) [WS_LED_PIN] //v1(13) GND - - GND VIN - - 3V3 + -----------
Displej je potrebné inicializovať príkazom disp7_init(). Príkaz odovzdá inštanciu objektu d7.
d7 = disp7_init() Môžete zobraziť číslo. d7.show(123.456)
Alebo aj textový reťazec, pretože na 7 segmentovom displeji sa dá zobraziť aj hodne písmen, avšak nie všetky.
d7.show("PCREVUE")
Jednotlivé segmenty sú adresované takto:.
------64----- | 2 |32 -------1------ |4 | 16 -------8------
Bodka za číslom má kód 128. Môžete použiť aj binárnu kombináciu týchto konštánt a rozsvietiť viac segmentov súčasne.
Blikajúca pomlčka segmentu:
while True: d7.set_register(5,1) sleep(1) d7.set_register(5,0) sleep(1)
Blikajúca bodka:
while True: d7.set_register(5,128) sleep(1) d7.set_register(5,0) sleep(1)
Knižnica Octopus podporuje aj zobrazovanie na maticovom LED displej 8×8 s obvodom MAX7219.
Tento displej sa pripája rovnako ako sedem segmentový v predchádzajúcej časti, čiže pomocou signálov VCC, GND, DIN, CS a CLK. Aj tieto displeje môžete zoradiť do kaskády s cieľom zobraziť viac znakov.
Trieda pre obsluhu displeja sa inicializuje:
d8 = disp8_init()
LCD displeje
Rozdeľujú sa na grafické a znakové. Grafický displej umožňuje na kontinuálnej matici bodov zobraziť grafické obrazce a samozrejme aj text rôznym fontom. Znakové displeje sú v podstate tiež maticové, akurát matice pre každý znak sú oddelené. Znakové displeje umožňujú zobraziť rôzne dlhý text v jednom, alebo viacerých riadkoch. Displeje sú k dispozícii v konfigurácii 8 × 1, čiže 8 znakov v jednom riadku až po 40 × 4, čiže 4 riadky, pričom každý z nich môže mať 40 znakov. Programové ovládanie týchto displejov je pomerne jednoduché. Nastavíte kurzor na miesto kde chcete mať znak, alebo začiatok textu a pošlete znak, alebo text.
Alfanumerické displeje využívajú ako radič obvod Hitachi HD44780. Radič má riadiaci a dátový register. V pamäti ROM má napevno uložené definície 208 znakov v matici 5 × 8 bodov a 32 znakov v matici 5 × 10 bodov. Zlou správou pre našinca je, že tam nie sú znaky so slovenskou diakritikou. Tie môžete v matici 5 × 8 bodov definovať do pamäte typu CGRAM. Obrazová pamäť RAM obsahuje aktuálne zobrazený text. Displej tohoto typu môžete pripojiť aj cez sériovú zbernicu I2C pomocou dvoch dátových pinov (SDA a SCL) + dvoch pinov na napájanie. Dá sa kúpiť displej už s takýmto rozhraním, alebo dosku, ktorá sa nasadí na 16 pinový konektor displeja a pripojí cez I2C.
- SCL – pripája sa na pin D22, ktorý má alternatívnu funkciu I2C_SCL
- SDA – pripája sa na pin D21, ktorý má alternatívnu funkciu I2C_SDA
- GND – elektrická zem
- VCC – Napájacie napätie 5 V
Pripojenie na piny 30 pinového modulu ESP 32:
Modul 2x15 pins: [ROBOT Board]: ----------- (GPIO) EN - - D23 (23) MOSI [SPI_MOSI_PIN] [PIN_ANALOG] (36) VP - - D22 (22) SCL(I2C) [I2C_SCL_PIN] [I39_PIN] (39) VN - - TXD (1) D2 [I34_PIN] D34 - - RXD (3) D3 [I35_PIN] D35 - - D21 (21) SDA(I2C) [I2C_SDA_PIN] [ONE_WIRE_PIN] DEV1 D32 - - D19 (19) MISO [SPI_MISO_PIN] DEV2 D33 - (ESP32) - D18 (18) SCLK [SPI_CLK_PIN] [MOTOR_12EN] D25 - - D5 (5) CS0 [SPI_CS0_PIN] [MOTOR_1A] D26 - - TX2 (17) [PIN_PWM1] /Servo1 [MOTOR_4A] D27 - - RX2 (16) [PIN_PWM2] /Servo2 [MOTOR_3A] D14 - - D4 (4) [PIN_PWM3] /Servo3 [MOTOR_2A] D12 - - D2 (2) [BUILT_IN_LED] [MOTOR_34EN] D13 - - D15 (15) [WS_LED_PIN] //v1(13) GND - - GND VIN - - 3V3 + -----------
Displej sa inicializuje príkazom:
d2 = lcd2_init()
Príkazom d2.TAB (kláves tabulátor) môžete vypísať metódy triedy.
>>> d2. __class__ __init__ __module__ __qualname__ clear __dict__ i2c custom_char putstr move_to hal_write_init_nibble hal_backlight_on hal_backlight_off hal_write_command hal_write_data i2c_addr LCD_FUNCTION_RESET LCD_FUNCTION LCD_FUNCTION_2LINES num_lines num_columns backlight LCD_CLR LCD_HOME LCD_ENTRY_MODE LCD_ENTRY_INC LCD_ENTRY_SHIFT LCD_ON_CTRL LCD_ON_DISPLAY LCD_ON_CURSOR LCD_ON_BLINK LCD_MOVE LCD_MOVE_DISP LCD_MOVE_RIGHT LCD_FUNCTION_8BIT LCD_FUNCTION_10DOTS LCD_CGRAM LCD_DDRAM LCD_RS_CMD LCD_RS_DATA LCD_RW_WRITE LCD_RW_READ show_cursor hide_cursor blink_cursor_on blink_cursor_off display_on display_off backlight_on backlight_off putchar cursor_x cursor_y
Na výpis textu použijete napríklad príkaz:
d2.putstr("PCREVUE – serial IoT prakticky")
Pomocou I2C rozhrania sa pripájajú aj maticové OLED displeje. Najpraktickejšie sú displeje s rozlíšením 128 × 64. Pripájajú sa rovnako ako viacriadkové LCD displeje.
- SCL – pripája sa na pin D22, ktorý má alternatívnu funkciu I2C_SCL
- SDA – pripája sa na pin D21, ktorý má alternatívnu funkciu I2C_SDA
- GND – elektrická zem
- VCC – Napájacie napätie 5 V
Displej sa inicializuje príkazom:
o = oled_init()
Zoznam metód objektu:
>>> o. __class__ __init__ __module__ __qualname__ clear __dict__ addr blit buffer fill fill_rect hline invert line pixel rect scroll text vline width i2c test temp show ox oy draw_icon draw_image oledSegment init_display poweroff poweron contrast height external_vcc pages write_cmd write_data write_list
Text vypíšete príkazmi:
o.fill(0) o.text("PC REVUE", 0, 0) o.text("IoT serial", 0, 20) o.show()
V budúcom pokračovaní sa budeme venovať obsluhe LED diód, farebných RGB LED diód a farebných diód Neopixel.