I display 1602 e 2004 rappresentano periferiche di output usate da chi inizia a lavorare con Arduino. Vediamo come personalizzare i caratteri
Il primo programma che si studia per avvicinarsi ad Arduino è Blink, che utilizza un LED come periferica di output. Di seguito si imparano a conoscere il buzzer, i tasti, i potenziometri e il monitor seriale per controllare istante per istante i valori riconosciuti dal programma.
Arriva tuttavia un momento, nella vita di ogni programmatore di Arduino, in cui occorre confrontarsi con il display LCD 1602 (in cui le cifre indicano rispettivamente le colonne e le righe). I più fortunati troveranno invece nel proprio starter-kit un display LCD 2004. Fortunatamente la libreria che consente di interfacciare la scheda con il display già prevede entrambi i formati, ed è possibile integrare la versione minore con le caratteristiche di quella maggiore. In questo frangente si crea di solito una interfaccia con il classico sensore di temperatura, umidità e pressione, utilizzando due o quattro linee per pubblicare i valori delle relative variabili.
Simone Candido ha già trattato su Moreware l’utilizzo del display, spiegandone la configurazione e i trucchi per uno scrolling fine: ripostiamo i relativi link a tali articoli.
Sotto il cofano c’è di più
Per vincere la noia ed evitare di copiare sempre gli stessi programmi, oggi presentiamo un tutorial su come personalizzare un set di caratteri su display LCD 1602 e 2004, in grado di interagire con l’utente in modo più divertente, e magari imposteremo le basi per creare un classico gioco a scorrimento laterale (come i primi Mario Bros, per intenderci) utilizzando semplicemente Arduino, il nostro display LCD e un paio di pulsanti. Alla fine dell’articolo dovremo essere in grado di creare le nostre icone personalizzate da muovere sul nostro display…
Se la cosa vi pare interessante, andiamo avanti!
Matrici e caratteri
Le nuove schede contenenti i display LCD1602 e 2004 dispongono di una circuiteria che li dota di 64 byte modificabili dall’utente. Dal momento che ciascun carattere del display viene prodotto illuminando opportuni pixel in una matrice da 8×5 punti per ciascun carattere, potremo realizzare 8 nuovi elementi grafici.
Un momento… perché solo 8? 5×8 fa 40, non 64!
La risposta è nascosta nel modo in cui i punti dei caratteri sono indirizzati: attraverso un array di bit come nell’esempio seguente.
1 2 3 4 5 6 7 8 9 10 |
byte BarraVerticale[] = { B11111, B00001, B00001, B00001, B00001, B00001, B00001, B11111 }; |
Come è facile intuire, ciascun elemento è costituito da 8 stringhe di 5 bit ciascuna, che, quando vengoo poste a 1, accendono il carattere. Ma non è finita:una volta dichiarata la struttura del nostro carattre, occorre istanziare una variabile che vi faccia riferimento:
1 |
lcd.createChar(0, BarraVerticale); |
A questo punto la nostra variabile è istanziata, e per poterla utilizzare useremo la seguente funzione:
1 |
lcd.write(byte(0)); |
Risulta intuitivo che potremo predefinire 8 caratteri, da 0 a 7, e chiamarli dall’interno del nostro programma attraverso lcd.write(byte(n)); con n compreso tra 0 e 7.
Alla ricerca del glifo perduto
Creare nuovi caratteri utilizzando un foglio di carta a quadretti ci riporta indietro nel tempo, a quando un programmatore doveva disegnare a mano uno sprite per uno Spectrum o un Commodore 64. Erano i tempi gloriosi degli home computer…
Ma se siete troppo pigri o svogliati per cimentarvi in questa attività, esistono programmi online già pronti che vi consentono di “creare” tout-court un disegno in un array di bit. Il programma online in particolare crea anche il codice necessario alla intestazione del display, alle librerie necessarie e all’istanziazione della variabile (ringrazio l’articolo di Michele Pisani che me lo ha fatto conoscere).
Asteroids per tutti!
Il programma di oggi offre un template utile per personalizzare i caratteri su display LCD 1602 e 2004, e creare con Arduino un retrogame sul tipo di Asteroids. Abbiamo infatti creato alcuni sprites che rappresentano un’astronave, un UFO, un asteroide, un raggio laser e un’esplosione. Abbiamo lasciato vuoto il loop(), per darvi modo di lavorarci sopra e, magari, presentarci le vostre implementazioni.
Ricordiamo che, per rendere le operazioni più fluide, potremo utilizzare le routine presentate da Simone nell’articolo relativo.
Considerazioni finali
Vi lasciamo con il seguente listato. A voi stabilire cosa esso rappresenti, e come utilizzarlo per un retrogame a scorrimento. Magari lo implementeremo nelle prossime settimane!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7 byte Heart[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; byte Smiley[8] = { 0b00000, 0b00000, 0b01010, 0b00000, 0b00000, 0b10001, 0b01110, 0b00000 }; byte StarShip[8] = { 0b00000, 0b01000, 0b10000, 0b11110, 0b10000, 0b01000, 0b00000, 0b00000 }; byte Ufo[8] = { 0b00000, 0b00000, 0b01110, 0b10001, 0b11111, 0b00000, 0b00000, 0b00000 }; byte Asteroid[8] = { 0b00000, 0b00100, 0b01110, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; byte LaserBeam[8] = { 0b00000, 0b00000, 0b00000, 0b01111, 0b01111, 0b00000, 0b00000, 0b00000 }; byte Esplosione[8] = { 0b00000, 0b10001, 0b01010, 0b00100, 0b01010, 0b10001, 0b00000, 0b00000 }; byte MoreWare[8] = { 0b01010, 0b10101, 0b10001, 0b00000, 0b10001, 0b10101, 0b01010, 0b00000 }; void setup() { lcd.begin(20, 4); lcd.createChar(0, Heart); lcd.createChar(1, Smiley); lcd.createChar(2, StarShip); lcd.createChar(3, Ufo); lcd.createChar(4, Asteroid); lcd.createChar(5, LaserBeam); lcd.createChar(6, Esplosione); lcd.createChar(7, MoreWare); lcd.home(); lcd.print("I "); lcd.write((byte)0); // per stampare lcd.write() '0' dev'essere 'castato' a byte lcd.print(" Arduino! "); lcd.write((byte)1); } // Con i nuovi sprites è possibile creare un videogame a scorrimento... void loop() { } |
Link utili:
- Arduino UNO R3
- Display LCD 16×02
- Display LCD 16×02 I2C (4 fili)
- Display LCD 20×04
- Display LCD 20×04 I2C (4 fili)
- Interfaccia seriale adattatore IIC I2C per display LCD 1602 e 2004
- Manuale display LCD 16×02 – 20×04
Join our groups onTelegram…