Ti avevo promesso altri articoli dedicati alla Keypad LCD ed al Dolly ed ho deciso di unire i due progetti iniziando una serie di articoli dedicati ad un nuovo Dolly e chiamarli Keypad LCD Dolly.
In pratica sto realizzando delle evoluzioni del progetto Dolly II già presentato.
Il perché del Keypad LCD Dolly
Ma siccome non è mai divertente ricalcare un progetto senza inserirci qualcosa di nuovo ho deciso di reinventare il Kit Dolly dividendolo innanzitutto in due versioni:
- Dolly per macchina fotografica ( DollyPhoto )
- Dolly per telecamera o videocamera, anche definito Slider ( DollyCamera )
Le differenze principali tra i due progetti sono costituite innanzitutto dal peso dello strumento che ha portato tanti appassionati a scrivermi suggerendomi le due distinte versioni.
Infatti una telecamera professionale pesa decisamente di più di una macchina fotografica e questo comporta che il motore deve essere più potente.
Inoltre i due dolly hanno esigenze differenti, il DollyPhoto ha necessità di spostamenti precisi, piccoli e controllati, avrai bisogno di conoscere:
- il numero di passi tra uno scatto ed il successivo
- il tempo tra un passo ed il successivo
- il tempo di stop prima di scattare
- controllare lo scatto mediante foto accoppiatore optoisolato
- controllare il numero di scatti da eseguire
- un movimento fluido
- regolare la velocità del motore
- nessun tempo di stop tra una ripresa e la successiva
è logico pensare che un motore stepper in questo caso possa essere inutile e sottodimensionato, per cui è meglio usare un motoriduttore e se proprio vuoi conoscere anche quanti giri hai fatto puoi utilizzare un motoriduttore con encoder ad effetto Hall.
Keypad LCD Dolly – prima parte
In questa prima parte dedicata all’evoluzione del Dolly parleremo del DollyPhoto, quello per time-lapse, ed in particolare il primo sketch che puoi provare è dedicato all’uso della Keypad LCD Dolly per visualizzare e gestire i menu.
Come funzione il Keypad LCD Dolly
Quando avrai caricato lo sketch sul tuo Arduino Uno R3 vedrai sul display comparire la schermata:
di presentazione, dopo 2 secondi ( definiti tra le costanti dello sketch ) la schermata diventa:
questo significa che il DollyPhoto è pronto per accettare comandi, premendo il pulsante SELECT per due secondi entri in modalità IMPOSTAZIONI:
i cui primi due menu riguardano l’impostazione dei parametri di funzionamento e la verifica di quanto impostato, premendo il pulsante DOWN l’indicatore a freccia a sinistra si sposta per indicarti che stai selezionando la voce VERIFICA continuando a premenere DOWN la schermata del Keypad LCD Dolly cambia:
mostrandoti gli altri due menu di impostazione, RESET CARRELLO ed AVVIO, a cosa servano sono certo che già lo sai o lo hai intuito.
Dopo 4 secondi durante i quali non premi alcun pulsante il Keypad LCD Dolly esce dalla modalità di impostazione tornando alla schermata di attesa comandi.
Lo sketch
ecco lo sketch che puoi utilizzare per gestire i menu del Keypad LCD Dolly Photo:
/*********************************************************** Progetto DollyPhoto ver 1.0 Autore Mauro Alfieri Web mauroalfieri.it Tw: @mauroalfieri Licenza Common Creative ***********************************************************/ #include <LiquidCrystal.h> /**********************************************************/ #define BUTTON A0 #define BACKLIGHT 10 #define MOTDTIME 2000 #define LCDTIME 3000 #define SETMODETIME 2000 #define DEBUG /**********************************************************/ char line0[16] = "Dolly Foto ver1"; char line1[16] = "mauroalfieri.it"; /**********************************************************/ int SELECT[] = {720,760}; int LEFT[] = {480,520}; int RIGTH[] = {0,20}; int UP[] = {120,160}; int DOWN[] = {300,350}; int buttonPress = 0; /**********************************************************/ unsigned long timeToBlacklight = 0; unsigned long timeToSetMode = 0; unsigned long timeSetting = 0; /**********************************************************/ boolean blacklightStatus = false; /**********************************************************/ byte symbolselect[8] = {B00001,B00011,B00111,B01111,B00111,B00011,B00001}; byte symbolplay[8] = {B10000,B11000,B11100,B11110,B11100,B11000,B10000}; byte symbolstop[8] = {B00000,B11111,B11111,B11111,B11111,B11111,B00000}; byte symbolpause[8] = {B00000,B10001,B10001,B10001,B10001,B10001,B00000}; /**********************************************************/ char* principale[4] = {"Impostazioni","Verifica","Reset Carrello","Avvio"}; /**********************************************************/ LiquidCrystal lcd(8,9,4,5,6,7); /**********************************************************/ void setup() { #ifdef DEBUG Serial.begin( 9600 ); Serial.println("Avvio"); #endif /**********************************************************/ pinMode( BACKLIGHT,OUTPUT ); digitalWrite( BACKLIGHT,LOW ); /**********************************************************/ lcd.begin(16, 2); lcd.createChar(1, symbolselect); lcd.createChar(2, symbolplay); lcd.createChar(3, symbolstop); lcd.createChar(4, symbolpause); /**********************************************************/ digitalWrite( BACKLIGHT,HIGH ); lcd.setCursor(0,0); lcd.print(line0); lcd.setCursor(0,1); lcd.print(line1); delay( MOTDTIME ); lcdBlacklightOff(); } /**********************************************************/ void loop() { /**********************************************************/ #ifdef DEBUG Serial.print( " Button: " ); Serial.print( analogRead( BUTTON ) ); Serial.print( " TimeToBlecklight " ); Serial.print( timeToBlacklight ); Serial.print( " TimeToSetHour " ); Serial.println( timeToSetMode ); #endif /**********************************************************/ if ( ctrlButton( analogRead( BUTTON ) ) == 0 || ctrlButton( analogRead( BUTTON ) ) > 1 ) { timeToSetMode = millis(); } if (timeToSetMode > 0 && SETMODETIME < (millis() - timeToSetMode) ) { menuMode(); timeToSetMode = 0; } /**********************************************************/ buttonPress = ctrlButton( analogRead( BUTTON ) ); /**********************************************************/ if ( (blacklightStatus) && LCDTIME < (millis() - timeToBlacklight) ) { lcdBlacklightOff(); } /**********************************************************/ char line0[16] = " in attesa di "; char line1[16] = " comandi ..."; /**********************************************************/ lcd.setCursor(0,0); lcd.print(line0); lcd.setCursor(0,1); lcd.print(line1); /**********************************************************/ } /**********************************************************/ int ctrlButton( int button ) { buttonPress = 0; if ( SELECT[0] <= button && button <= SELECT[1] ) { buttonPress = 1; } if ( LEFT[0] <= button && button <= LEFT[1] ) { buttonPress = 2; } if ( RIGTH[0] <= button && button <= RIGTH[1] ) { buttonPress = 3; } if ( UP[0] <= button && button <= UP[1] ) { buttonPress = 4; } if ( DOWN[0] <= button && button <= DOWN[1] ) { buttonPress = 5; } if (buttonPress > 0) { digitalWrite( BACKLIGHT,HIGH ); blacklightStatus = true; timeToBlacklight = millis(); } return buttonPress; } /**********************************************************/ void lcdBlacklightOff() { digitalWrite( BACKLIGHT,LOW ); blacklightStatus = false; timeToBlacklight = 0; lcd.clear(); } /**********************************************************/ void menuMode() { /**********************************************************/ #ifdef DEBUG Serial.println( "Menu Mode" ); #endif /**********************************************************/ boolean setMode = true; int setModeLevel = 0; timeSetting = 0; lcd.clear(); /**********************************************************/ delay( 1000 ); /**********************************************************/ while ( setMode ) { /**********************************************************/ if ( ctrlButton( analogRead( BUTTON ) ) != 0 ) { timeSetting = millis(); } if ( (ctrlButton( analogRead( BUTTON )) == 5 ) && setModeLevel < 3 ) { lcd.clear(); setModeLevel++; } if ( (ctrlButton( analogRead( BUTTON )) == 4 ) && setModeLevel > 0 ) { lcd.clear(); setModeLevel--; } if ( (setModeLevel % 2) == 0 ) { lcd.setCursor(0,0); lcd.print( principale[setModeLevel] ); lcd.setCursor(0,1); lcd.print( principale[(setModeLevel+1)] ); lcd.setCursor(15,0); lcd.write(1); lcd.setCursor(15,1); lcd.print(" "); } else { lcd.setCursor(0,0); lcd.print( principale[(setModeLevel-1)] ); lcd.setCursor(0,1); lcd.print( principale[setModeLevel] ); lcd.setCursor(15,0); lcd.print(" "); lcd.setCursor(15,1); lcd.write(1); } if ( ctrlButton( analogRead( BUTTON )) == 1 ) { if ( setModeLevel == 0 ) { impostazioni(); } if ( setModeLevel == 1 ) { verifica(); } if ( setModeLevel == 2 ) { reset(); } if ( setModeLevel == 3 ) { avvio(); } setMode = false; timeSetting = 0; } if (timeSetting > 0 && (SETMODETIME*2) < (millis() - timeSetting) ) { setMode = false; } delay(200); } /**********************************************************/ lcd.clear(); } /**********************************************************/ void impostazioni() { lcd.clear(); lcd.setCursor(0,0); lcd.print( "Menu " ); lcd.setCursor(0,1); lcd.print( "Impostazioni" ); delay( SETMODETIME ); } /**********************************************************/ void verifica() { lcd.clear(); lcd.setCursor(0,0); lcd.print( "Menu " ); lcd.setCursor(0,1); lcd.print( "Verifica" ); delay( SETMODETIME ); } /**********************************************************/ void reset() { lcd.clear(); lcd.setCursor(0,0); lcd.print( "Menu " ); lcd.setCursor(0,1); lcd.print( "Reset" ); delay( SETMODETIME ); } /**********************************************************/ void avvio() { lcd.clear(); lcd.setCursor(0,0); lcd.print( "Menu " ); lcd.setCursor(0,1); lcd.print( "Avvio" ); delay( SETMODETIME ); } /**********************************************************/
lo scketch si limita a definire alcuni punti fermi del progetto DollyPhoto, come il menu principale e le funzioni che andrai a richiamare per ciascun menu.
Alcune parti di codice presenti in questo sketch le avrai riconosciute, provengono dal primo articolo dedicato alla Keypad LCD ed altre le ho modificate rispetto a quel primo sketch o aggiunte per far fronte alle esigenze del progetto Keypad LCD Dolly.
I punti fondamentali dello sketch loi ho spostati nelle funzioni aggiunte in modo da analizzarle singolarmente, prima però guarda le linee 49-51 in queste linee disegni 4 simboli che utilizzerai poi nel progetto per renderlo graficamente più bello accattivante:
- select: freccia con la punta rivolta a sinistra
- play: freccia con la punta rivolta a destra
- stop: un quadrato
- pause: due linee vericali parallele
alle linee 78-81: crei i 4 simboli utilizzando il metodo createChar( n,sibolo ) messo a disposizione dalla classe LiquidCrystal;
linee 85-91: accendi il display e scrivi sulla prima e sulla seconda linea la frase di apertura, poi attendi il tempo definito in MOTDTIME e spegni la retro illuminazione per risparmiare alimentazione;
linea 108: richiami la funzione ctrlButton( valore letto su A0 ) chiedendole di verificare quale pulsante è stato premuto, la logica di questa funzione è identica a quella vista nel precedente articolo, ho fatto solo qualche correzione che ti mostrerò leggendo la funzione. Se il valore restituito da ctrlButton() è 0 o maggiore di 1 vuol dire che hai premuto un qualsisasi pulsante tranne SELECT e quindi non è necessario che lo sketch inizi a contare per quanto tempo il pulsante è stato premuto, alla pressione del pulsante SELECT la ctrlButton() restituisce infatti 1 ed è da quel momento che devi contare quanto tempo lo hai tenuto premuto;
linea 109: verifica che il tempo trascorso dalla pressione del pulsante 1, linea 108, sia maggiore di quello impostato nella variabile SETMODETIME in tal caso entra in modalità di configurazione chiamando la menuMode();
line136-152: la funzione ctrlButton() è la stessa dell’articolo precedente a parte la modifica per cui ad ogni controllo se la condizione è verificata non retituisce subito il valore ma lo imposta nella variabile buttonPress e solo alla fine ( linea 151 ) restituisce questo valore. La modifica ti permette di semplificare il codice in modo che qualunque operazione comune alla pressione di tutti i pulsanti tu voglia eseguire potrai inserirla una sola volta prima del comando return come in questo caso in cui l’accensione della retro illuminazione avviene sempre prima del return;
linea 165: definisci la funzione menuMode() in cui entra se premi per 2 secondi il pulsante SELECT quando il Keypad LCD Dolly è in attesa di comandi;
linee 175-178: imposti alcune variabili utili al funzionamento delo sketch come setMode con cui regoli se sei in modalità di settaggio o meno;
linea 186: fino a quando il valore di setMode non cambia da true a false resti nel ciclo di settaggio;
linea 190: se non premi alcun pulsante, la ctrlButton restituisce 0, il contatore parte; se invece premi un qualsiasi pulsante il valore di timeSetting è reimpostato a millis() ossia il conteggio ricomincia;
linee 192-193: controlli la pressione dei pulsanti UP e DOWN ed in funzione del pulsante premuto incrementi o decrementi il valore della variabile setModeLevel;
linea 195: verifica che il modulo per 2 di setModeLevel sia 0, essendo il modulo il resto della divisione del valore setModeLevel per il dividendo 2 se questo valore è 0 vuol dire che setModeLevel è pari, altrimenti è dispari;
linee 196-199: stai mostrando un menu pari, vedi linea precedente, per cui scriverai sulla prima linea il valore corrente della voce di menu e su quella successiva la voce di menu successiva ( setModeLevel+1 );
linee 201-204: disegna il simbolo 1 definito alla linea 78 in fondo alla prima riga, partendo dall’idea che se il setModeLevel è pari sei sicuramente sulla prima linea del display, puoi quindi pulire il 15° carattere della seconda linea;
linee 206-214: esegui le medesime operazioni viste per le linne 196-204 solo impostando il cursore freccia di selezione sulla seconda linea del display;
linea 217: verifica la pressione del pulsante e confrontala con 1, ossia che hai premuto SELECT sulla Keypad LCD ed in caso di pressione del pulsante atteso esegui le linee successive;
linee 218-221: valuta al momento in cui hai premuto il pulsante quale è il valore di setModeLevel ed in funzione di tale valore richiama la funzione corrispondente;
linea 223: imposta a false il valore di setMode in modo che al prossimo ciclo while non sia verificata la condizione della linea 186 ed esci dalla modalità di settaggio;
linea 224: imposta a 0 il valore di timeSetting in modo da uscire subito dalla menuMode;
linea 227: è il controllo sul tempo trascorso dalla pressione dell’ultimo pulsante, in pratica serve ad uscire dal ciclo while se non premi alcun pulsante per un tempo superiore al doppio di SETMODETIME;
linea 233: pulisci il display dai menu che hai visualizzato prima di tornare alla funzione loop();
linee 238-246: definisci una funzione impostazioni() richiamata dalla funzione menuMode() ( linea 218 ). Lo scopo di questa funzione in questo sketch è scrivere sul monitor il testo contenuto alle linee: 241 e 243 e di attendere il tempo SETMODETIME prima di uscire. Nelle prossime fasi del progetto useremo questa funzione per impostare dei parametri per il Keypad LCD Dolly o DollyPhoto;
linee 250-282: definisci alre 3 funzioni, richiamate dalle linee 219-220-221, identiche alla impostazioni() che utilizzerai per far funzionare il Dolly Photo.
Il video del Keypad LCD Dolly
Per mostrarti come funziona ho realizzato un video:
Buon lavoro !!!
20 commenti
1 ping
Vai al modulo dei commenti
ciao ho provato a montare l’LCD su Arduino, e caricare lo Sketch, all’inizio escono le due schermate come nell’esempio che hai fatto, ma poi non mi lascia impostare niente altro, ed escono sempre e solo le due schermate iniziali,dopo di che tutto nero.
Ti sarei grato se mi aiutassi grazie
Autore
Ciao Francesco,
proprio oggi ho pubblicato un confronto tra le versione 1.0 e la versione 1.1 della keypad LCD.
Che versione hai tu?
Mauro
Ciao mauro, ho visto la keypad LCD. ed è la versione 1.1
Autore
Ciao Francesco,
leggi l’articolo di ieri ed apporta le modifiche allo sketch con i valori che leggi dalla tua Keypad LCD.
Mauro
Ciao Mauro, anche io ho lo stesso problema oltre ad non trovare il tuo articolo
sopracitato. Puoi indirizzarmi in qualche modo a quel articolo con qualche link ,te ne sarei grato.
Mario
Autore
Ciao Mario,
a quale problema ti riferisci?
Che articolo cerchi senza riuscirci?
Mauro
Ciao Mauro
ho risolto grazie, i valori dei pulsanti del LCD keypad “selec-left-up-down ” non corrispondevano
con quelli del tuo skeatch.
Autore
Ciao Mario,
che versione della Keypad LCD possiedi?
La ver 1.0 e la ver 1.1 differiscono per alcune piccole caratteristiche tra cui il valore analogico letto sul pin A0.
Mauro
Ciao Mauro, ho caricato lo sketch e devi dire che funziona tutto perfettamente, era quello che cercavo di fare, ora però mi servirebbero delle indicazioni perchè non riesco a combinare nulla.
Il mio scopo sarebbe quello di creare un piccolo controller per acquario, nulla di complicatissimo, il problema è che non so come integrare nel dolly menu, vorrei creare, nell’ordine:
Messaggio di benvenuto (e qua piu o meno ho capito come fare)
Visualizzare data e ora per qualche secondo poi la temperatura, della quale vorrei variare attraverso i pulsanti la soglia di accensione e spegnimento del riscaldatore.
Impostare tempo di accensione, e spegnimento e durata del fade
Sono riuscito a fare funzionare un pò tutto a blocchi separati, (temperatura, luce a led col fading, ed rtc) ma il mio problema è mettere tutto assieme e comandare il tutto dai pulsanti e dal lcd…
Ho fatto migliaia di tentativi, ma siccome sono poco esperto, credo che senza qualche indicazione non ci riuscirò mai…
Grazie per l’attenzione
Autore
Ciao Michele,
essendo il progetto Dolly molto differente da quello che desideri realizzare io ti consiglio di partire da uno sketch nuovo tutto tuo.
Se hai già realizzato dei blocchi funzionanti puoi racchiuderli in funzioni che richiamerai dal menù.
Prova a leggere anche il mio progetto sul datalogger umidità e temperatura di qualche settimana fa.
Mauro
ciao Mauro ,mi sono studiato per bene il tuo sketch e ho provato anche la versione definita e ho notato che se entro in menu e non premo nessun tasto non esce dopo xtime , se premo down parte il tempo , cioe’ la line 227 funziona se premo almeno una volta un tasto altrimenti no (es se da impostazioni passi a verifica e poi ripassi a impostazioni il tempo parte e poi lcd si spegne e ritorna al menu principale ,mentre se entri nel menu e non premi nulla resta li fermo con lcd acceso e in menu )
inoltre volevo capire come mai se entro in impostazioni (nel versione definitiva esempio neltempo di ALT ) anche in quel caso non entra in funzione il tempo di uscita e rimane sempre .
Esiste la possibilita; di uscire dal menu’ in qualsiasi condizione si trovi lcd? (ovvero che lacondizione nella riga 227 sia sempre rispettata a prescindere da che posizione mi trovi nel menu?
grazie mille !!
P.S. per lcd grafico mi ero espresso male io pensavo si potesse stampare come un lcd 16×4 valori float ecc(lcd.print(dht.temperature); per capirci ) e non array predefiniti ,ho convertito il valore float in char e funziona benssimo grazie mille per la svista mia ….
Autore
Ciao Francesco, controlla che i tuoi tasti restituiscano i valori attesi nello sketch, il comportamento che descrivi sembra quello dato da una differenza tra il valore impostato nello sketch ed il valore rilevato da arduino alla pressione di un tasto.
Avendo una lcdshield leggermente diversa dalla tua ho cambiato leggermente i range dei pulsanti e funzionano a dovere( è l’unica modifica che devo apportare per farlo funzionare, dopo ciò funziona tutto
Autore
Ottimo Francesco,
se la Keypad LCD che hai tu è diversa da quella che ho usato nel mio progetto devi adattare eventuali pin differenti per usare l’LCD ( potrebbero anche non cambiare ) e i valori restituiti dai pulsanti.
Lcd shield mia ha solo le resistenze diverse dando valori sul A0 leggermente diversi dai tuoi, ho corretto i valori e funziona tutto. Non so se è un problema legato al tuo skecth o alla mia lcd shield ma se apro il menu’ e non tocco nessun tasto( ovvero premo select per due secondi, si apre il menu e non premo up o down) lcd rimane acceso e in modalita menu. Esco dal menu, ritorno nel menu scorro con il tasto down dopo tot secondi lcd si spegne e ritorna alla schermata iniziale.
Se poi entro nel menu impostazioni (non in questa versione che non contiene nulla ma nella ver finale) e non scorro il sottomenu lcd non di spegne e non esce.
Praticamente il timesetting inizia a contare se premo up o down altrimenti no… anche la tua fa lo stesso?
Grazie mille e scusa se rompo , puo sembrare una stupidata ma non ne esco da sta storia
Autore
Ciao Francesco,
il mio sketch ha dei comportamenti più regolari, deve esserci qualche altra differenza tra le shield usate e quelle del kit che ho realizzato.
La cosa migliore in questi casi è attivare una serie di Serial.print() nello sketch e verificare con il monitor seriale cosa avviene per ciascun menu ed alla pressione di ogni tasto per capire cosa induce lo sketch a comportarsi in questo modo.
Ciao Mauro, ti faccio i complimenti, sono un fotografo amatoreiale di paesaggistica, e sto cercando di costruirmi anche io la mia dolly seguendo i tuoi consigli. ho caricato lo sketch di cui sopra avendo arduino r3 ed il LCD KEYPAD DISPLAY SHIELD MODELLO KUMAN KY 54 1602 V 3 .
Purtroppo appena carico i comandi compare solo il messaggio di benvenuto bloccandosi. nessun tasto funziona .
potresti darmi una mano? sono nuovo in questo mondo e so poco di programmazione.
ti sarei grato e molto (cena offerta in sardegna ) se potessi darmi le opportune correzioni. grazie
Autore
Ciao Antonio,
sicuramente avendo una scheda differente da quella utilizzata dovrai verificare tutti i valori restituiti e controllare che i pin non vadano in conflitto con la shield di controllo del motore.
Nei commenti a questo ed agli altri articoli sul blog, dedicati al dolly, troverai molte delle informazioni che ti occorrono.
purtroppo francesco non mi e facile fare cio ancora, pensavo potessi aiutarmi in qualche modo, magari se mi inserisci qualche link vedo se riesco a fare da solo, in ogni caso qualsiasi aiuto è valido ed importante anche da parte degli altri
Autore
Chi è Francesco ?
[…] prima e nella seconda parte del progetto hai visto che la linea 57 dello sketch relativo al Dolly Photo […]