Lug 262019
 

Ragazzi, oggi parliamo del prossimo futuro. LoRa (Long Range) è un tipo di trasmissione dati via onde radio. A differenza del WiFi o quel che fanno i moduli NRF24, questi moduli utilizzano delle frequenze molto più basse, pari a circa 868 (EU), 433 (EU), e 915(US) MHz a seconda dei paesi. Fate attenzione che non tutte le frequenze possono essere usate liberamente nei vari paesi, se avete dei dubbi potete consultare questo sito.  Parliamo quindi di frequenze decisamente più basse ai 2.4GHz a cui il WiFi ci ha in un certo senso abituati. In linea di principio una frequenza più bassa permette trasmissioni a maggior distanza ma a velocità inferiori (default 2.4kbps, massima 19kbps, minima 300bps). Quindi sempre in linea di principio, possiamo dire che questo tipo di moduli permette di inviare dati a basse velocità ma a lunga distanza. A pensarci bene questo è il dispositivo ideale per collegare sensori remoti sparsi per la casa, l’azienda agricola, il laboratorio, etc. Pensate. Non serve alcuna SIM, non serve il router wifi, non serve l’abbonamento adsl né altro dispositivo fisico. Volete conoscere il livello di umidità nei vostri campi che però sono sparsi nel raggio di qualche chilometro. Ecco questa è la soluzione ideale. Vi bastano due moduli, uno invia i dati, l’altro li riceve e li elabora come preferite. E non basta. Anche se non affronterò questo aspetto in questo articolo, sappiate che esiste una infrastruttura di rete sparsa in gran parte del globo che prende il nome di LoRaWAN e che permette di sottoscrivere un abbonamento da pochi euro annuali per trasferire i dati LoRa sulla rete internet, direttamente da questi piccoli moduli. Sulla distanza che può essere coperta ci sono varie considerazioni da fare, dipende infatti se ci interessa una conessione point to point, ossia direttamente fra un modulo e l’altro, o se ci appoggiamo alle infrastrutture LoRaWAN. In questo secondo caso le antenne poste sui tralicci non sono certo confrontabili con le piccole antenne integrate nei moduli, per cui non c’è da stupirsi se nel primo caso possiamo arrivare a 30Km e nel secondo ai 3Km dichiarati dal modulo in mio possesso (con antenna 5dbi posizionata a 2m d’altezza). E poi anche il modulo fa la sua parte. Quello in mio possesso ha una potenza di 100mW e dovrebbe arrivare a 3Km, ma ci sono moduli da quasi 1W che arrivano ad 8Km passando per la versione intermedia da 5Km. Sarà lo scopo di questo articolo verificare la copertura reale del sistema e fare i primi test su campo perchè sappiamo benissimo che la trasmissione in campo aperto non è praticamente mai quella che poi andiamo ad affrontare sul campo, anche banalmente l’azienda agricola avrà degli alberi, arbusti, pannocchie o altri ostacoli più o meno naturali che andranno ad impattare sulla reale portata.

I moduli

Nello schema più sotto potete vedere i moduli che ho acquitato che più precisamente si chiamano E32-TTL-100 (433T20DC). Sono quelli a 433MHz basati su chip SX1278 e come vedete a parte il chip che occupa gran parte del modulo, le uniche altre due cose importanti sono il connettore per l’antenna (SMA-K) ed una serie di pin per il controllo del modulo stesso. Vediamo qui sotto uno schema del modulo stesso:Vediamo il significato dei vari pin:

Pin Nome Utilizzo
1 M0 Stato del dispositivo
2 M1 Stato del dispositivo
3 RXD Ricezione, da collegare al TX di Arduino
4 TXD Trasmissione
5 AUX Stato di funzionamento del modulo.
6 VCC Alimentazione, sia 3.3 che 5V (2.3 – 5.2V) anche se poi nelle note finali è riportato” Please check the power supply source, ensure it is 2.0V~3.6V, voltage higher than 3.6V will damage the module”, che significa “Occhio che sopra i 3.6V il modulo si danneggia”.
7 GND Collegare a terra

Piccola nota sull’alimentazione: quanto vi ho riportato su VCC dipende dal fatto che ci sono differenti modelli con differenti possibili valori di alimentazione per cui dovete fare molta attenzione all’esatto modello che acquitate anche perchè la documentazione non è scritta in maniera impeccabile e in diversi documenti troverete diverse indicazioni, cosa probabilmente legata al fatto che nel tempo si sono aggiunti diversi prodotti e la documentazione non è stata correttamente aggiornata. Il modulo a mia disposizione comunque è un modulo a 3.3V (comunque ho provato ad alimentarlo a 5V per un breve periodo ed è ancora vivo).

Collegamento

Collegare il modulo è molto semplice. Una volta connessi alimentazione (3.3V) ed i pin M0, M1, AUX ed i due pin della UART (porta seriale), siamo già pronti per caricare il nostro sketch di prova. No, non è vero, non è per nulla così scontato e se ve la devo dire tutta ho impiegato diversi giorni prima di ottenere delle risposte dal modulo.La documentazione ufficiale che vi riporto qui sopra, aggiunge due piccole note, la seconda dice, “per alcune MCU che operano a 5V, potrebbe essere necessario aggiungere un resistore di pull-up di 4-10K per i pin TXD e AUX”. Ok, perfetto, io per le prove ho usato un Arduino DUE che opera a 3.3V per cui questa cosa non dovrebbe interessarmi, comunque sia con Arduino DUE il modulo funziona sia con che senza i resistori di pullup. Ma ulteriori cose che mi ha creato non poca confusione sono alcune diciture che trovate in alcuni datasheet, ad esempio talora anzichè “MCU a 5V” si parla più genericamente di “Arduino”, da altre parti troverete che il resistore può servire anche sul pin RX e per finire la prima volta che ho avuto una risposta dai moduli avevo i resistori montati sulla breadboard facendomi credere che erano necessari anche nel mio caso.

Come vi accennavo un secondo problema è stato il lato software. Purtoppo come spesso accade nei progretti open source come Arduino, il lato negativo è la proliferazione di librerie parallele con funzionalità in parte sovrapponibili, in parte no, che possono rendere ardua la selezione di quella più adatta al nostro scopo. In più gran parte delle librerie sono predisposte per i moduli SPI mentre non supportano i moduli UART come questo o non sono documentate a riguardo. Alla fine sono letteralmente impazzito perchè non ho trovato nulla che funzionasse e non capivo se si trattasse di un problema software, hardware o di entrambi. Alla fine ho cominciato a scrivere una mia libreria personalizzata per cercare di far funzionare questi moduli. La libreria chiaramente effettua per voi tutte le operazioni del caso, ma ci tenevo a sottolineare alcuni aspetti del funzionamento del modulo che ci possono far apprezzare alcune caratteristiche dello stesso.

Sopra dicevo che i pin M0 ed M1 permettono di selezionare la modalità di funzionamento del modulo:

Modo M0 M1 Spiegazione
Normale 0 0 UART e canale radio pronti per l’utilizzo
Wake-Up 0 1 Come sopra ma nel codice viene inviato del codice che permette di “risvegliare” il modulo ricevente.
Power Saving 1 0

La UART è disabilitata ed il canale radio è in modalità WON (Wake On Radio) che potremmo tradurre con “risveglio via radio”. In questa modalità il modulo viene appunto risvegliato dalla trasmissione del modulo inviante.  La trasmissione non è permessa.

Sleep 1 1 Il modulo non può né trasmettere, né ricevere. In questa modalità è possibile programmare il modulo.

Il primo modo è quello “normale” e l’ultimo quello “programmazione”. Risultano invece più interessanti i due intermedi che permettono al modulo ricevente di porsi in uno stato di forte risparmio energetico, situazione decisamente interessante per le applicazioni a batteria, mentre sul modulo inviante viene attivata la modalità “WakeUp” che permette di “Risvegliare” il modulo ricevente quando gli vengono inviati i dati. Non approfondiremo ora questo aspetto ma volevo segnalarvelo già in questo primo articolo perchè è uno degli aspetti più importanti nella gestione di sensori remoti che funzionano a batterie.

Il pin AUX serve invece a stabilire lo stato di funzionamento del dispositivo, molto importante nella stesura del codice della libreria ma poco interessante per l’utilizzatore finale.

Configurazione

Come vi accennavo sopra ho avuto non pochi problemi a configurare correttamente il sistema. La stragrande maggioranza della documentazione online è scritta per moduli con interfaccia SPI, mentre per quelli UART la cosa è molto lacunosa. Come fattore confondente ho usato dei NodeMCU con i quali non ho ancora la stessa dimestichezza che ho con Arduino, per cui fra la diversa nomenclatura dei pin, porte seriali più o meno condivise con la porta USB, etc ho avuto diversi problemi. A completare il quadro, le librerie che ho inizialmente provato supportavano quasi tutte i moduli SPI mentre ho fatto non poca fatica a trovare qualcosa di funzionante per i moduli UART e tra quel che ho trovato c’erano errori ed imprecisioni un po’ ovunque. E quindi come sempre è andata a finire che la libreria me la sono scritta da me a partire dai pezzi di codice che ho trovato online e che ho profondamente modificato. Inoltre la documentazione originale purtroppo non risulta molto approfondita ed è divisa in diversi documenti il che crea ancor più confusione. Ad esempio non c’è scritto da nessuna parte che se via UART fate il reset del modulo quest’ultimo oltre ai parametri interni resetta anche la porta seriale con perdita della connessione e non a caso nessuna delle pseudo-librerie che ho trovato in rete prevede questo problema. Voi fate il reset e perdete la connessione UART con il modulo che smette di rispondere. Questo è solo un esempio ma tutti i fattori messi insieme hanno fatto si che ci mettessi una buona settimana per riuscire a creare un prototipo funzionante del sistema. Come intuibile l’indirizzo del modulo ed il canale di trasmissione sono fondamentali perchè i moduli interagiscano fra loro, a tal proposito il canale di comunicazione sarà il medesimo affinchè i moduli si “vedano”, inoltre utilizzeremo l’indirizzo 0x0000 che è un indirizzo di broadcast, ossia se il modulo trasmittente utilizza questo indirizzo, qualsiasi modulo nello stesso canale, ovviamente nel range di ricezione, vedrà la trasmissione in arrivo indipendentemente dall’indirizzo del modulo ricevente.

Alimentazione

Beh, ormai un po’ di esperienza con i moduli di trasmissiuone radio me la sono fatta ed una cosa che li accomuna tutti è legata alla stabilità dell’alimentazione. Tutti questi moduli in fase di trasmissione hanno dei picchi di assorbimento di corrente che possono mettere in crisi tutto il sistema con reset o malfunzionamenti casuali sia a carico del modulo che della mcu (MicroControllerUnit) che lo controlla. Normalmente perciò si utilizzano dei condensatori per supplire a questi picchi di assorbimento, ma in rete a questo punto troverete i consigli più disparati e resterete sempre con la domanda: “qual’è la soluzione adatta al mio caso?”. Il datasheet del modulo dice che l’assorbimento tipico in trasmissione è di 110mA, massimo di 120, ma specifica anche che risulta necessario prevedere un surplus del 30% per garantire un funzionamento stabile a lungo termine, quindi alla fine sono 156mA. Poi però combiate pagina ed il medesimo datasheet vi dice che la fonte di alimentazione deve poter erogare più di 250mA con un ripple massimo di 100mV. Beh diciamocelo, questo è uno dei datasheet più incongruenti che mi sia mai capitato di leggere, si trovano continuamente dati contrastanti per cui risulta difficile capire dove si trovi la verità.

Ora, non pensiate che io abbia la soluzione, ma posso fare delle misurazioni per cercare di capire come procedere nel modo più corretto. Per prima cosa provo il sistema con l’alimentatore da breadboard e vediamo cosa succede:

Bene ottimo, siamo leggermente sotto i 3.3V (linea trateggiata nera), ma l’alimentazione è perfettamente stabile anche durante le fasi di trasmissione. Ora proviamo con Arduino DUE. Il suo regolatore di tensione dovrebbe poter erogare 800mA, quindi più che sufficienti per il nostro scopo e non per niente il sistema funziona correttamente. Ma diamo un occhio più da vicino:

La scala è la medesima di prima, si vede che la tensione di base è pressochè identica a quella precedente, ma nel momento della trasmissione avviene un calo di tensione che si protrae per tutta la trasmissione mal quantificabile in quanto in numerose prove fatte ho registrato valori piuttosto differenti fra una prova e l’altra variabili da circa 150 a 350mV. Successivamente ho provato ad aggiungere dei condensatori da 100uF e da 470uF. Inizialmente mi pareva chiara la riduzione di questa variazione di tensione, ma poi a forza di fare prove mi sono convinto che non vi è nessuna reale evidenza di modificazioni positive sulla stabilità dell’alimentazione. Ho dei dubbi però sul fatto che la scarsa ripetibilità delle misure derivi almeno in parte dai contatti sulla breadboard che come sempre mi hanno dato un sacco di problemi. Infatti durante i miei test ho avuto la riprova pratica che i condensatori sevono. Inizialmente ho usato Arduino DUE come stazione inviante ed un NodeMCU come ricevente, quest’ultimo alimentato con una batteria 18650 ed un regolatore di tensione che mi sono portato in giro con la bicicletta. Un led blu mi indicava la ricezione dei pacchetti dati. Ebbene, la stazione ricevente ha cominciato a funzionare solamente dopo l’aggiunta di un condensatore da 470uF sulla linea di alimentazione, senza non ne voleva sapere.

E la distanza?

Si lo so sarà la prima domanda che vi siete posti. Ma a che distanza sei riuscito a far comunicare questi moduli? Io ho usato una configurazione che possa riprodurre un reale sistema per cui ho tenuto l’antenna trasmittente vicino al pc su cui lavoravo e sono andato in giro con la bici per testare la portata del segnale. Con l’antenna classica a “stilo” da 3dbi e velocità standard di 2.4k, ho raggiunto circa i 120 metri, oltrepassando da parte a parte tre case che sono interposte fra ricevente e trasmittente. Beh, non male se faccio un confronto con la portata del WiFi e dei moduli NRF24L01. Ma ho voluto andare oltre ed ho sostituito entrambe le antenne con altre da 5dbi, sempre a velocità standard. La differenza è notevole in quanto il segnale arriva a circa 450metri di distanza, quasi il quadruplo. E riducendo la velocità al minimo di 300bps? Ho raggiunto i 660 metri circa. Anche se non sono certo i 3Km sbandierati nel datasheet è comunque un ottimo risultato. Ho perciò voluto vedere fino a che punto potevo spremere questi moduli ma siccome era un po’ scomodo andarmente in giro con la bici controllando se il led blu si accendeva o meno, ho deciso di modificare un po’ il progetto. Ho traformato la stazione “sulla bici” da ricevente ad inviante, in questo modo posso valutare la reale possibilità di creare un sensore remoto alimentato a batteria che invia dati ad una stazione centrale. Inoltre ho aggiunto un modulo GPS così invio alla stazione ricevente le coordinate GPS del mio giro in bici così posso poi tracciare comodamente da casa uno schema con tutti i punti cui il segnale è arrivato correttamente a destinazione. Siccome il datasheet specifica che l’antenna dovrebbe stare a 2m da terra, ho deciso di mettere l’antenna della stazione ricevente a circa 3 metri d’altezza, su uno dei supporti del mio impianto fotovoltaico a parete. Com’è andata? Qui sotto potete vedere la mappa (cliccandoci sopra potete accedere a quella riginale online).

Le stelline azzurre sono il primo test effettuato e con mia sorpresa ho coperto tuto il tragitto fatto in bici con una distanza massima dal punto di ricezione di circa 1,2km. Notetere che ci sono degli spazi “vuoti”, ma sono dovuti alla vegetazione che impediva la ricezione del segnale GPS. C’è poi qualche saltuario “salto” che non so se essere dovuto a problemi di trasmissione, al GPS o banalmente al fatto che il prototipo su breadboard era poco affidabile. In rosso invece un secondo test che ho fatto per verificare la massima distanza raggiunibile che è stata di 1.6Km.

Conclusioni

Si lo so che siete impazienti di provare anche voi, ma la libreria non è ancora pronta. Devo ancora mettere un po’ a posto il codice e successivamente devo rispondere ad alcuni quesiti. Ad esempio cosa succede se invio dati da due moduli in contemporanea? Come posso sfruttare i diversi indirizzi attribuibili ai moduli per ottenere il massimo beneficio dalla rete LORA? E poi come li mando in rete? Beh, ovviamente la stazione ricevente dovrà anche essere in grado di inviare i dati in rete, e un protocollo ben sviluppato permetterà di decidere cosa realmente dovrà uscire in rete e cosa invece rimarrà in locale.  Insomma, di lavoro ne ho ancora un po’, ma questa volta ho finalmente trovato la tecnologia giusta per il mio sistema domotico, un sistema che mi permette di coprire senza problemi tutta la casa, che dalle prime prove pare affidabile, che non necessita di router e quindi non mi lascia a piedi quando la rete non va. Ora applicherò questo modulo nel circuito che stavo sviluppando per il monitoraggio dell’impianto fotovoltaico.

PS: oggi niente video, vi mostrerò il tutto nelle prossime puntate.




Salva