Multiplexer NMEA 0183 Arduino: Un po’ di background

L’obiettivo del progetto è quello di realizzare un multiplexer di segnali NMEA 0183 provenienti dai sensori della propria barca con Ardunio. Multiplexare a grandi linee significa mettere insieme segnali diversi per creare un unico flusso aggregato.

Un grazie agli amici del Forum Amici della Vela perché è lì che ho avuto l’idea e la voglia di realizzarlo.

Quando arriverete alle considerazioni finali capirete che scegliere Arduino non è più economico, ma permette flessibilità tenendo aperte le porte alle personalizzazioni. Da semplice multiplexer di segnali NMEA il progetto può facilmente essere evoluto per acquisire segnali analogici, segnali atmosferici e molto altro. Ognuno personalizza la propria barca in base alle proprie esigenze e Arduino ci aiuta a continuare in questa direzione.

Questa mini guida (io preferisco chiamarla riflessione ad alta voce) sarà composto da più articoli. In particolare:

L’Arduino

La prima scelta che dobbiamo operare è quella di selezionare la versione di Arduino che fa per le nostre esigenze.

La scelta in questo caso risulta facile e cade sull’Arduino Mega 2560 o sul suo fratello Arduino Mega 2560 ADK (necessaria se volete poter comandare e dialogare via USB con un dispositivo Android).

Inizialmente la mia scelta è caduta su quest’ultima scheda per eventuali sviluppi futuri. Dovessi rifarla probabilmente andrei direttamente sulla versione non ADK (he tra l’altro adesso non è più presente nello store ufficiale).

L’Arduino Mega lo trovate qui https://store.arduino.cc/product/GBX00067?language=it

Un piccola riflessione sulla scelta dell’originale. Comprare l’originale significa sostenere il progetto Arduino, in più da italiano e fondatore di ITALIANS DO IT vi invito a sostenere l’economia italiana. L’Arduino infatti viene prodotto o perlomeno assemblato assemblato in Italia nella zona di Ivrea.

Pronti, attenti, via.

Il Segnale NMEA

TTL vs RS-232

In soldoni e senza dilungarsi troppo il segnale NMEA 0183 prima della versione 2.0 ha caratteristiche simili o almeno compatibili con quello di un segnale RS232 standard e quindi da ora in poi lo tratteremo di conseguenza.

Vedendo l’Arduino Mega si potrebbe pensare che le 4 porte seriali hardware fanno al caso nostro. In realtà le porte seriali Arduino sono di tipo TTL. Il segnale RS-232 differisce da quello TTL per 2 caratteristiche principali:

  • Livello di tensione
  • Livelli logici

Il livello di tensione della TTL è 5V, quello della RS-232 è invece 12V (non è proprio così ma semplificare aiuta la comprensione, per sempio nell’immagine sotto viene usato 13, molto dipende dalla versione dell’RS-232).

Per quanto riguarda i livelli logici nel caso della TTL il valore di tensione alto (5V) vale l’ 1 logico e quello basso (0V) vale lo 0 logico.

Nel caso della RS-232 invece il valore di tensione alto (12V) vale lo 0 logico, e quello basso (-12V) vale l’1 logico. Non collegate quindi un segnale NMEA direttamente Arduino senza aver misurato la tensione sennò a parte che vedrete caratteri strani, invece di un Arduino rischiate di trovarvi una scheda bruciata.

L’immagine di seguito chiarisce visivamente le differenze fra i due segnali
Confronto segnali TTL e RS232

Per maggiori dettagli sulle differenze tra i due segnali trovate deu semplici tutorial RS-232 vs. TTL Serial Communication (dal quale ho linkato l’immagine sopra) e Serial Communication

Livello fisico (Physical Layer)

Ci concentreremo sui segnali NMEA 0183 prima della 2.0 che sono la maggior parte sul mercato.

Come accennato il livello fisico è un RS-232 (qualcuno dice che tipicamente è la versione 2.4, altri che è un EIA-232), sulle tensioni c’è un sacco di confusione perché ogni produttore ha fatto un po’ con i chip che aveva in casa. All’uscita dei 3 strumenti che possiedo misuro 3 tensioni diverse 🙂

La cosa che però ci rassicura è che se i cavi sono ragionevolmente corti e non hanno troppa attenuazione le tensioni su un ricevitore sono comunque comprese nel range in cui un ricevitore RS-232 sa determinare il livello alto o basso (fisico e di conseguenza quello logico) e non siamo in una zona di indeterminazione.

Per qualche dettaglio in più leggete queste poche righe aiutano Livelli di segnale: RS-232C vs NMEA

Se il nostro ricevitore è addirittura compatibile con EIA-232 allora le cose migliorano perché la soglia minima per avere il livello alto (0 logico) scende a +3V (Vedi http://it.wikipedia.org/wiki/EIA_RS-232).

Insomma come avete capito è un bel casino ma alla fine i convertitori RS-232 sono molto tolleranti e quindi si riescono a far funzionare le cose con hardware economico e ben noto.

Livello di connessione (Link layer)

Vi prego di non storcere il naso non sapevo come tradurlo meglio 🙂

Tipicamente (nota sempre il beneficio del dubbio, non perché non sia sicuro ma perché c’è un gran caos in giro):

  • 1 start bit
  • 8 data bits (bit 7 is 0)
  • 0 parity bit (none)
  • 1 or 2 stop bits
  • 4800 baud

Anche qui siamo compatibili con l’RS-232 quando i bit di stop sono 1. Ma se fossero due questo dovrebbe essere visto come un momento di idle in più e quindi non disturbarci.

La velocità come si vede è 4800 baud (lentina eh) e quindi dovremmo ricordarcene quando scriveremo il nostro programmino per Arduino. Anche qui in realtà si trova qualche dispositivo a 19200. Se vi capitasse vi basterà cambiare un numero nel programma che ho messo a disposizione. Dove? Prima di darti il link ti consiglio di finire leggere tutto così avrai un quadro completo e potrai all’evenienza modificare le cose secondo le tue esigenze.

È quindi arrivato il momento Progettiamo la shield