12 luglio 2018

Creo il mio ROBOT con Raspberry Pi #004 e #005 - Ristrutturazione Codice + Display LCD!


Benvenuti nel quarto e quinto episodio della serie #Ro-Pi: creo il mio ROBOT con Raspberry Pi, questa volta accorpati assieme.

Continua la serie di appuntamenti con il fai-da-te smanettoso in compagnia dei single board computer della fondazione inglese raspberry pi. In particolare, partendo da quanto costruito nella prima, seconda e terza puntata, oggi vedremo -tra le altre cose- come ampliare il nostro robottino (in grado di muoversi sul piano, controllare la presenza di ostacoli sul suo percorso, filmare ed osservare ciò che lo circonda) con l'aggiunta di un display per comunicare con noi.

Prima di entrare nel merito, vi riporto i video abbinati a questo articolo che ho pubblicato sul mio canale YouTube nei quali sono mostrati i risultati in esecuzione e spiegate a grandi linee la quarta e la quinta estensione al progetto:



Il quarto ed il quinto step di questa avventura, perciò, hanno previsto da una parte la riscrittura completa di quanto finora prodotto, e poi la connessione di un piccolo display che possa essere sfruttato dall'utilizzatore per ricevere feedback dalla vettura o anche messaggi di varia natura relativi allo stato del robot.

Nota: per quanto riguarda la riscrittura completa del codice, trovate tutti i dettagli nel video su riportato. Purtroppo, per vari motivi, non ho ancora avuto modo di condividere il codice, soprattutto perché non è ancora ottimizzato a dovere. Perciò non è online: quando sarà consistente lo rilascerò!


Componenti hardware necessarie


Una volta realizzata la base della prima puntata ed i due ampliamenti del secondo e terzo episodio, per poter potenziare ancora una volta il nostro robot occorreranno:
  • un display LCD 16x2 (o altro di simili dimensioni)
  • un potenziometro


In generale, un potenziometro è un dispositivo elettrico che è equivalente ad un partitore di tensione resistivo variabile, cioè due resistori collegati in serie la cui somma dei valori di resistenza è costante ma di cui può variare il valore relativo. In pratica la somma dei valori dei due resistori è sempre la stessa ma può variare, grazie allo spostamento di un "puntatore", il valore dei singoli resistori. Un aggeggio di questo genere permette di variare la tensione e lo si può sfruttare in accoppiata con il display (di cui parleremo tra poco) per regolarne il contrasto.

Un potenziometro solitamente dispone di un perno che può ruotare di 270°: questo perno permette di aprire o chiudere un circuito completamente oppure ottenere un qualsiasi valore intermedio, e quindi di applicare una resistenza da zero fino alla massima possibile semplicemente ruotando il perno stesso.


Ci sono 3 PIN: quello che permette l'ingresso della corrente a 5V, quello che va collegato al ground ed un terzo terminale che è quello di uscita per la tensione. Se chiamiamo A e B i terminali esterni e C quello interno, A e B si trovano alle estremità di una resistenza (colorata in nero e più spessa nella figura) sulla quale ruota il perno che fa muovere un contatto strisciante connesso al terminale C. Se il perno è a 0°, A e C sono collegati direttamente e quindi la corrente non percorre alcun tratto di resistenza (abbiamo cioè resistenza 0); quando il perno è a 270°, C sarà collegato a B e quindi la corrente attraverserà tutta la resistenza (cioè resistenza massima) prima di uscire. Ovviamente tra i due estremi sono possibili tutti i valori intermedi (con B che fondamentalmente rimane scollegato).

La tensione deve essere a 5V quindi è necessario collegare il PIN A correttamente: nella terza puntata avevamo riorganizzato la breadboard di Ro-Pi in modo da avere su di un lato sempre corrente a 5V e sull'altro a 3.3V, con un comodo level shifter per gestire eventuali necessari shift di corrente. In questo caso specifico, però, basterà collegare il terminale A direttamente alla corrente a 5V ed il ground (il PIN B) di conseguenza. Il PIN C, lo vedremo tra poco, andrà collegato al display LCD perché servirà per regolarne il contrasto.



Ed ora veniamo allo schermo LCD 16x2, dimensione comune nel mondo dell'elettronica hobbistica. Componenti come questa hanno solitamente 16 PIN che consentono di collegare il display stesso al pi o ad altri controller e di scambiare dati.

Andando con ordine, troviamo i PIN:
  1. va collegato al ground;
  2. serve per dare corrente e va collegato, anche in questo caso, alla 5V;
  3. serve per impostare il contrasto del display (ed è qui che andrà collegato il potenziometro);
  4. serve per selezionare il registro da utilizzare, cioè per indicare se stiamo inviando un comando da eseguire oppure dei dati da mostrare;
  5. va collegato al ground ed è usato per indicare se leggere o scrivere dati;
  6. assieme ai PIN 4 e 5, è utilizzato per abilitare o disabilitare la scrittura sui registri;
  7. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  8. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  9. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  10. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  11. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  12. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  13. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  14. serve per scambiare i dati veri e propri: saranno i bits che vanno scritti sui registri nel caso di scrittura oppure i valori da leggere in caso di lettura;
  15. va collegato alla corrente a 5V per gestire la retroilluminazione LED;
  16. in accoppiata col 15, va collegato al ground per gestire la retroilluminazione LED.


Quindi, i PIN 2 e 15 possono essere collegati direttamente sulla breadboard dove c'è tensione a 5V, ed i 3 ground di conseguenza. Il PIN 3 va unito al terminale C del potenziometro. Ed infine si possono sfruttare i data PIN 4-5-6 e 7, cioè i PIN 11-12-13 e 14, per scambiare dati col raspberry pi.

Attenzione: collegare i vari PIN sul display LCD con i corretti PIN sul raspberry pi o breadboard, altrimenti lo schermo non funzionerà.


Sfruttare le nuove componenti con #Ro-Pi


Una volta completate tutte le connessioni si può metter mano al codice per gestire le componenti.
Il display LCD è un oggetto "complesso" e per sfruttarlo al meglio si può utilizzare una libreria già pronta all'uso e scaricabile dal github di Adafruit, uno dei produttori più attivi nel mondo dell'elettronica hobbistica open-source.

Basterà prelevare la libreria per la gestione di display LCD 16x2 (scritta in python) con il comando: git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git

Una volta completato il download, va installata entrando nella cartella scaricata con cd Adafruit_Python_CharLCD e lanciando il comando sudo python setup.py install il quale si occuperà di configurare autonomamente il tutto.

Nota: fare attenzione che il processo vada a buon fine e risolvere eventuali errori di dipendenze non risolte. Con una installazione standard di Raspbian OS dovrebbe essere già tutto pronto all'uso.

Terminata l'installazione il gioco è praticamente fatto: la libreria può essere inclusa in qualsiasi codice python semplicemente facendo l'import relativo, e con i comandi messi a disposizione si potrà: scrivere messaggi, far scrollare il testo, pulire lo schermo, far lampeggiare il cursore, e così via...
Rimando direttamente ai metodi disponibili riportati all'interno del file Ardafruit_CharLCD.py presente all'interno della libreria stessa.

Per accertarsi che il collegamento tra display e raspberry pi funzioni correttamente, all'interno della libreria di Adafruit è presente una cartella chiamata examples dentro cui è possibile trovare alcuni codici di esempio che consentono di testare velocemente il display.

Nota: è importante specificare i PIN del pi a cui abbiamo collegato il display, usando la notazione BCM.

Si può editare il primo script presente nella cartella con il comando sudo nano char_lcd.py per impostare correttamente le variabili riferite ai PIN. Una volta sistemata la configurazione, basterà lanciare lo script con il comando python char_lcd.py per avere mostrate sul display automaticamente alcune delle funzioni supportate. Anche per gli altri script di esempio presenti è importante indicare i PIN utilizzati.

Nota: a questo punto potete anche sfruttare il potenziometro, ruotando il perno da 0° a 270°, per regolare il contrasto del display LCD, cosa molto utile in situazioni di forte luce contro lo schermo stesso.


Un po' di codice...


Se si vuole creare un piccolo programmino di test, per prima cosa occorre importare la libreria Adafruit. A quel punto vanno indicati i PIN sfruttati sul Pi ed inizializzare il display con il comando apposito fornito dalla libreria.
Per mostrare un messaggio di benvenuto, sarà sufficiente specificare il testo desiderato e sfruttare il comando message() per istruire il display sul da farsi.

# codice di esempio per mostrare un testo sul display per 5 secondi
import time
import Adafruit_CharLCD as LCD

# PIN setup da cambiare con quelli utilizzati secondo lo standard BCM
lcd_rs = 10
lcd_en = 9
lcd_d4 = 19
lcd_d5 = 8
lcd_d6 = 7
lcd_d7 = 11

# backlight, numero di colonne e righe per il display
lcd_backlight = 4
lcd_columns = 16
lcd_rows = 2

# inizializzazione
lcd = LCD.Adafruit_CharLCD(
          lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
          lcd_columns, lcd_rows, lcd_backlight)

# messaggio su due righe
lcd.message('Ciao a tutti da\ngeekonerd.xyz!')

# attesa di 5 secondi
time.sleep(5.0)

# pulizia
lcd.clear()

Lanciando lo script si può vedere come il display mostri il nostro messaggio per il tempo indicato.


Conclusioni


Bene, terminano qui il quarto e quinto episodio della serie!

Nelle prossime puntate proveremo a rendere ancora più smart il robottino, a rendere modulare anche l'accesso al display e finalmente proverò a pubblicare tutto il codice sorgente online.


A presto :-)

Nessun commento:

Posta un commento