domenica 24 settembre 2017

GPS (seconda parte)

Ora che ci sono note alcune informazioni riguardanti la lettura dei dati GPS con Arduino.

Per questo ho scritto un breve programmino che cattura tutta la stringa in uscita dal modulo GPS e la rielabora grossolanamente restituendo sulla monitor seriale tutti i dati estratti.
Il codice è pubblicato sul mio repository sulla piattaforma GitHub all'indirizzo:

https://github.com/UmbyWanKenobi/GPS-example/blob/master/gps_hardware.ino

a cui potete fare riferimento per il codice, che è ben commentato (almeno lo spero).
La sottostringa da me usata è la GPGA, la quale fornisce i principali dati riguardanti lo stato della connessione ( FIX ) corrente, la correzione del dato orario di rilevamento, le informazioni minime GPS e lo stato dei satelliti.

 $ GPGGA, 123519,4807.038, N, 01.131,000, E, 1,08,0.9,545.4, M, 46,9, M ,, * 47
14
Dove:
     Il sistema di posizionamento globale di GGA corregge i dati
     123519 Correzione prese alle 12:35:19 UTC
     4807.038, N Latitudine 48 deg 07.038 'N
     01131.000, E Longitude 11 deg 31.000 'E
     1 qualità del Fix: 0 = non valido
                               1 = riparazione GPS (SPS)
                               2 = correzione DGPS
                               3 = correzione PPS
          4 = cinematica in tempo reale (1)
          5 = Real-Time Kinematic flottante (1)
                               6 = stima (calcolo morto) 
          7 = modalità di immissione manuale
          8 = Modalità di simulazione
     08 Numero di satelliti in fase di tracciamento
     0.9 Diluizione orizzontale della posizione
     545.4, M Altitudine, metri, al di sopra del livello del mare medio
     46.9, M Altezza di geoide (livello medio del mare) sopra WGS84
                      ellissoide
     (campo vuoto) in secondi dall'ultimo aggiornamento DGPS
     (campo vuoto) Numero ID della stazione DGPS
     * 47 i dati di checksum, sempre inizia con *

La quota di geoide, più propriamente detta quota ortometrica, è l'elevazione del punto sulla superficie terrestre rispetto alla superficie del livello medio del mare.
Se manca l'altezza del geoide l'altitudine indicata potrebbe essere non corretta. Alcune implementazioni non standard riportano l'altitudine rispetto all'ellissoide anziché all'altitudine geoidale. Alcune unità non presentano affatto le altitudini negative. 
Le altre sottostringhe riportano altri dati in cui alcuni campi sono ripetuti oltre a altre funzioni come la velocità di spostamento, la deriva del Nord magnetico e la data, Alcuni campi sono riservati e altri semplicemente vengono ignorati da alcuni chip come questo (il MEO 6M), per esempio quello relativo alla deriva magnetica che invece potrebbe essere utile per la calibrazione delle bussole elettroniche.
Ora cercherò un chip che fornisce anche questa informazione e magari che generi l'interrupt per la sincronizzazione dell'orologio interno di Arduino. Sarebbe fantastico!


Cieli sereni

(1) Indice per gli algoritmi di alta precisione per la navigazione. l?RTK è una tecnica che migliora l'accuratezza delle misurazioni della posizione GPS, tuttavia è anche una delle più difficili da comprendere e da implementare.

Il GPS (prima parte)


Il GY-GPS6MV1 è un prototipo basato
sul chip NEO-6M-0-001
Salve di nuovo.
Questo mio progetto è un po' come la Novella dello Stento, un modo di dire toscano per indicare una cosa lenta e lunghissima. Il motivo è il solito: prima di parlare di qualcosa voglio essere sicuro di conoscere l'argomento, altrimenti il mio rimane un discorso vuoto e privo di qualsiasi valore. È in pratica il noto processo di riproducibilità di un esperimento tanto caro alla scienza e che ci ha insegnato Galileo Galilei.
Uno degli elementi da me richiesti per questo progetto è il conoscere precisamente la posizione sulla superficie terrestre, soprattutto la latitudine, necessaria per il corretto puntamento al Polo Celeste. In origine doveva essere un sistema equatoriale GoTo, ossia che conoscendo il nord magnetico e la latitudine dei motori passo-passo avrebbero dovuto automaticamente allineare la montatura di inseguimento. Poi alcune difficoltà per la creazione della parte riguardante la meccanica di precisione — non ho gli strumenti, l'officina e soprattutto la preparazione necessaria — mi hanno costretto a ripensare il progetto optando per uno stazionamento manuale, ma comunque sempre aiutato dall'elettronica.
Quindi, salvo altri ripensamenti, la parte elettronica rimane sostanziamente la stessa, invece di guidare i motori di stazionamento ho dei led che indicano quando lo stazionamento è corretto. Pertanto mi occorre sapere l.'esatta latitudine per il puntamento polare, e per questo viene in soccorso il sistema GPS che tutti conosciamo, non starò qui a ripetere cosa esso sia con esattezza.
Non è difficile conoscere — oggi — le nostre coordinate assolute, basta un qualsiasi smartrphone anche da 100 euro, e con Arduino ancora molto meno. Magari è necessario arrabattarsi un po', ma vi assicuro che la soddisfazione è infinita. Ci sono modulini molto economici basati sul chip NEO-6 (qui il datasheet completo) che hanno anche una comoda antenna passiva (il piccolo parallelepipedo bianco) collegato attraverso una piccolissima presa coassiale di tipo Hirose U.FL, specifico per i segnali a radiofrequenza superiori ai 6 GHz. Per i miei esperimenti dentro casa ho dovuto sostituire la sua antennina con una attiva esterna da auto col relativo adattatore, ma all'esterno conto di riusarla.
Comunque nella pratica — anche qui non sto a ripetere il meccanismo alla base dello schema GPS — il modulino, una volta che si è agganciato ai satelliti, il Fix, restituisce una stringa di caratteri, solo apparentemente confusi, contenenti tutte le informazioni a noi necessarie per conoscere la nostra posizione: latitudine, longitudine, ora (in UTC), la data e l'altezza dal livello del mare stimata.
Nella prossima puntata vi spiego come leggere questa stringa.

lunedì 4 settembre 2017

Il display grafico 12864 RepRap


Un progetto ambizioso quanto il mio non poteva non prevedere uno schermo per visualizzare in tempo reale i dati della sessione di scatto. Per questo nella prima versione era previsto uno schermo  LCD da 20 caratteri per 4 righe pilotato attraverso lo schema seriale I2C (2 soli pin più l'alimentazione).
Poi ho visto in giro le schede delle stampanti 3D, spesso pilotate da semplici Arduino. I loro schermi sono anch'essi monocromatici LCD, ma sono più grandi e consentono una grafica piuttosto primitiva, stile anni '80 dei primi videogiochi, ma assai accattivanti. In più hanno incorporato un pulsante di stop, un buzzerino per l'allarme e un selettore rotativo, il che mi eviterebbe il fastidio di dover usare 5 pin per una tastiera a membrana 4x1 di cui avrei usato soltanto tre pulsanti. In più essa contiene uno slot SD per leggere e scrivere dati, e mi sarebbe molto utile poter registrare le condizioni delle future sessioni per scopi scientifici.

La differenza che distingue giocare e fare scienza sta nel raccogliere i dati.


I collegamenti elettrici 

Lo schema elettrico del display grafico RepRap 12864 (http://reprap.org/mediawiki/images/5/51/RRD_FULL_GRAPHIC_SMART_CONTROLER_SCHEMATIC.pdf)

La disposizione dei contatti nel connettore
a disposizione del display grafico
RepRap 12864 uscita EXP1
Purtroppo il display grafico è progettato per funzionare con lo scudo studiato per pilotare le stampanti 3D, quindi usare tale apparato per altri progetti è un pelino più complicato ma non impossibile: con lo schema è possibile risalire alla disposizione dei controlli per tutte le funzioni che mette a disposizione. Questo è il primigenio spirito hacker!
I piedini dello scudo display nello standard SPI (Serial Peripheral Interface):
--                #include "U8glib.h"
--                #define E_SCLK 8
--                #define RW_SID 9
--               #define CS_RS 10
--                U8GLIB_ST7920_128X64_1X u8g ( E_SCLK, RW_SID, CS_RS ); 
in quest'ordine nello sketch.

Per ora è tutto, restate sintonizzati.

domenica 3 settembre 2017

Il mio astroinseguitore

Un paio di anni fa ero partito con l'idea di costruire una tavoletta equatoriale, una di quelle che gli anglofoni chiamano barn door tracker. L'aggeggio consiste in due tavolette imperniate su un asse posto in parallelo all'asse terrestre, in pratica punta verso la Stella Polare, e quella che sostiene la camera ruota in senso opposto alla Terra con la medesima velocità simulando così il movimento della volta celeste.
Io ho deciso di andare oltre ed eliminare tutti i calcoli trigonometrici necessari affinché la spinta della tavola sia costante e col vantaggio di una struttura molto più piccola ed equilibrata: un semplice motorino passo passo con un planetario 100:1 che mi consente spostamenti angolari (step) ampi soltanto 0,018 gradi: un 17HS19-1684S-PG100.

Per pilotare il motore mi avarrò di una scheda spinta da un TBH7128 (al lato lo schema) comandata da un Arduino Mega, corredata da una bussola magnetica e da un GPS per adiuvare lo stazionamento della struttura (puntamento al Polo).
In più il tempo di esposizione sarà controllato da un sensore di luce sensibile da 0,000118 a 88000 Lux: il TSL2591 abbastanza sensibile quindi da impedire all'inquinamento luminoso di sporcare il sensore di una qualsiasi DSRL.
Questo per ora è quanto. Piuttosto ambizioso come progetto, no?



Errata corrige: L'immagine relativa al driver THB7128 aveva sbagliati i riferimenti della piedinatura. Questi ora sono corretti e aggiunto alcune didascalie interessanti.