sabato 25 febbraio 2017

Scratch e Arduino - Progetto #6: Tastierino 4x4

Alcuni mesi fa' ho acquistato un  modulo keypad 4x4 come questo [disponibile qui]



Obiettivi del progetto

Interfacciare Arduino con il tastierino e leggere la pressione dei tasi con Scratch ed eseguire un azione.







Lista Componenti

Vediamo di cosa abbiamo bisogno per eseguire il progetto.


Scheda Arduino
Breadboard





Keypad 4x4



4x Resistenza da 10K ohm 





Fili Maschio-Maschio
e Machio-Femmina




Il tastierino 4x4

Per comprendere al meglio l'uso del tastierino 4x4 si consiglia di leggere ed imparare ad usare un singolo pulsante come descritto in questo articolo Scratch e Arduino - Progetto #3: Il pulsante





Come si vede da questa figura un tastierino 4x4 e' composto da 16 pulsanti organizzati a matrice.
Come detto prima per capirne il funzionamento e' necessario capire il funzionamento di un singolo pulsante.

La matrice e' organizzata il righe e colonne. Piu' precisamente ogni riga collega 4 pulsati ed ogni colonna collega 4 pulsanti.
Quando un pulsante viene premuto (il circuito si chiude) ed il valore presenta sulla sua riga (esempio R1) si puo' leggere sulla colonna relativa al pulsante premuto (esempio C1)






Come si vede dall'animazione, solo per esempio,  quando si preme il pulsante 1 il valore di R1 si legge su C1 e quando si preme il pulsante 5 il valore di R2 si legge su C2.


Comprendere questo modo di funzionamento e' molto importante quando scriveremo il programma Scratch.


Circuito e collegamenti

Qui lo schema dei collegamenti da realizzare. Ho usato il software Fritzing per rappresentare gli schemi di collegamento.






Partendo da sinistra i primi 4 fili (blu,giallo,blu,arancio) rappresentazo le 4 righe (R1-R4).
I successivi 4 fili (marrone,nero,marrone,nero) rappresentano le 4 colonne (C1-C4)

Come spigato nell'articolo relativo al pulsante, le 4 resistenze sono quelle che si chiamano resistenze di pull-up e servono a leggere correttamente il valore dei pulsanti.

I fili vanno collegati in questo modo:

  • blu (R1) -> pin 11
  • giallo (R2) -> pin 10
  • blu (R3) -> pin 9
  • arancio (R4) -> pin 8
  • marrone (C1) -> prima resistenza di pull-up
  • nero (C2) -> seconda resistenza di pull-up
  • marrone (C3) -> terza resistenza di pull-up
  • nero (C4) -> quarta resistenza di pull-up







Ora tra un piedino di ogni resistenza ed il filo che viene dal tastierino bisogna collegare un filo verso arduino, nel seguente modo:


  • arancio (C1) -> pin 7
  • rosso (C2) -> pin 6
  • marrone (C3) -> pin 5
  • nero (C4) -> pin 4








E qui la realizzazione su breadboard del circuito









Programma Scratch

Questo e' il programma principale





Come si vede il programma principale e' piuttosto semplice. Piu' in dettaglio una volta che il programma e' avviato si procede con l'inizializzazione del tastierino e dei pin di arduino.

Piu' in dettaglio i pin associati alle righr (11,10,9,8) sono impostato come pin di OUTPUT, mentre i pin associati alle colonne (7,6,5,4) come pin di INPUT






Dopo l'inizializzazione inizia un ciclo infinito che effettua ciclicamente la scansione di ogni singola riga e per ogni riga di tutte le colonne.
Le righe sono scansionate da 4 funzioni chiamate scansione_R1,scansione_R2,scansione_R3 e scansione_R4.
Mentre le colonen sono scansionate da un unica funzione chiamata scansione_Colonne che prende il numero di riga come parametro in ingresso.

Vediamo in dettaglio questi blocchi







Quando la funzione scansione_Rx viene invocata dal ciclo principale imposta una variabile chiamata ROW ad valore corrente di riga.
A questo punto imposta in modo opportuno i valori delle varie righe in modo da garantire sempre che una sola riga ha valore 0 (Livello logico BASSO-LOW) e tutte le altre hanno valore 1 (Livello logico ALTO-HIGH).
A questo punto si legge in sequenza il livello logico di ogni colonna e memeorizzo il risultato in una variabile apposita (V1-V4).

A questo punto dopo aver letto i valori delle 4 collonne per una data riga, li processiamo e' facciamo dire a Scratch il numero corrispondente al tasto che abbiamo premuto





Qusta funzione riceve in ingresso il numero di riga per cui i valori delle colonne sono stati letti.
La funzione inizia calcolando il numero del primo tasto della riga ricevuta in input con la seguente formula:


  • (numero riga -1) * 4 
Quindi quando numero riga = 1, la variabile tasto1 viene impostata a 0 e cosi' via

Nota: in informatica si parte "sempre" a contare da zero.
Nota2:  non so se ci hai mai pensato, ma questo spiega perche' l'anno 2000 e' nel 21mo secolo :) L'informatica aiuta a capire anche i piccoli/grandi problemi e quesiti della vita quotidiana :)

A questo punto si verifica il valore di ogni colonna (V1-V4) precedentemente letto. Solo 1 sara' a 0 in coincidenza del tasto premuto.
Quindi Scratch dira' (dire) "Hai Premuto (tasto1 + numero colonna)


A questo punto si riparte con la scansione della riga successiva e cosi' via ripartendo dalla prima quando si e' arrivati alla quarta.

Nota: per i piu' curiosi, questo e' il principio in cui funziona anche la tastiera di un PC

Ora vediamo il programma in funzione






Complimenti!!!
Con questo progetto hai imparato a ricevere l'input di una tastiera in Scratch e lo puoi utilizzare in mille modi diversi.


Idee

Questo progetto puo' essere esteso con progetti precedenti presenti su questo blog, per esempio:



Non abbiate timore di sperimentare. Uno scrittore Inglese dice:

"Piú impari, meno temi"
(Julian Barnes)




martedì 14 febbraio 2017

MQTT Basic per ESP8266


 Introduzione


Recentement ho ricevuto alcune richieste di aiuto nell'implementare su ESP8266 uno sketch di base per far comunicare il modulo attraverso il protocollo MQTT.

Questo post resenta uno sketch di base che permette di far comunicare uno o piu' moduli ESP8266 attraverso un broker MQTT.





MQTT

Il sito di riferimento per il protocollo MQTT (Message Queuing Telemetry Transport) e' questo [http://mqtt.org/]. 

Qui MQTT viene definito in questo modo:  "MQTT e' un protocollo di comunicazione machine-to-machine (M2M) progettato come un protocollo estremamente legegro che implementa un architettura publish/subscribe"

Nella sua essenza un architettura Publish/Subscribe prevede 4 elementi principali:

  • Un agent con il ruolo di Publisher: che invia messaggi al broker indirizzati ad uno specifico Topic
  • Un agent con il ruolo di Subscriber: che riceve messaggi dal broker provenienti da uno specifico Topic
  • Un Broker di comunicazione: un elemento centrale che orchestra tutti i processi di comunicazione e gestisce il ciclo di vita dei topic e dei messaggi
  • Un Topic: un canale di comunicazione dedicato. 



In questa architettura un Publisher comunica con un Subscriber senza doverne conoscere esattamente l'identita'. 
In altre parole un Publisher invia un messaggio al broker indirizzandolo ad uino specifico Topic.
A questo punto e' responsabilita' del Broker inviare il messaggio a tutti i Subscriber che stanno volontariamente "alscoltando" il Topic.

Questa architettura si applica in svariati amienti e non e' limitata solo al mondo MQTT.
Solo a titolo di esempio un'architettura di questo tipo si usa nella stragande maggioranza di sistemi grafici a finestre (Windows, Linux, ...). Per esempio quando faccio click col mouse su un pulsante sto facendo il Publish di un messaggio. In ascolto (subscriber) ci sono una o piu' funzioni che eseguono un codice particolare (chiudo la finestra, cancello l'area di disegno, etc...)


ESP e MQTT


Il protocollo MQTT ma ancor di piu' la sua architettura Pub/Sub si presta perfettamente ad essere utilizzata per la comunicazione tra i diversi (o il singolo) ESP dei nostri progetti fornendo un meccanismo di comunicazione facile, veloce, snello e sicuro.

Un grande vantaggio, sopratutto in ambito domestico, che lo ESP puo' comunicare con il mondo esterno senza dover aprire porte nel nostro Router casalingo e senza dover far nessun port forwarding 

Il protocollo MQTT e' supportato praticamente da tutte le piatatforme quali ad esempio Android, iOS, Javascript rendendo l'interazione tra lo ESP ed un client di controllo estremamente semplice.


CLOUDMQTT


Il broker MQTT che utilizzo per i miei progetti ed in questo sketch e' fornito da https://www.cloudmqtt.com/




Il servizio offfre diversi tier di prezzo, incluso il mio preferito: quello gratis :)




Una volta che vi siete registrati accedete alla console


Qui potete trovare tutte le informazioni utili per connettere lo ESP al broker


MQTT Basic

Il codice di esempio che permette ad uno o piu' ESP di comunicare tramite MQTT e' disponibile sul mio github.

Qui sotto alcuni define che permettono di configurare i vari parametri necessari


  • WIFI_SSID: lo SSID della vostra rete wifi alla quale lo ESP si collega
  • WIFI_PASSWD: la passowrd del WiFi
  • MQTT_CLIENT_ID: ogni agent MQTT deve avere un identificatore univoco
  • MQTT_SERVER: lo FQDN del broker MQTT che utilizzate
  • MQTT_UNAME: user name per autenticazione al broker
  • MQTT_PASSWD: password di autenticazione al broker
  • MQTT_BROKER_PORT: porta di ascolto del broker
  • MQTT_TOPIC: il tpic su cui inviare e ricevere i messaggi
  • ESP_NAME: un nome del vostro modulo ESP
  • ESP_PUB_ROLE: lo ESP si comporta come un Publisher
  • ESP_SUB_ROLE: lo ESP si comporat come un Subscriber

Librerie

Questo codice usa le seguienti librerie

MQTT.h e PubSubClient.h> - versione 1.99.0 - https://github.com/Imroy/pubsubclient


Test di MQTT Basic

Il codice in questione puo' essere testato sia con due o piu' ESP, oppure con un ESP ed unq ualsiasi client MQTT (io uso inq uesto esempio mosquitto su linux  ma qualsiasi altro client MQTT va bene ugualmente)

ESP come Publisher

Lato ESP togliete il comento per il #define ESP_PUB_ROLE, compilate e caricate lo sketch su ESP
Una volta partito vedrete nel vostro monitor seriale qualcosa di simile a questo



Su un client Linux mi metto in acolto sul topic esp8266/sensori

con il comando: mosquitto_sub -h <host name> -p <port> -u <user name> -p <password> -i <client id univoco> t- esp8266/sensori

dove i valori tra parentesi <> sono quelli recuperati dalla console di CloudMQTT




Come vedete dallo screenshot sopra, il mio client che gira su un Linux ovunque in Internet riceve i comandi dal mio ESP sulla mia scrivania

ESP come Subscriber

Lato ESP togliete il comento per il #define ESP_SUB_ROLE, compilate e caricate lo sketch su ESP
Una volta partito vedrete nel vostro monitor seriale qualcosa di simile a questo




Su un client Linux mi metto in acolto sul topic esp8266/sensori

con il comando: mosquitto_pub -h <host name> -p <port> -u <user name> -p <password> -i <client id univoco> t- esp8266/sensori -m "hi this is another ESP8266"

dove i valori tra parentesi <> sono quelli recuperati dalla console di CloudMQTT




Come vedete dagli screenshot il mio ESP sulla mia scrivania riceve i messaggi inviati da un client Linux ovunque in Internet


Conclusioni

Il protocollo MQTT e l'architettura Pub/Sub sono utilizzati in vari ambiti e nel contesto IoT forniscono un meccanismo di comunicazione snello e flessibile che permette la comunicazione tra i vari device dei nostri progetti in modo veloce, leggero e sicuro.

Se questa breve introduzione vi e' utile o e se realizzate un progetto con ESP/Arduino fatemi sapere