Creato da: DonnyLennon il 05/01/2011
esperienze, appunti e risorse di elettronica e robotica

Area personale

 

Contatta l'autore

Nickname: DonnyLennon
Se copi, violi le regole della Community Sesso: M
Età: 34
Prov: CL
 
 

Tag

 
RSS (Really simple syndication) Feed Atom
 

Ultimi commenti

Ultime visite al Blog

cicciociccioviperocelot1Antares1962NonnoRenzo0chernobyl0kappa41chief33francpierorsoyoghi63martano1979gianpaolomartyPeppe_DelPretefrak70xxiceJesGia
 

 

 
« Arduino Drum Pad - TutorialCome riutilizzare un vec... »

Mini Gioco con Arduino e display LCD

Post n°3 pubblicato il 15 Aprile 2011 da DonnyLennon
 

 

Questo semplice progetto utilizza un display LCD di tipo alfanumerico 16X4, 16 colonne, 4 linee, con controller HD44780. E' il controller/driver per display lcd più utilizzato. Per vedere se il vostro LCD ha questo componente, controllate la sigla dell'integrato nel retro del disply, come in figura sotto:

retro lcd

 

Ovviamente Arduino ha delle librerie appostite per queste periferiche. La libreria da utilizzare è la LiquidCrystal. Fortunatamente è già presente nelle librerie varie di default che si trovano quando installi arduino.

Possiede pochi e semplici comandi. Ma veniamo prima al cablaggio dei componenti.

CABLAGGIO:

cablaggio

 

L'immagine è tratta dal sito di Arduino, e spiega con molta chiarezza i collegamenti da effettuare. Consiglio di utilizzare una breadboard, evitando di effettuare saldature.

In questo caso il display è a 16 pin. Alcuni sono a 14 pin. Gli ultimi due servono per il controllo della retro illuminazione, di cui per adesso non ce ne occupiamo.

NOTA BENE: Il pin 3 del display (chiamato Vb nell'immagine sopra) è per il controllo del contrasto. Nella figura mediante un potenziomentro gli viene data una tensione variabile da 0 a +5V. Variando il potenziometro si regola lo schermo finchè non si vedono i caratteri con chiarezza. Però in alcuni display (ed anche nel mio, lo STIM 212) bisogna collegare Vb ad una tensione negativa -5 Volt, mediante una resistenza. Il valore della resistenza adatta varia sempre a seconda dello schermo. Provate con qualche centinaia di Ohm, poi con qualche KiloOhm e così via... O utilizzate un potenziometro per trovarla con precisione.

 

CODICE:

Prima di programmare arduino con questo codice, consiglio di fare un pò di pratica e provare con codici più semplici come Hello World, che trovate QUI. In questo modo si imparano i semplici comandi di scrittura, e modifica dei caratteri.

Le istruzioni principali sono:

lcd.setCursor(x, y): sposta il cursore nella posizione colonna x, riga y.Vedi esempio sotto:

lcd.print("k"); stampa il carattere "k", nella casella indicata da setCursor

 

Veniamo al codice!

Il firmware realizza un semplice giochino. Come si vede dal video, una "palla" (che non è altro che il carattere ASCII "O"), cade dall'alto, e tramite un secchio (carattere "D") bisogna evitare che la palla cadi per terra. Il secchio si muove orizzontalmente e si sposta a sx e dx mediante due pulsanti esterni collegati ai pin 8 e 9 di arduino. Collegate i due pulsanti come mostra la figura sotto (il cavo "SEGNALE" va al pin 8 / 9 di arduino), con una resistenza da qualche KOhm. Normalmente SEGNALE è uguale a 0, premendo il pulsante SEGNALE = Vcc.

 

pulsante

 

 

#include <LiquidCrystal.h>

int n = 0;            //altezza palla
int m = 2;           //posizione orizzontale palla
int p = 1;          //posizione orizzontale secchio


boolean game = true;  //introduce una variabile booleana (vero/falso)
                      //true= gioco attivo, false= gioco disattivo

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //setta i pin del display                                                                          
void setup() {pinMode(8, INPUT);
             pinMode(9, INPUT);
             lcd.begin(16, 4);}        

//lcd.begin(16, 4) dichiara che il display è 16(colonne) per 4(righe)


void loop() {
if (game == true)             //gioco in stato ON
{lcd.setCursor(n, m);      
lcd.print("O");                 
lcd.setCursor(15, p);         
lcd.print("D");                     
delay(120);          
lcd.clear();      //effettua il refresh dello schermo
n++;              //incremento n. Per far scendere la palla

if(n==16) {if(m != p) {game= false;}  //CONDIZIONE DI GAME OVER
           n=0; m= random(4);}

if(digitalRead(9) == HIGH) {p++;}   //sposta il secchio a sx
if(digitalRead(8) == HIGH) {p--;}   //sposta il secchio a dx

if(p==-1) {p=0;}         //limiti dello schermo                       
if(p==4) {p=3;}                      
}

if (game == false)          //stato di gameover...
{lcd.setCursor( 3, 0);                          
lcd.print("HAI PERSO!");
lcd.setCursor(0, 2);
lcd.print("premi un tasto...");
if((digitalRead(8)==HIGH)||(digitalRead(9)==HIGH)) {game=true;}
}

}

 

NOTA BENE:

Sto utilizzando il display nella posizione verticale. Quindi la palla scendendo avanza di colonna! E' come se le righe fossero colonne e viceversa.

L'istruzione setCursor(m, n) inizialmente mi ha dato problemi. Mi pare di aver letto che sia presente un bug quando si utilizzano display 16X4. Quindi consiglio inizialmente di provare l'istruzione scrivendo un carattere in un punto fissato dello schermo con l'istruzione lcd.print(), preceduta da setCursor(m, n). Se riscontrate problemi andate nella cartella librerie e modificate il file "LiquidCrystal.cpp", modificando i valori assegnati a:

int row_offsets[]:

Io ho utilizzato questi, ed ho risolto il problema:

int row_offsets[] = { 0x00, 0x40, 0x10, 0x50 };

 

 

PER QUALSIASI DUBBIO, O SUGGERIMENTO O CRITICA, CONTATTATEMI!

trevis89@hotmail.it

ALLA PROSSIMA BYE!

 
Condividi e segnala Condividi e segnala - permalink - Segnala abuso
 
 
Vai alla Home Page del blog

© Italiaonline S.p.A. 2024Direzione e coordinamento di Libero Acquisition S.á r.l.P. IVA 03970540963