Dopo aver giocato abbastanza con l’ APRS, arrivando più e più volte in zona 9 con solamente 100mW, è ora di sperimentare il LoRa, ancora un altro modo digitale, con solo una differenza: può essere usato da tutti, radioamatori o meno, rispettando le regole delle bande ISM.
Ma cos’è il LoRa?
Il LoRa (Long Range) è un modo di trasmissione digitale usato per trasmettere piccole quantità di dati (in questo caso, telemetria) a lunga distanza. La differenza maggiore dall’ APRS però non è questa: il LoRa sfrutta un altro tipo di modulazione, chiamato Chirp Spread Spectrum, oppure CSS.
La modulazione CSS si basa, come dice il nome, su dei “Chirp“. Per codificare un’informazione, il trasmettitore varia continuamente la sua frequenza sfruttando tutta la larghezza di banda assegnata, codificando i dati simbolo dopo simbolo e lasciando al ricevitore tutto il lavoro di demodulazione e ricostruzione dei dati.
A differenza dell’ APRS, il LoRa ha una larghezza di banda variabile da 7.8kHz fino a 500kHz (mezzo megahertz!). Solitamente, i valori più comuni sono 125kHz, 250kHz e 500kHz. La larghezza di banda, o BW, influenza molto sia la velocità di trasmissione sia la sensibilità: aumentando la larghezza di banda, i dati verranno trasmessi in modo più veloce ma la sensibilità del ricevitore diminuisce. Con una larghezza di banda minore, si impiega più tempo in trasmissione (airtime), ma si aumenta in modo decisivo la sensibilità del ricevitore.
Oltre alla larghezza di banda, si introducono altri due parametri: lo Spreading Factor (SF) e il Coding rate (CR).
• Lo Spreading Factor indica quanto tempo ci vuole per trasmettere un simbolo, i valori vanno comunemente da SF7, il più veloce, fino a SF12, il più lento, ma il più adatto per ricevere segnali deboli.
• Il Coding Rate, invece, indica quanti dati aggiuntivi vanno inseriti in una trasmissione per la correzione degli errori. Si usano valori come 4/5, 4/6, 4/7 e 4/8: ogni 4 bit di dati si usano rispettivamente 5, 6, 7 o 8 bit per rilevare e correggere eventuali errori, aumentando però il tempo di trasmissione.
Hardware
Dopo questa breve spiegazione tecnica, possiamo passare all’ hardware vero e proprio.
Come contenitore, ho usato il “cervello” delle lucine di natale da esterno, dotate di pannello solare:

originariamente c’era il circuito di carica per una batteria NiMH da 1,2v, uno step up a 5v e, infine, un inverter switching per alimentare i led saldati in fabbrica in modo alternato tra positivo e negativo, per poi invertire la tensione e illuminare o meno una specifica coppia.
Alimentazione

Il pannello, in condizioni ideali, riesce ad erogare circa 100mA a 1,2v. La tensione del pannello entra direttamente in un TPS61023 che poi alimenta un LTH7, per infine caricare la batteria. Sfortunatamente, ci sono moltissime perdite, infatti solamente 20/30mA riescono ad arrivare alla batteria. In tutta la catena, oltre all’ efficienza del pannello, la perdita maggiore si ha nel salto da 1,2v a 5v: si alza la tensione di 4 volte circa ma si riduce di altrettante volte la corrente, senza tenere conto delle perdite causate dagli integrati. Ci sono chip migliori per ottenere questo ma, sfortunatamente, dopo i dazi aggiuntivi per tutti gli ordini dalla Cina, ho preferito usare solo componenti di recupero oppure semplicemente inutilizzati.
Dopo qualche misurazione, il consumo del beacon è veramente irrisorio: con una trasmissione ogni 10 minuti, si consumano circa 4mAh al giorno, praticamente nulla rispetto alla capacità di 800mAh di una ICR14500. Ovviamente il sistema produrrà decisamente più di 4mAh al giorno, quindi non ci sarà alcun problema, finché c’è il sole ad illuminare il pannello. Il sistema mantiene la batteria quasi sempre carica, sopravvivendo anche a giorni senza sole. Non ho usato la cella NiMH (comuni batterie ricaricabili, trovata di fabbrica nel dispositivo) proprio per la loro diversa gestione della carica rispetto ad una cella a ioni di litio. Dopo tutta la catena di ricarica, c’è un buck/boost converter collegato direttamente alla batteria che porterà il voltaggio a 3.3v per tutta l’ elettronica.
Microcontrollore

Anche qui è stata una scelta abbastanza immediata data la disponibilità. Come gli altri 2 beacon, sono rimasto fedele alla scelta della famiglia ESP proprio per il loro deep sleep, la potenza di calcolo e soprattutto la loro dimensione molto ridotta. Ovviamente verranno sfruttati i pin ADC (Analog to Digital converter) per la lettura (anche se non precisissima) di tutte le tensioni dello scatolotto.
Modulo radio

Per questo progetto ho usato il modulo già “pronto” RA-01, contenente il prezioso SX1278, che copre da 410MHz fino a 525MHz, comunque mi limiterò all’ uso della banda ISM 433. Questo modulo, almeno da specifica, può erogare fino a circa 60mW (18dBm) ma comunque verrà impostato a 10mW (10dBm) via software.
L’ antenna, per questioni di spazio, è quella di default che arriva con i moduli:

Sensoristica
Dato che è una scatola ermetica, ho optato solamente per un sensore DS18B20 della Dallas Semiconductor per la temperatura (anche se verrà comunque falsato, data l’esposizione al sole). Per la lettura delle tensioni, ho usato un partitore resistivo, con R1 ed R2 di 1Mohm e Vout ad un pin ADC dell’ ESP32.


Codice
Come gli altri progetti ho mantenuto le cose abbastanza semplici anche dal lato software. Sono solamente 150 righe di codice, scritto come sempre sotto Arduino IDE, reso disponibile su GitHub.
Letture
Data l’imprecisione naturale degli ADC dell’ESP32, per avere una lettura più accurata ho deciso di fare più misurazioni e facendo una media:
float readAdcVoltageAveraged(int pin, int samples) {
uint32_t sum = 0;
for (int i = 0; i < samples; i++) {
sum += analogRead(pin);
delay(2);
}
float avgRaw = (float)sum / samples;
float voltage = (avgRaw / ADC_RESOLUTION) * ADC_VREF;
return voltage;
}
Metodo già usato e ampiamente testato con il beacon APRS, https://www.aribassolazio.it/beacon-aprs-a-basso-costo/.
Formattazione Payload
Dopo aver letto tutti i dati, andranno messi in ordine. Il payload è strutturato così:
P1.1,B4.2,C27.3
Tra questi valori:
il primo, P1.1, sarà la lettura della tensione del pannello solare,
il secondo, B4.2, sarà la lettura del voltaggio della batteria,
il terzo, C27.3, sarà la lettura presa dal DS18B20, espressa in gradi centigradi.
Ricevitore
Come tutti i beacon che si rispettino, anche questo ha un suo ricevitore. Si basa sulla libreria già presente in rete su GitHub. Si tratta di un ricevitore scritto totalmente in C++, senza dipendenze esterne come GNU Radio. L’ unica pecca è che si deve dedicare totalmente una SDR solo per questo scopo, nelle fasi di test va più che bene.
Quando verrà posizionato definitivamente, per la ricezione userò un altro modulo SX1278 per riceverlo, collegato ad un Orange Pi già posizionato sul tetto per la ricezione delle radiosonde. Giustamente una RTL-SDR intera è abbastanza sprecata per questo scopo.
’73 e buoni esperimenti de IUØVCK



