Raspberry PI2 – Prepariamolo per usare i GPIO

A differenza di Arduino il Raspberry Pi2 non è pronto per utilizzare sensori, attuatori e quant’altro sui 40 pin che sono installati sulla scheda. Bisogna installare alcune librerie in modo tale che realizzando codice, in C o in Python che sia, si possa accedere a questi collegamenti.

Molti utilizzano Raspbian forse perché esiste più documentazione su Internet, io preferisco le distribuzioni Linux della famiglia Redhat (RedHat, Centos, Fedora, RedSleeve) per cui farò riferimento per l’installazione alla Centos 7 che è attualmente in fase di sviluppo (vedi post precedenti) ma che però mi risulta del tutto usabile al momento attuale. Ipotizzo che con Fedora e RedSleeve 7 il procedimento sia del tutto simile, e quindi proverò, tempo permettendo, anche su quelle piattaforme.

(1) Innanzitutto da utente root installiamo alcuni pacchetti con Yum:

(2) Procuriamoci le librerie GPIO PYTHON per la gestione dei 40 pin del RPi2

Scarichiamo il pacchetto RPi.GPIO 0.5.11.tar.gz

In questo momento si tratta dell’ultima versione disponibile ma se dovesse uscire una versione più recente è sempre bene scaricare quella.

(3) Estraiamo il file scaricato con un comando tar

(4) Entriamo dentro la directory /root/RPi.GPIO-0.5.11

(5) Installiamo le librerie:

Se tutto è andato bene avremo un output di questo tipo.

(6) Ora installiamo le librerie GPIO per il linguaggio C.

Controlliamo sempre che sia un rassicurante messaggio “All done.”.

Testiamo la libreria con il comando:

Abbiamo la versione della libreria appena installata e l’individuazione dell’hardware corrente. E’ stato trovato correttamente un RPI2.

Ancora meglio, chiediamo la mappatura dei PIN del nostro Raspberry con il comando:

Schermata 2015-07-26 alle 13.36.21

Questo schema è importantissimo. Stampiamocelo perché verrà usato come riferimento quando programmeremo in C. Nelle 2 colonne centrali sono mappati i PIN FISICI del RaspBerry Pi2 e ai lati ci sono le codifiche corrispondenti GPIO. Generalmente useremo la BCM per cui ad esempio collegando il PIN FISICO 11, questo sarà in effetti indicato nel software come GPIO 17, ma attenzione perché su alcune board di collegamento troveremo serigrafato GPIO0. Un po’ di sana confusione insomma, tanto per renderci la vita complicata. La vita del Maker è sicuramente più rilassata con Arduino. 🙂

(7) Installiamo le librerie per il processore BCM2835 per il linguaggio C

Tranquilli, sul RPI2 abbiamo il BCM2836 ma le ultime versioni (credo dalla 1.39) di questa libreria supportano anche il Pi2.

Andiamo sul sito http://www.airspayce.com/mikem/bcm2835/

e se possiamo leggiamoci tutta la pagina. E’ piena di informazioni interessanti per chi vuole approfondire. Inoltre NON SCARICHICHIAMO LA VERSIONE 1.42 proposta dalla pagina che ha un problema di compilazione con l’RPi2 (un modulo assembler dà errori) ma cambiamo la riga di download per prendere l’ultima versione, che attualmente è la 1.44. Procediamo poi con la compilazione e installazione.

Mi raccomando, controllare sempre che dopo l’esecuzione del ./configure sia andato tutto bene, senza messaggi di errore o di librerie mancanti.

All’interno della libreria c’è del codice C di esempio. Proviamo una compilazione per vedere se tutto è ok.

Consiglio di fare qualche prova con questi esempi anche per familiarizzare con le chiamate alle funzioni di libreria per confrontarle eventualmente con quelle usate da Arduino.

Arduino – Sensore di temperatura LM35DZ

lm35dz

 

Questa sonda analogica a basso costo (circa 2$) rappresenta una delle soluzioni più convenienti se dobbiamo monitorare solo la temperatura. Teoricamente nella sua categoria è una delle più precise (errore tipico 1/4 di grado) anche se viene penalizzata dalla non sufficiente precisione del convertitore AD di Arduino. La sonda in sé dà in uscita 10mV per ogni grado centigrado, quindi la sua precisione interna di 1/4 di grado richiederebbe una risoluzione di 2.5mV. Arduino, anche in presenza di sensori analogici effettua comunque una conversione in 1024 step digitali  che hanno una risoluzione di circa 5mV, il che porta forzatamente la precisione di questa sonda a 1/2 grado. Avendo però la necessità di effettuare anche una lettura di umidità ambientale la soluzione migliore secondo me rimane il sensore digitale DHT 22 (il DHT 11 può andare bene per chi si accontenta di +-1 grado e +-5% sulla lettura igrometrica) che però costa tipicamente intorno ai 10$. Devo dire che appena messi sotto test i miei 5 esemplari di LM35DZ ho trovato una certa instabilità nelle letture con comportamenti differenti a seconda del fatto che il mio esemplare di Arduino Nano fosse alimentato da fonti differenti. Ho provato anche a  cambiare librerie ma il problema rimaneva, finché girando per i vari forum ho trovato una soluzione software che in alcuni casi aveva risolto il problema. Si tratta in poche parole di ridefinire temporaneamente prima della lettura il range di voltaggio dei connettori analogici di Arduino (A0, A1, A2, ecc.) portandolo da 5V a 1.1V, in linea con il range per cui il sensore è ottimizzato. Nello sketch riportato sotto si potranno vedere le istruzioni analogReference(INTERNAL) DEFAULT che svolgono questa funzione, commentate in quanto pur dando maggiore stabilità alle letture mi hanno portato però ad una sovrastima delle letture stesse. Ho lasciato il codice per chi abbia intenzione di fare delle prove. Infine sono ricorso ad un metodo che mi ha dato risultati buoni anche sull’Arduino Nano in mio possesso: 10 letture successive prese ogni 20mS e poi calcolo la media tra i valori acquisiti. A questo punto mi sembra che le letture siano più precise e soddisfacenti.

Le connessioni ad Arduino sono molto semplici: tenendo di fronte a sé la faccia piatta della sonda dove è stampata la sua sigla il piedino di sinistra sarà il +5V, il piedino centrale il segnale e il piedino di destra la massa.

Concludo dicendo che ho avuto modo di provare anche 2 sensori di temperatura analogici basati su sonde a termistore. Keyes li classifica come KY013 e KY028. Esiste pochissima documentazione su Internet, non si capisce su quale termistore siano basati (troppo piccoli per trovare una sigla stampata) e la formula per ricavare il valore di temperatura di da un termistore è molto complessa da calcolare e cambia da un tipo di termistore all’altro. Di uno dei due sensori ho addirittura trovato lo sketch originale del produttore ma anche questo dava risultati sballati. Direi quindi di lasciar perdere questo tipo di sensori (anche se, come nel mio caso, ve li metteranno in mezzo ai bundle di 30-40 sensori che si vendono per Arduino e Raspberry) e di usare i DHT e LM35 che sono più semplici da gestire e danno lo stesso risultato senza dannarsi l’anima.

SKETCH DI ESEMPIO:

Arduino – sensore di temperatura e umidità DHT 11

DHT11

 

Si tratta di un sensore digitale capace di rilevare misure di temperatura e umidità con una precisione di circa 1 grado per la prima e +- 2% per quanto riguarda la seconda grandezza. E’ uno dei più utilizzati per questo scopo anche se ci sono ad un costo leggermente maggiore sensori come il DHT 22 e il DHT 44 dotati di precisione maggiore. Se si ha bisogno di una lettura decisamente più precisa della temperatura ambientale direi senz’altro di usare una sonda del tipo LM35DZ, molto economica ma in grado di dare un errore tipico di 1/4 di grado. In questo caso potremo sfruttare solo la lettura di umidità ambientale  del DHT 11 oppure cercare anche qui una sonda più precisa rimanendo in un costo che si aggira al massimo intorno ai 10 dollari.

Per leggere i valori di questo sensore è preferibile utilizzare una libreria da caricare nella IDE di Arduino in quanto i risultati non sono diretti ma richiedono delle trasformazioni da byte ad un valore per così dire “human readable”. Un’ottima libreria si trova a questo indirizzo: http://playground.arduino.cc/Main/DHTLib

Si tratterà di salvare il codice relativo ai 2 file dht.h e dht.cpp, zipparne il contenuto insieme e caricare il file ZIP nella IDE di Arduino come libreria esterna.

Collegamenti:

E’ bene controllare comunque le serigrafie del sensore. A differenza della versione in mio possesso (vedi la foto in alto) ad esempio il sensore della Keyes presenta connessioni differenti, con il +5V sul pin centrale della basetta. Sbagliando le connessioni potreste vedere  il vostro DHT 11 piegarsi dal calore nel giro di pochi secondi rendendosi inutilizzabile. Quindi attenzione sempre a cosa è serigrafato sulla basetta, se presente.

SKETCH DI ESEMPIO:

 

Arduino – Rilevatore di gas MQ2

MQ2

 

Stavolta parliamo di un sensore rilevatore di gas che comincia ad essere molto interessante se utilizzato in un progetto di controllo ambientale domestico e non. Sfrutta una sonda di tipo MQ2 in grado di rilevare la presenza di gas Metano, Butano e il cosiddetto LPG (Liquefied Petroleum Gas), un gas liquido presente in molte bombole. La lettura è di tipo analogico per cui avremo una lettura proporzionale alla presenza di questi gas in prossimità del sensore e, cosa altrettanto importante, possiamo calibrarlo con una soglia di intervento via software.

Va detto che la famiglia di sonde MQ è veramente vasta e si possono reperire (in genere per pochi dollari) diversi modelli adatti al rilevamento di vari tipi di gas. Elencherò qui di seguito i principali, ma basta pensare all’MQ7, in grado di rilevare il Monossido di Carbonio, che per una decina di dollari potrebbe servire a realizzare un semplice circuito in grado realmente di salvare vite umane. Tutti più o meno sanno quanto sia infido e poco rilevabile da noi esseri umani un gas letale come il monossido di carbonio. Ecco comunque alcuni esempi di sonde:

Il sensore va alimentato a 5V e come già detto effettua una lettura analogica. Come si vede nello sketch di esempio sotto ho impostato una soglia pari a 200, ma si possono effettuare alcune prove per trovare un valore adatto ai propri bisogni. Soprattutto si può effettuare la calibrazione controllando i valori letti in un ambiente ben areato e ragionevolmente privo di qualsiasi tipo di emissione (compreso il fumo della sigaretta). E’ conveniente aspettare qualche minuto dalla attivazione del sensore poiché ha bisogno di un po’ di tempo per andare a regime. Inoltre è perfettamente normale che scotti un po’, poiché a regime può raggiungere anche temperature intorno ai 40-50 gradi. Ovviamente può avere un senso abbinare il sensore ad un led di segnalazione o ancora meglio ad un dispositivo di segnalazione acustica.

Collegamenti ad Arduino:

 

SKETCH DI ESEMPIO:

Arduino – RGB Led KY009 e KY016

KY009_KY016

 

Stavolta non si tratta di sensori, ma di semplici Led RGB, ovvero Led in grado di assumere qualsiasi combinazione di colori (in realtà si tratta di 3 Led, uno rosso uno blu e uno verde assemblati in un unico package). A cosa servono? Beh, oltre che essere impiegati eventualmente per indicare 3 o più stati differenti con un solo Led possono essere utili anche durante il periodo natalizio per mettere Arduino sull’albero, no?

Scherzi a parte, i due circuiti sono perfettamente equivalenti e si limitano solamente ad usare 2 tipi differenti di Led. Forse il KY009 si presenta più luminoso rispetto all’altro ma il codice per pilotarli è esattamente lo stesso. Utilizzano i pin relativi a linee di alimentazione a 5V e in questa configurazione sono già dotati delle resistenze atte a distribuire i corretti voltaggi ai Led.

SKETCH:

Arduino – Sensore KY003

KY003

 

Sensore ad effetto Hall rilevamento campo magnetico tipo switch. A differenza del KY024 agisce come un interruttore segnalando la presenza o l’assenza di un campo magnetico secondo la soglia interna con solo 2 stati: HIGH = nessuna rilevazione, LOW = campo magnetico rilevato. Questo sensore va alimentato a 5V, ed è di di tipo digitale. Le considerazioni sul suo utilizzo sono analoghe a quelle del KY024.

SKETCH DI ESEMPIO:

Arduino – Sensore KY024

KY024

 

Sensore lineare ad effetto HALL. Misuratore di campo magnetico.

Questo tipo di sensore rileva la presenza di un campo magnetico fornendo in uscita un voltaggio proporzionale all’intensità e all’orientamento dello stesso. In genere questo tipo di sensori vengono usati per calcolare (e quindi regolare o stabilizzare) la velocità di un meccanismo in rotazione oppure come interruttore di prossimità. Esistono anche sensori di tipo switch, che si limitano ad intervenire solamente al raggiungimento di una soglia di intensità (vedi KY003) e che quindi forniscono in uscita solamente uno stato ON/OFF. Nel caso invece del KY024 il punto di intensità 0 dovrebbe corrispondere circa a +2.5V con escursione verso lo 0V e +5V in 1024 step se alimentato appunto a 5V. Nonostante questo sensore abbia una risposta lineare non è adatto comunque ad essere usato come misuratore di intensità di un campo magnetico data la scarsa precisione.

Il valore di zeroLevel corrisponde alla calibrazione dello 0 e va ricavato lanciando lo sketch con il sensore lontano da fonti magnetiche e facendo in modo che il valore di uscita indichi appunto 0. Nel mio caso ho utilizzato un valore pari a 537 ma potrebbe variare leggermente da sensore a sensore.

La basetta del sensore usa una sonda che si chiama ss49E. A seconda del produttore la sensibilità tipica può variare. Io presumo che quella del Keyes possa essere 1.8mV per Gauss così come ho dedotto da un datasheet ma Honeywell per la sua sonda dichiara 1.4mV per Gauss. Tipicamente per ogni step di lettura siamo intorno ai 3 Gauss il che fa intuire la scarsa precisione della sonda, che unita ad altre fluttuazioni dovute alla temperatura esterna porta ad una ulteriore variazione del 20% circa.

All’atto pratico mi sono servito per provare il sensore di un magnete proveniente dal braccetto porta testine di un hard disk rotto. Si tratta di un magnete piuttosto forte (con le mani non si riescono a staccare le due componenti con cui è realizzato). Il sensore comincia a misurare comunque solo da 2-3 cm di distanza, e muovendo il magnete intorno al suo asse si potrà vedere come la tensione di uscita diventi positiva o negativa a seconda dell’orientamento polare del magnete.
Le connessioni sono semplici. Basandosi sulle indicazioni serigrafate sul sensore:

Sensore Arduino

A0          A0
G            Ground
+            +5V
D0         non collegato

SKETCH DI ESEMPIO:

Arduino Nano

arduino_nano

Che dire…. anche queste piccole schede dotate solamente di un microcontrollore hanno il loro fascino. Ho preso quindi (per ora) una scheda Arduino Nano montata su uno shield Funduino che ne amplifica le possibilità di connessione e una manciata di sensori provenienti da uno starter kit (37 sensori di vario genere, non sono pochi) venduto da una famosa catena di vendita internazionale. Si tratta di roba di fabbricazione cinese, molto economica rispetto agli originali, ma funziona perfettamente per i miei scopi quindi va benissimo per cominciare. Ho già fatto qualche esperimento con i primi sensori e devo dire che la semplicità nel realizzare progetti  tipica di queste schede della famiglia Arduino rispetto ai Raspberry (soprattutto nella gestione di librerie, IDE di sviluppo, ecc) le fa preferire per la gestione di sistemi complessi di sensori. Per ora mi limiterò a provare i sensori che ho a disposizione, uno per uno, se non altro per fare pratica e rispolverare le mie vecchie conoscenze di elettronica e di programmazione in C.

Centos 7 per Raspberry: test image

Prosegue l’ottimo lavoro da parte del team che sta preparando una distro Centos 7 per i Raspberry e per le schede Banana. E’ disponibile una immagine ready-to-use per RPi all’indirizzo: http://people.centos.org/hughesjr/armv7hl/rpi2/images/

Sono ancora in fase di test e per installare qualche pacchetto aggiuntivo ho dovuto marcare come disabled i repository segnalati in /etc/yum.repos.d/CentOS-Base.repo lasciando attivi gli altri, ma si vede già da adesso che verrà fuori un ottimo lavoro.

Di nuovo complimenti al team.

Redsleeve 7: sono cambiati i repository Yum

Oggi controllando gli aggiornamenti tramite Yum sulla Redsleeve 7 ho avuto la brutta sorpresa di trovare tutti i puntamenti cambiati con un bel errore HTTP 404 su tutti i repository. La cosa brutta è che il sito ufficiale non è più aggiornato da 3 anni ormai (ma perché??) e nessuno ha potuto segnalare la cosa. Dopo una breve ricerca sul sito FTP di Redsleeve ho trovato i nuovi puntamenti, che spero siano definitivi.

I file da modificare sono 3 e si trovano nella directory /etc/yum.repos.d

In effetti vanno modificate solo le righe relative alla direttiva mirrorlist ma riporto i file per intero con il vecchio puntamento commentato nel caso un giorno ci fosse la necessità di ripristinarli. Dopo averli modificati dare un comando yum upgrade e poi yum update per controllare eventuali nuovi aggiornamenti.

Redsleeve.repo

epel.repo

raspberry.repo