IL BRACCIO E LA MENTE


torna alla Home Page



Lei non sa chi ero io...

Quando Arduino deve soccombere e mettersi a servizio di una intelligenza superiore, ovvero: il braccio (Arduino) e la mente (Raspberry) !

Il progetto

Come sempre è una cosa di cui si poteva fare tranquillamente a meno, ma mi piace trovare soluzioni estreme a problemi inesistenti.

Lo scopo finale è quello di poter visualizzare da internet la temperatura di una sonda remota di tipo “Oregon Scientific” magari piazzata sul balcone, usando un sistema inutilmente complicato ma che darà soddisfazioni e qualche conoscenza in più.

Cosa serve

Prima di tutto la lista della spesa:

  • Sonda remota Oregon Scientific (THGR238N)
  • Ricevitore 433MHz Aurel RX-4M50RR30SF
  • Arduino Uno
  • Raspberry Pi
  • Connessione a internet
  • Account Cosm per la registrazione dei dati

Abbiamo detto che leggeremo la temperatura da una sonda esterna Oregon Scientific, quindi questo sarà il primo pezzo necessario.

Io ne ho una, per la precisione il modello THGR238N, l’importante è che sia una sonda con protocollo di comunicazione Oregon, che effettua la trasmissione dei dati via radio alla stazione ricevente sulla frequenza di 433MHz


Arduino: il codice

Molti hanno cercato di decodificare il flusso trasmesso dalle sonde Oregon, con ottimi risultati: in questo progetto userò il codice descritto al link:
http://jeelabs.net/projects/cafe/wiki/Decoding_the_Oregon_Scientific_V2_protocol
Per inciso l’autore di questo sketch ha fatto un grandioso lavoro di back-engineering, e il codice fornito funziona egregiamente sia con IDE UNO che precedenti.  Lo sketch vero e proprio si trova qui:
http://jeelabs.net/attachments/download/49/Ook_OSV2.pde
In pratica decodifica il flusso ricevuto dal RX 433 MHz e dopo averlo opportunamente riformattato lo invia sulla porta seriale.
Non ci sono assolutamente modifiche da apportare: il codice così com’è non necessita di librerie, va uploadato sull’Arduino, punto e basta: ogni segnale valido emesso da una sonda Oregon verrà decodificata e inviata sulla porta seriale a 115200 Kbs, secondo il protocollo seriale standard.

Come collego il ricevitore ad Arduino ?

In questo progetto ho deciso di utilizzare il ricevitore Aurel modello RX-4M50RR30SF, dotato di otto terminali, che possono riassumersi secondo questa tabella:


Dopo avere effetuato l’upload dello sketch e cablato i collegamenti  come indicato, la prova del nove può essere fatta subito, aprendo il monitor seriale a 115200 Kbs e tenendo il trasmettitore Oregon nei pressi. Ci potrebbero volere un paio di minuti prima di  veder scorrere sul monitor la stringa decodficata da Arduino, simile a questa:

OSV2 DACC43F90005100650FE
OSV2 CACC43F9000510064F21
OSV2 BACC43F9000510064E32
OSV2 AACC43F9000510064DED
OSV2 9ACC43F9000510064C8B

Se il flusso viene visualizzato, siamo già a metà de lavoro, finora è stato facile.

Solo ricevitori Aurel ?

Certo che no: ho provato anche un modulino cinese ricevitore OOK a 433MHz (venduto a prezzi irrisori su internet) e funziona benissimo anche questo, senza nessuna modifica allo sketch, cambiando ovviamente i collegamenti dal ricevitore ad Arduino

Di contro c’è solo da segnalare la ridotta sensibilità che non consente di allontanarsi molto dal trasmettitore.


Primo step: qualche immagine



Attacchiamo Arduino al Raspberry

Fino ad ora ci siamo limitati a ricevere un flusso dal trasmettitore Oregon e visualizzarlo sul monitor seriale dall’Arduino, ora la parte più intrigante è: come collego l’Arduino al Raspberry ?
Prima di tutto: i livelli di tensione di Arduino (5V) e Raspberry (3.3V) sono diversi, e se non si fornisce al Raspi di una protezione adeguata, morirà presto sotto le fucilate a 5V da parte di Arduino.
Teniamo inoltre presente che i dati dovranno fluire solo in una direzione: da Arduino (Tx) verso Raspberry (Rx), il senso contrario non è usato in questo progetto.
Tutto questo per dire che un partitore al 50% (R1 = R2 da 4,7K - arancio/viola/rosso) è più che sufficiente allo scopo, secondo il seguente schema:

Ard (5v)  ------------ Rasp 5v

Ard (1 Tx)---+
             |
             R1 (4,7k)
             |
             +-------- Rasp (15 Rxd)
             |
             R2 (4,7k)
             |
Ard (Gnd) ---+-------- Rasp (Gnd)

Questo mi garantisce un livello “1” a 2.5V sul lato Raspberry, sicuramente entro le specifiche, e lontano dai livelli eccessivi di Arduino.

Se sul lato Arduino non ci sono probelmi ad identificare i pin (il Tx di Arduino è anche il Pin 1 digitale), sul Raspi occorre fare un pò più di attenzione, magari uno schema (preso da http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html) può aiutare:


Riassumendo, il collegamento dal centro del partitore va verso il pin 15 RXD, e ovviamente il pin GND va tenuto in comune con la massa di Arduino.

Nota sull'alimentazione: per non dover alimentare separatamente sia Arduino che la Raspberry, ho portato la linea 5v dal il Raspi verso Arduino, al pin "5v".

Qui finisce la storia dei collegamenti fisici: c’era più da dire che da fare, l’importante è avere rispettato i livelli di tensione tra i due sistemi.


E ora configuriamo il Raspberry Pi

Qui il lavoro si può dividere  in quattro parti, occorre un minimo di dimestichezza con Linux per poter modificare i vari files di configurazione e scrivere lo script. Ma come al solito, descriviamo in generale cosa si dovrà fare:


CURL ?

E’ una libreria in grado di fare richieste GET e POST da riga di comando senza passare dal browser. L’installazione su Raspi si effettua come al solito:

sudo apt-get install curl

Millemila pagine WEB sono dedicate a questo tool, di cui esiste anche la versione Windows. Nel nostro lavoro verrà utilizzata dallo script per inviare i dati a COSM, secondo la sintassi specicfica di CURL.

COSM ?

E' un portale ideato appositamente per memorizzare flussi di dati provenienti dalle sorgenti più disparate, ad esempio potenza generata da pannelli solari, oppure generatori eolici, rilevazione di tempertura, consumo di corrente, velocità del vento misurata da anemometri... qualunque cosa si possa misurare nel tempo è registrabile su Cosm. Ovviamente si deve individuare un automatismo informatico che trasformi la grandezza e la possa inviare a Cosm.

Non ci sono costi, ci si registra e si riceve una "chiave" esadecimale con cui identificarsi e registrare i propri datastream. 

Per questa applicazione ho creato un flusso "balcone", a cui ho associato i datastream "t" per la temperatura e "h" per l'umidità. A questo link si può vedere la pagina Cosm relativamente all'applicazione descritta in questa pagina, oltre ad un altro paio di datastream che descriverò prossimamente.

Aggiornamento del 14 maggio 2013: da oggi la piattaforma Cosm è diventata "Xively", con un layout rinnovato ma qualche problema di gioventù (ad esempio non si può ancora selezionare il periodo temporale voluto, ma si possono vedere solo le ultime sei ore). Diamo tempo al tempo e vediamo cosa è migliorato.

Abilitare la porta seriale

Per poter comunicare tra Arduino e RPi, useremo la porta seriale 0 della RPi.
La device si trova su /dev/ttyAMA0 che però è occupata dal processo getty il quale permette di accedere alla console della Raspi via seriale.
Occorre quindi commentare la riga colorata che si trova in  /etc/inittab per liberare la risorsa e usarla per i nostri scopi.

#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Per commentarla ho aggiunto davanti alla riga ”T0:23:r...” il simbolo “#” , e a questo punto occorre riavviare il Raspi per applicare la modifica, con il comando

sudo reboot

Lo script

Qui c’è il link allo script “oregon.sh già pronto, chi ha fretta può farne un copiaincolla e modificarlo per correggere la chiave e il target COSM da usare.
Per chi vuole capirlo, oltre ai commenti che ho cercato di infilarci, di seguito descrivo a grandi linee il funzionamento.

Fase di inizializzazione:

Fase ripetitiva:

Ultimo tocco: come per tutti gli animali che pascolano in ambiente Linux, anche questo file diventa eseguibile solo se gli vene assegnata il flag di esecuzione:

chmod +x ./oregon.sh

Automazione dello script

Per poter avviare in automatico lo script che abbiamo appena creato occorre editare il file /etc/rc.local e aggiungere in coda, prima dell’istruzione “exit 0” il comando di lancio del nostro script in background, ovvero seguito dal carattere “&”:

/home/pi/oregon.sh &

Raspeberry su internet

Certo che il Raspi va collegato a Internet, ma dal momento che il riceverà da Arduino i dati, il quale a sua volta li riceve via wireless, ne consegue che può essere collegato via cavo ethernet, vicino al router, senza bisogno di congifurarlo per usare una connessione WiFi.

CONCLUSIONE E COMMENTI

Prima di tutto una foto di famiglia, le foto a migliore risoluzione potete trovarle a questo link:

Leggerò con piacere i vostri commenti, se vorrete scrivermi al seguente indirizzo: mnicolato@hotmail.com

Aggiornato l' 18 maggio 2013