venerdì 19 gennaio 2018

Hmm... "piaceri e dolori"

Apparato agricolo-meterologico "piaceri e dolori" da installare prossimamente sul terrazzo, composto da:
  • "piaceri": misuratore pioggia (ogni goccia caduta nella vaschetta produce un evento su una GPIO e il piacere dell'irrigazione gratis al giardino);
  • "e": paletta indicatrice direzione vento (a seconda della direzione, restituisce 16 diversi valori di resistenza);
  • "dolori": anemometro (ogni giro produce un evento su una GPIO: se il vento è forte rovina alberi e piante);
  • più un'antenna direzionale da 9dbi per arrubbpotenziare il segnale wifi.

Hardware informatico tecnologico d'avanguardia disruptive:
  • Weather Meters comprati da Sparkfun nel 2008 e sopravvissuti a ben quattro traslochi (gli strati di polvere confermano le epoche geologiche);
  • BeagleBone Original (256 Mb RAM), residuato bellico comprato nel 2012 e inizialmente equipaggiante progettino scan/fax;
  • alimentazione via POE (power-on-ethernet, una coppia passiva injector/splitter TP-Link POE200 che comprai nel 2014), nella foto si vede solo lo splitter;
  • schedina connettori e voltage divider autocostruita nel 2018 (ma le prese RJ11 le avevo comprate fin dal 2013: questo progetto è durato praticamente dieci anni prima di essere collaudabile), perché gli ingressi analogici della BeagleBone Original sono max 1.8V;
  • non visibili nella foto: pennetta wifi USB TP-Link TL-WN722N attaccata all'antenna direzionale TP-Link (che ha più dBi dell'antenna fornita di serie) con apposita prolunga, tutte comprate verso il 2014-2015.
Per anni pensavo di usare una Arduino ma c'erano due problemi: trovare il modo di mandare i pacchetti dati al server di casa e trovare il modo di alimentarla. Usare il POE ha risolto tutto:
  • un unico cavo per alimentare e comunicare (quindici metri di cavo ethernet Cat.5E);
  • allo splitter a destinazione arrivano davvero 5V;
  • l'injector del POE resta dentro casa, perciò posso staccarlo per resettare l'apparato senza tornare sul terrazzo;
  • lo splitter del POE può dare in alternativa 12V per futuri progetti alternativi.
Sulla BeagleBone ci gira ArchLinuxARM, che nella versione attuale non abilita la lettura dei pin analogici per cui ho dovuto creare un file .dtb (device-tree blob) da piazzare sotto /lib/firmware e caricarlo al boot, come indicato qui. Non ho avuto bisogno di usare la modalità "buffer" perché mi era sufficiente anche una lettura approssimativa. La tabella dei risultati è ordinata per massimi, e ho scelto ogni volta il valore a metà strada rispetto al minimo successivo in modo da evitare sorprese. Il sorgente in Ruby è sul solito github.
Gli ADC della Beaglebone sono a 1.8V e a 12 bit, per cui restituiscono un valore raw tra 0 e 4095 proporzionale al voltaggio rilevato 0-1.8V (i riferimenti sono i pin GND_ADC e VDD_ADC). Negli esempi forniti per i Weather Meters si parla di una resistenza da 10k ohm e di 5V, ma a portata di mano ne avevo una da 12k e comunque dovevo ricalcolare tutti i valori, per cui per fare prima ho scritto uno script Ruby per mostrarmi i minimi e i massimi mentre tenevo ferma in una direzione la paletta.
Su ognuna delle GPIO della Beaglebone il kernel Linux può generare interrupt sia su edge rising che su falling, che usa poi per interrompere una chiamata select o poll in attesa di eventi GPIO. In tal modo non è necessario fare continuamente il polling dei GPIO (cosa che costerebbe il 100% di CPU, ed era l'unico motivo per usare una Arduino - che può permettersi di bruciare tutto il tempo che ha a disposizione per fare polling), per un totale di poche decine di secondi al giorno usati dalla cpu per lo più per le printf degli status ogni secondo.

Lo status attualmente indica ogni secondo, rispetto all'aggiornamento precedente, quanti clicks ci sono stati sulla GPIO dell'anemometro (ogni quattro eventi valgono 66 centimetri al secondo di velocità del vento, magari sarebbe il caso di fare una media ogni 3-4 secondi per acchiappare pure la brezza), quanti clicks sulla GPIO della pioggia (ogni click vale 0.28mm di pioggia equivalente; una bella arracquata è di una quindicina di millimetri) e la direzione della banderuola secondo la resistenza misurata in uscita. Ora devo solo installare il tutto sul terrazzo e decidere come ripubblicare i dati in modo da condividerli su più servizi (magari con un broker MQTT o una connessione al database di casa), sputare fuori grafici e magari anche pacchetti APRS.

Ecco la scatola IP67 in cui piazzerò il tutto - ci devo solo fare un foro laterale per far passare il cavo Cat.5E, il cavo wifi e i due cavi della weather meter (e poi sigillare col leggendario Colla Pistola). Magari ci aggiungo anche un catenaccio:


Per collaudare l'anemometro ho scritto un programmino che misura la velocità istantanea e ho soffiato a pieni polmoni. Piccolo record personale prima di restare col fiatone: 10,72 metri al secondo (38,6 km/h, effettiva velocità tangenziale del centro delle coppe, un giro completato in appena 62,2 millisecondi).


Nessun commento:

Posta un commento