Arduino Shield TV: collegare Arduino ad una TV

di Girolamo D’Orio
Come realizzare uno Shield TV per Arduino Uno per permette di visualizzare informazioni e semplici immagini su qualsiasi TV.

Molto spesso, capita che con Arduino Uno si abbia la necessità di visualizzare un dato qualsiasi. Tendenzialmente vengono utilizzati piccoli schermi LCD tipo 16×2 o display grafici 128×64. Molto pratici senza dubbio, ma come limitazione hanno che la lettura è veramente difficile.
Per puro caso, mi sono imbattuto nel web nella libreria TvOut scritta da Myles Metzer al quale vanno i migliori ringraziamenti e complimenti per il suo operato.
Occupando solo tre PinOut della Board di Arduino Uno (due per il video e uno per l’audio) lascia ampio margine per permettere di realizzare con la Board numerose applicazioni di vario tipo. Si può sopperire a tale privazione usando integrati I/O expander con comunicazione I2C tipo PCF8574 o MCP23017.
In questo articolo, a scopo didattico, verranno visualizzati su TV la temperatura fornita da una sonda di temperatura LM35 e lo stato in tempo reale di un ingresso e un uscita digitale. Per rendere semplice l’idea a tutti, l’ingresso è rappresentato con un pulsante e l’uscita da un normale LED.

IL PROGETTO

Per rendere pratica la realizzazione e poter usare questo Shield sulla maggior parte dei televisori, anche molto vecchi, ho usato una presa SCART per avere una maggiore flessibilità.
La presa SCART femmina a saldare, la potete trovare ovunque: attenzione a non rovinare o deformare la struttura in plastica della presa SCART. Io l’ho recuperata da un riproduttore DVD guasto.
Se poi, il TV a cui intendete collegare Arduino con questo Shield, non possiede la presa d’ingresso SCART potete usare anche i connettori RCA, seguendo lo schema di collegamento riportato in figura 1. Il connettore RCA va collegato a video out (pin 7 e 9) e la “calza” a massa (GND).

Figura 1: Schema per il collegamento con connettori RCA

SCHEMA E PCB

Come vi ho sopracitato invece di usare collegamenti con connettori RCA ho utilizzato un connettore SCART. I collegamenti standard sono mostrati in figura 2.

Figura 2: Collegamenti standard della SCART
Figura 3: Schema per il collegamento con la presa SCART

 
Normalmente, se si analizza il segnale video nel dominio della frequenza si nota nel formato standard europeo nominato PAL (25 frammenti al secondo) lavora a 4,433 MHz. Il video composito siglato di consuetudine CVBS viene chiamato cosi perché le informazioni di luminanza, crominanza e i sincronismi d’immagine vengono miscelati in un unico flusso.
Detto ciò, è per evidenziare che il nostro Arduino che lavora a 16 MHz grazie al suo oscillatore esterno, riesce a garantire quanto richiesto dal formato video standard. Con l’uscita 7 I/O digitale e la 9 in PWM accoppiate alle due resistenze in parallelo, in uscita da questo “partitore di adattamento”, la libreria riesce a far rientrare i valori di ampiezza del segnale video composito standard.

Figura 4: Master PCB: dimensioni 64,7 X 53,4 mm

SCARICA IL PCB IN SCALA 1:1

Figura 5: Schema Montaggio

SCARICA SCHEMA MONTAGGIO IN SCALA 1:1

 

Elenco materiali

Elenco componenti
R1 1 KOhm 1/4 W
R2 470Ohm 1/4 W
R3 330ohm 1/4 W
Connettore Presa Scart Femmina a saldare
Board Arduino UNO Rev.3
Molto semplice e di poca spesa, tre semplici resistenze di adattamento. Come si vede nell’immagine rientra perfettamente nelle dimensioni della Board Arduino Uno Rev.3.

Figura 6: Realizzazione Arduino Shield TV

LA PRIMA PROVA DOPO AVER REALIZZATO LO SHIELD…

Come sopracitato essendo un Shield “didattico” che offre molteplici applicazioni, possiamo fare un circuito molto semplice, che qualsiasi “Arduinista”, anche alle prime armi ha sicuramente i materiali nel “cassetto”.
Prendiamo:
1) Sensore di temperatura con uscita analogica – LM35dt
2) Un pulsante normalmente aperto – NA
3) Una resistenza limitatrice di corrente – 330 o 470 ohm
4) LED tradizionale con assorbimento compreso tra le 15-20ma
Posizionate così i componenti sulla vostra Breadboard e effettuate i collegamenti come in figura 7. Naturalmente, applicate lo Shield TV sopra ad Arduino Uno…
 

Figura 7: Schema per la realizzazione del nostro esempio

SKETCH DA CARICARE

Dopo aver richiamato la libreria e le sue variabili, aggiungiamo una sub-routine che ha il compito di misurare i valori analogici provenienti dal sensore di temperatura. Esegue un ciclo di 10 misurazioni in un secondo, viene calcolato il valore medio e convertito in temperatura. Nel Void setup oltre ad inizializzare la libreria in formato PAL e la risoluzione dello schermo, andiamo a dichiarare ingressi e uscite.
Si nota dallo schema sopra che non ho messo di proposito una resistenza di Pull-Up o Pull-Down per forzare uno stato logico sull’ingresso.
L’ho fatto tramite software digitando:

pinMode(2,INPUT_PULLUP);

Viene abilitata l’alta impedenza su questo pin, quindi si può omettere la resistenza di pull-up. Occorre ricordarsi che facendo cosi occorre ragionare diverso dal convenzionale, ovvero lo stato logico della porta, alla pressione del pulsante non varia da basso a alto, ma viceversa. La porta assume un valore logico basso solo quando il pulsante sarà premuto. Quindi andiamo a vedere la condizione al momento della pressione del pulsante:

if (digitalRead(2)==LOW){
 TV.tone(160,100);
 pulsanteON();
 delay(100);
 digitalWrite(3, !digitalRead(3));
 }

Alla pressione del pulsante verrà emesso un suono su TV per conferma, una pausa antirimbalzo per il pulsante e il led cambierà stato in una sola riga di comando. Con questa riga vado a dire al microcontrollore che il pin interessato, dovrà assumere un valore diverso rispetto a quello che ha, quindi se è acceso si spegne e viceversa.
C’è anche un’altra sub-routine nominata pulsanteON, andiamo a vederla:

void pulsanteON(){
// TV.draw_rect(asse orizzontale,verticale,asse orizzontale inizio rettangolo,
 //asse verticale fine rettangolo,colore bianco=1 - nero=0,riempimento del disegno bianco=1 - nero=0);
 TV.draw_rect(13,55,8,5,0,0);
 TV.draw_rect(16,61,2,10,0,0);
 TV.draw_rect(13,64,8,5,1,1);//pulsante abbassato
 TV.draw_rect(10,70,14,12,1,1);
}

Questa sub-routine viene richiamata quando avviene la pressione del pulsante, quindi come obbiettivo è disegnare un pulsante che sembra premuto. Dato che non ho utilizzato di proposito la funzione di TV clear screen per cancellare la schermata nel loop principale per non rallentarlo, si presentano problemi di sovrapposizione delle immagini. Quindi per “cancellare” il pulsante in condizione di riposo, che risulta essere raffigurato più alto, vado con le prime due righe di comando di disegno a colorarlo di nero. In seguito lo disegno abbassato.
Il concetto è: non cancellare ma colorare di nero….
Al momento del rilascio del pulsante faccio esattamente l’opposto.
Medesima strategia per raffigurare il led acceso o spento.
I numeri dentro la parentesi non sono altro che le coordinate x e y dello schermo dove andremo a disegnare, guardiamole in dettaglio:
Per disegnare un rettangolo, la libreria necessita di punti di origine. Immaginate di disegnare un rettangolo su PC con il mouse. Al momento della pressione del tasto sx del mouse sullo schermo è come se venisse dichiarato il punto di partenza, ovvero le coordinate da dove vogliamo iniziare. Questi sono i due primi valori:

TV.draw_rect(13,55,

Sempre tenendo premuti il pulsante sx del mouse normalmente ci spostiamo e inizia a prendere forma il rettangolo. Al momento del rilascio viene stampato il rettangolo ed ecco le altre due coordinate da inserire:

TV.draw_rect(13,55,8,5,

A questo punto si sceglie se colorare il perimetro. Con il valore 1 il perimetro del nostro rettangolo assume un colore bianco. Abbiamo anche la possibilità di colorare la sua area con l’ultimo parametro che richiede la libreria. Se inseriamo 1 avremo un rettangolo completamente bianco, altrimenti se inseriamo 0 si visualizzerà solo il perimetro di colore bianco. La sua area interna sarà adesso di colore nero. Ecco un rettangolo completamente colorato:

TV.draw_rect(13,55,8,5,1,1);

Stessa cosa si fa per disegnare una linea, i primi due numeri rappresentano il punto di origine, il terzo e il quarto indicano la destinazione. In questo caso, inutile l’ultimo parametro di riempimento dell’area, una linea semplice non ha un’area da riempire con una colorazione.

TV.draw_line(96,66,101,66,0);

Per disegnare un cerchio occorre sempre una coordinata x/y di partenza per i primi due numeri, è il centro dove inizia ad evolversi il cerchio. Il terzo numero indica la lunghezza del raggio e gli ultimi due sono colore e riempimento area del cerchio.

TV.draw_circle(98,65,3,1,1);

Ora che abbiamo appreso come disegnare, impariamo a scrivere messaggi su un monitor Tv.
La libreria vi permette di scrivere dati come avete sempre fatto su i normali lcd monocromatici, che siano un 2×16 o un 4×20. Dato che qui si ragiona in pixel occorre fare leggermente diverso, con qualche attenzione in più. Occorre prima dichiarare quale font utilizzare e poi stampare il nostro messaggio. Ecco un semplice esempio:

TV.select_font(font6x8);
TV.set_cursor(15,50);
TV.println(" Ciao lettori di FE");

I font utilizzabili sono nella libreria TVOUT di Myles Metzer che potete scaricare da QUI:
Dopo aver installato la libreria, se al momento della compilazione vi dà errore sui font copiare l’intero contenuto nella cartella TVoutfonts che trovate normalmente nell’indirizzo del vostro HardiskArduino/programmi/libraries/arduino-tvout-master/TVoutfons/
nella cartella precedente, ovvero
Arduino/programmi/libraries/arduino-tvout-master/
Risultano incompatibilità con alcune librerie che lavorato sul timer1 interno del microcontrollore. Chiaramente, non difficile da capire, se due librerie lavorano sullo stesso timer interno ci sono grossi problemi. A seconda delle proprie esigenze occorre modificare una delle due librerie che usate. La strategia è di sceglierne una libreria e farla lavorare sul timer2, chiaramente se possibile. Per esempio con la libreria servo, si ottengono risultati soddisfacenti. Ricordate che in ATmega328 il timer1 lavora a 16bit, mentre il timer2 a 8bit di risoluzione.

Sketch completo da caricare: (CLICCA QUI PER SCARICARLO)

Realizzato ciò avrete la possibilità di usufruire di tale possibilità in situazioni dove un LCD minuto non permette una corretta visualizzazione. Con fantasia e ingegno, seduti sul divano, potete tenere sottocontrollo diverse cose.
Come sempre, buon divertimento e buona realizzazione a tutti.

Ecco un breve video del progetto
GIROLAMO D'ORIO