Utilizarea shield-ului cu ecran LCD și butoane pentru Arduino

 Autor:   Publicat pe:   Actualizat pe:  2018-07-01T16:16:46Z

Descrierea shield-ului cu ecran LCD și butoane pentru Arduino. Cod sursă pentru LCD și pentru tastatura analogică.

Majoritatea proiectelor Arduino necesită o interfață prin care diverse date pot fi afișate utilizatorului, dar și o interfață prin care utilizatorul poate modifica variabile ale programului. Afișarea datelor se face de obicei pe ecrane LCD. Cele mai utilizate împreună cu microcontrollere sunt LCD-urile alfanumerice care pot afișa 1, 2 sau 4 rânduri de 16 sau 20 caractere. Pentru a interacționa cu programul ce rulează pe microcontroller, utilizatorul folosește cel mai adesea câteva taste/butoane.

Pentru a ușura munca dezvoltatorilor, producătorul chinezesc DFRobot a creat un shield pentru Arduino care conține un LCD alfanumeric cu două rânduri de câte 16 caractere dar și 5 butoane tactile legate în configurație analogică. Shield-ul se conectează direct pe plăcile de dezvoltare Arduino UNO și compatibile. Prețul acestui shield variază între 3 și 10 USD la magazinele chinezești cu livrare internațională.

Shield-ul cu LCD și butoane (sursa: DFRobot)
Shield-ul cu LCD și butoane (sursa: DFRobot)
Pentru a vedea cum poate fi utilizat acest shield vom începe prin a analiza schema electrică. LCD-ul este conectat la Arduino în configurație paralelă pe 4 biți, folosind pinii de date D4, D5, D6 și D7 și pinii de control D8 (atribuit RS), respectiv D9 (atribuit E). Pinul D10 controlează backlight-ul (vom vedea în continuare cum poate fi folosit). În concluzi pinii digitali D4 – D10 sunt folosiți de shield, limitând unele funcții specifice ale microcontroller-ului, care nu pot folosi alți pini.

Conexiuni LCD la Arduino (sursa: DFRobot)
Conexiuni LCD la Arduino (sursa: DFRobot)
Se poate observa că pinul D10 al Arduino acționează tranzistorul Q1 printr-un rezistor de 10 kilo-ohmi (R8) în versiunea 1.0. Pinul D10 este un pin care poate genera semnale PWM, permițând astfel varierea intensității luminii de backlight. Problema este că versiunile mai noi ale shield-ului nu mai conțin acest rezistor, pinul D10 fiind în contact direct cu baza tranzistorului. În această situație, setarea pinului D10 ca ieșire logic „1” (OUTPUT, HIGH) poate duce la defectarea microcontroller-ului sau a tranzistorului, prin lipsa rezistorului limitator de curent. La fel și în cazul ieșirii PWM. Deci, dacă folosiți un shield care nu are rezistor în baza tranzistorului ce controlează LED-ul de backlight, puteți porni și opri iluminarea shield-ului cu următoarele funcții:

Porniți iluminarea configurând pinul D10 ca intrare. Rezistorul R7 va ridica tensiunea din baza tranzistorului, activându-l.
void turnOn() {
  pinMode(10, INPUT);
}
Opriți iluminarea setând pinul D10 logic „0”. Tensiunea în baza tranzistorului va fi ținută la masă.
void turnOff() {
  pinMode(10, OUTPUT);
  digitalWrite(10, LOW);
}
Inițializarea LCD-ului se va face la începutul schiței:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
și apoi în funcția setup():
lcd.begin(16, 2);
Cele 5 butoane tactile ale shield-ului sunt conectate în configurație analogică. De fapt sunt 6 butoane, al  șaselea reprezentând reset-ul, fiind conectat direct la pinul de resetare.

Tastatura analogică a shield-ului
Tastatura analogică a shield-ului
La apăsarea unui buton, un rezistor de valoare diferită intră în circuitul divizorului de tensiune format din R2 și setul R3/R4/R5/R6. Astfel, tensiunea la pinul AD0 diferă în funcție de butonul apăsat. Tensiunea este maximă dacă niciun buton nu este apăsat și scade la apăsare. Pinul AD0 (A0 în Arduino IDE) este un pin de intrare analogic. Pentru determinarea butonului apăsat, se apreciază tensiunea ca o valoare cuprinsă între 0 și 1023 (0 fiind echivalent 0 V și 1023 echivalent tensiunii de alimentare de 5 V).

Variația tensiunii în funcție de butonul apăsat și alegerea pragurilor
Variația tensiunii în funcție de butonul apăsat și alegerea pragurilor
Pentru a afla, de exemplu, dacă butonul DOWN a fost apăsat, nu este recomandat să măsurăm tensiunea la apăsarea lui și să comparăm întotdeauna valoarea citită cu aceasta. Corect este să se măsoare valorile analogice corespunzătoare mai tuturor butoanelor și să se aleagă apoi praguri aflate între două butoane.

Pragurile din graficul de mai sus sunt cele oferite de DFRobot. Implementarea lor în cod se poate face astfel:
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

byte readKeypad() {
  int adc = analogRead(A0);

  if (adc < 50) return btnRIGHT;
  if (adc < 250) return btnUP;
  if (adc < 450) return btnDOWN;
  if (adc < 650) return btnLEFT;
  if (adc < 850) return btnSELECT;

  return btnNONE;
}
Schița completă care prezintă modul de utilizare a funcției readKeypad() poate fi descărcată urmând link-urile de la sfârșitul articolului.

Shield-ul ocupă mulți pini ai plăcii de dezvoltare. Să vedem ce rămâne liber. Pe placa de circuit sunt 3 porturi fără conectori (7 pini, dreapta sus; 5 pini, dreapta jos; 6 pini, jos în stânga celui precendent). Se recomandă lipirea de pini în aceste porturi pentru a le putea utiliza. Portul de 7 pini digitali conține printre altele bus-ul SPI. Portul de 5 pini analogici include bus-ul I2C. Portul de 6 pini este doar pentru alimentare.

Porturile shield-ului cu LCD și butoane
Porturile shield-ului cu LCD și butoane
Shield-ul din imaginea de mai sus este cel care se găsește actual prin magazine, puțin diferit de versiunea originală DFRobot.

Link-uri

Niciun comentariu :

Trimiteți un comentariu

Vă recomandăm să citiți regulamentul comentariilor înainte de a scrie un comentariu.