LAKI PINGVINI<>
122016<><>

Arduino: Rad sa ekranom (1)

Vizuelizacija informacija

Rad sa ekranima je uvek spadao među najzanimljivije teme kada su u pitanju računari, pa je odličan za početak priče o hardverskom povezivanju Arduina sa spoljašnjim uređajima. Na tržištu postoji veliki broj različitih vrsta displeja za sve moguće namene, a mi imamo nameru da obradimo one jeftinije i, praktično svakome, pristupačne varijante.

Stari dobri Hitachi

 
Uređaji bazirani na kontroleru LCD ekrana Hitachi HD44780 bili su veoma popularni među proizvođačima fiksnih telefona, štampača, faksova, aparata za kafu i drugih sličnih naprava, sve negde do pred kraj prethodne decenije kada su im na zamenu došli tada već dovoljno jeftini LCD/LED displeji sa svojim superiornijim mogućnostima. Ipak, i dalje postoji veliki broj primena u kojima su ovi ekrani više nego dobar izbor za prikazivanje informacija.

Prvo što treba znati je činjenica da je Hitachi HD44780 kontroler koji obrađuje informacije koje se potom prikazuju na displeju, a samih displeja ima prilično veliki broj. Najskromnija varijanta prikazuje osam karaktera u jednom redu, dok one izdašnije nude i po dvadeset karaktera u četiri reda. Postoje i varijante koje kombinovanjem više kontrolera prikazuju i do 80 znakova u osam redova, ali njihova cena prelazi granice naših interesovanja. Među ljubiteljima elektronike su najpopularniji modeli sa 16 karaktera u dva i 20 karaktera u četiri reda. Ovi prvi se mogu pazariti već po ceni od nekih 1,3 evra dok veći model košta nekih 3,3 evra (najniže cene na sajtu Ebay u vreme pisanja teksta, sa besplatnom dostavom). Ekrani se najčešće označavaju oznakom u kojoj se kombinuje broj redova i kolona. Tako, recimo, model 16 × 2 nosi oznaku 1602, dok je 20 × 4 model označen kao 2004. Moguće je kupiti displeje u različitim bojama pozadine. Najčešći su oni u plavoj, zelenoj i žutoj, dok se ređe mogu naći i crveni i beli.

Kontroler HD44780 podržava rad sa 208 unapred definisanih karaktera i pored toga ima mogućnost definisanja osam dodatnih znakova od strane korisnika. Svaki karakter je predstavljen matricom od 5 × 8 tačaka. Raspored karaktera u tabeli izgleda ovako:

0×00-0×07 korisnički definisani simboli

0×20-0x7F ASCII simboli

0xA0-0xFF nacionalno specifični simboli

Prilikom kupovine preko interneta sa Dalekog istoka, praktično svaki put ćete dobiti displej koji pored standardnih ASCII simbola iz donjih sedam bita tabele dodatno sadrži simbole iz japanskog nacionalnog pisma. Kontroleri koji podržavaju japanske znakove nose dodatnu oznaku UA00, dok oni sa oznakom UA02 sadrže karaktere iz zapadnoevropskih pisama i rusku ćirilicu. Postoje i varijante sa oznakom UBxx sa karakterima po želji naručioca, ali njih nije moguće naći u slobodnoj prodaji. Što se tiče korisničkih karaktera, njih je potrebno upisivati na uređaj svaki put nakon njegove inicijalizacije, pošto se oni smeštaju u CGRAM (Character Generator RAM), a ne u neki oblik fleš memorija. Na lokaciji goo.gl/sz9EYu se nalazi stranica za generisanje korisničkih znakova za ovu vrstu ekrana.

 
Kod modela sa oznakom 1602 svaki od dva reda ima po 40 bajtova za podatke. U prvoj liniji karakteri su smešteni od lokacije 0x80 do 0xA8 a u drugoj od 0xC0 0xE8. Unutar tog područja je moguće pomerati pokazivač na prvi karakter, tako da se postiže efekat horizontalnog skrolovanja. Komplikacije u organizaciji video memorije nastaju kao posledica činjenice da je HD44780 prvobitno kreiran za korišćenje u režimu 20 × 4 karaktera.

Prilikom kupovine displeja obično dobijate nožice sa pinovima koje je potrebno zalemiti u predviđene otvore. Funkcije tih pinova su sledeće (oznake se često razlikuju kod različitih modela):

1 Vssuzemljenje

2 Vdd+5V

3 V0kontrast

4 RS izbor registra

5 RWčitanje/pisanje

6 EKlok sinhronizacija upisivanja

7-14D0 – D7magistrala podataka

 
Prva dva pina (kao i ona dva poslednja vezana za osvetljenje) imaju funkciju napajanja uređaja i o njima se nema šta naročito reći. Pin broj 3 je zadužen za kontrolu kontrasta ekrana i najčešće je povezan sa potenciometrom. Pin broj četiri se naziva RS (Register Select) i preko njega definišemo da li je kontroler u modusu prenosa komandi ili podataka (ukoliko je na ovom pinu prisutno stanje logičke nule onda kontroler prima komande, a u suprotnom operiše sa podacima). Pin broj 5 nosi naziv RW i njegova je funkcija da odredi da li nameravamo da podatke upisujemo na ekran ili da ih od tuda čitamo. U ogromnom broju slučajeva ovaj pin se stavlja u stanje logičke nule povezivanjem sa uzemljenjem, što znači da će se ekran koristiti samo za ispisivanje. Pin broj šest je namenjen vremenskoj sinhronizaciji prenosa podataka.

Ekrani bazirani na kontroleru HD44780 imaju mogućnost da se povezuju kako preko svih osam linija za podatke, tako i preko samo četiri gornje (D4-D7) data linije. Iako logika govori da korišćenje dvostruko šire magistrale dovodi do dvostruko većeg prenosa podataka, to u praksi nije tako. Razlike su skoro zanemarljive, a nama u radu sa 4-bitnim modusom ostaju četiri neiskorišćena Arduino pina koji se mogu upotrebiti mnogo pametnije. Da ne govorimo o smanjenju broja kablova koji kvare preglednost projekta. Kada se koriste samo četiri gornja bita magistrale podataka, svaki pojedinačni bajt se prenosi iz dva puta, odnosno u formi nibla (naziv za polovinu bajta).

Da bismo povezali displej sa Arduinom Uno, koristićemo podatke iz sledeće tabele:

LCD PinFunkcija LCD pinaArduino Uno

1GNDGND

25V5V

3KontrastGND

4RS (Register Select)Digital0

5RW (Read/Write)GND

6E (Clock Enable)Digital1

7D0-

8D1-

9D2-

10D3-

11D4Digital2

12D5Digital3

13D6Digital4

14D7Digital5

15Anoda (osvetljenje)5V

16Katoda (osvetljenje)GND

Tamo gde su ukazane vrednosti GND i 5V napon dovodimo sa linija napajanja prototipske ploče. Kada sve odradimo kako treba, preostaje nam još da dodamo malo programskog kôda za ispisivanje poruke na ekranu:

#include <LiquidCrystal.h> // biblioteka LCD

// definišemo pinove koje koristimo

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

void setup() {

lcd.begin(16, 2); //broj stubaca i redova

lcd.print(„Svet kompjutera”);

lcd.setCursor(0, 1);

lcd.print(„Hitachi HD44780”);

}

void loop() {}

Zahvaljujući biblioteci LiquidCrystal, izbegnuto je žongliranje sa komandama i registrima LCD kontrolera, pa je rad sa ekranom sasvim jednostavan. Prva linija kôda našem skeču dodaje pomenutu biblioteku, dok u sledećoj liniji vršimo inicijalizaciju interfejsa sa vrednostima iz naše tabele sa sledećim rasporedom parametara:

LiquidCrystal lcd(RS, Enable, D4, D5, D6, D7);

Kao argumente upisujemo brojeve Arduino data pinova povezanih sa prinovima LCD kontrolera ukazanim u primeru. Funkcijom begin vršimo inicijalizaciju rezolucije displeja, dok funkcija print ispisuje sadržaj na ekran. Kao što samo ime kaže setCursor postavlja kursor na ukazanu poziciju. Prvo se zadaje broj kolone, a zatim i broj reda. Biblioteka LiquidCrystal sadrži dvadesetak funkcija.

Može još jednostavnije

 
Složićemo se da prethodni primer nije težak ni za one koji se samo površno razumeju u elektroniku. Povezivanje žica na prototipskoj ploči ne traje više od pet minuta i od dodatnih delova su nam potrebni samo jedan potenciometar (od pet do deset kilooma) i jedan otpornik veličine 470 oma (može i neki drugi iz tog opsega), sa namenom da štiti pozadinsko osvetljenje. Međutim, postoji još jednostavniji metod povezivanja ove vrste displeja na naš Arduino. Za tu svrhu je potrebno da nabavimo dodatni modul baziran na čipu PCF8574 (port ekspander, SLIKA 6) koji će nam omogućiti povezivanje uređaja putem I2C standarda za serijski prenos podataka. Cena ovih modula je nešto manja od jednog evra, što i nije mnogo novca u odnosu na komfor koji nude. Za povezivanje su nam potrebne samo četiri žice koje spajamo na sledeći način:

ArduinoI2C modul

GndGnd

5VVcc

Analog4SDA

Analog5SCL

SDA je linija I2C interfejsa za prenos podataka, dok SCL označava liniju za sinhronizaciju (klok). Bazično postoje dva načina spajanja LCD displeja sa modulom. Prvi je da na prototipsku ploču postavimo oba elementa tako da im se iglice poklapaju, dok je drugi (i dosta češći) način da jednostavno zalemimo ova dva uređaja.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {

lcd.begin(16,2);

lcd.backlight();

lcd.setCursor(0, 0);

lcd.print(„Veza putem”);

lcd.setCursor(0, 1);

lcd.print(„I2C intrefejsa”);

}

void loop()

{}

Kôd je sličan prethodnom primeru, sa tom razlikom da ovde koristimo biblioteku Wire.h za komunikaciju putem I2C protokola, kao i biblioteku LiquidCrystal_I2C.h za podršku ispisivanju na displeje ove vrste. Ovde treba napomenuti da je najpametnije rešenje korišćenje biblioteke pod nazivom NewliquidCrystal (goo.gl/hV10sG), koja ima niz prednosti nad originalnom bibliotekom. Ako u radu sa displejem budemo dobijali svakojake greške, treba pokušati sa korišćenjem ove biblioteke i verovatno će problemi biti rešeni. Prvi parametar konstruktora pod nazivom lcd ima vrednost 0x20 i to će uglavnom funkcionisati ispravno. Međutim, u pojedinim slučajevima će biti potrebno postaviti drugu vrednost. Najlakši način da utvrdimo I2C adresu uređaja je da pokrenemo sledeći program i otvorimo prozor serijskog monitora u Arduino IDE.

#include <Wire.h>

void setup() {

Serial.begin (9600);

Wire.begin();

for (int adr = 8; adr < 120; adr++) {

Wire.beginTransmission (adr);

if (Wire.endTransmission () == 0) {

Serial.print („Adresa: „);

Serial.print („0x”);

Serial.println (adr, HEX);

}

}

}

void loop() {}

Ostali argumenti će najčešće biti onakvi kakvi su prikazani u našem primeru.

Ukoliko vaš I2C adapter na sebi ima tri polja sa oznakama A0, A1 i A2, to znači da lemljenjem ovih izvoda možete fiksirati adresu interfejsa i to po sledećoj tabeli:

AdresaA0A1A2

0x20000

0x21100

0x22010

0x23110

0x24001

0x25101

0x26011

0x27111

Često će se desiti da nakon prvog startovanja program ne ispisuje ništa na ekranu. Zapravo, on ispisuje, ali mi to ne primećujemo, pošto potenciometar za kontrolu kontrasta nije podešen kako treba.

Slika na TV

 
Prvoborci računarske revolucije sa početka osamdesetih godina dvadesetog veka svakako se sećaju računara ZX80 i ZX81, kao i domaće Galaksije koji su sliku generisali uz pomoć sirove snage mikroprocesora koja je radila posao umesto namenskog hardvera. Isti princip je iskorišćen prilikom kreiranja biblioteke za Arduino i od nas se očekuje da, osim same biblioteke, napravimo fizički interfejs između televizora i Arduina. Izrada interfejsa je više nego jednostavna. Potrebna su nam samo dva otpornika, kao i jedan koaksijalni kabl za priključivanje antene sa konektorom za kompozitni signal. Alternativno, moguće je pre otpornika postaviti po jednu diodu i na taj način dodatno osigurati Arduino od struje sa TV uređaja.

Kod Arduino Una se za signal sinhronizacije koristi digitalni pin 9, dok signal videa dolazi preko digitalnog pina 7. Kod modela Mega2560 za istu namenu se, respektivno, koriste digitalni pinovi 11 i 7. Standardna rezolucija definisana bibliotekom iznosi 128 × 96 piksela. U slučaju da se u projektu koristi mikrokontroler sa kilobajtom RAM, potrebno je koristiti naredbu

TV.begin(_PAL,128,56)

zbog manjeg zauzeća memorije.

Poslovi ovakve vrste zahtevaju maksimalnu efikasnost, pa nije iznenađujuće kada u izvornom kôdu biblioteke nailazimo na optimizovane rutine pisane u asemblerskom jeziku.

Korišćenje biblioteke ćemo ilustrovati jednostavnim primerom:

#include <TVout.h>

#include <fontALL.h>

TVout TV;

void setup ( ) {

TV.select_font(font6x8);

TV.begin(_PAL);

}

void loop () {

for(int x=0; x<5; x++) {

TV.print(10,x*10,"Svet Kompjutera”);

TV.delay(50);

TV.clear_screen();

}

}

Prve dve #include direktive su namenjene dodavanju biblioteka TVout i fontALL gde ova potonja daje mogućnost upotrebe rasterskih fontova različitih dimenzija. U okviru Setup bloka izabiramo font 6 × 8 piksela i dajemo do znanja da ćemo koristiti signal po PAL standardu koji je karakterističan za Evropu (SAD i Japan koriste standard NTSC). Sledi petlja za ispisivanje teksta.

Biblioteka sadrži solidan skup funkcija za rad sa monohromatskom grafikom i tekstom, pri tome dajući utisak kao da pred sobom imamo stari osmobitni računar. Pomoću nje je napisano desetak video igara koje na lep način demonstriraju kako je moguće ostvariti i ono što se na prvi mah čini nemogućim. Uz malo više zalaganja i nešto dodatnog hardvera je moguće implementirati i rad sa bojama.

Igor S. RUŽIĆ

 
Sabayon 16.11
Raspberry Pi Zero
Arduino: Rad sa ekranom (1)
Šta mislite o ovom tekstu?
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera