LoRa (+Raspberry+Arduino) rakentelublogi

Liittynyt
18.12.2016
Viestejä
55
Täällä rakennellaan LoRa radiota hyödyntävä langaton tiedonsiirto Raspberryn ja Arduinon välille.

Tarpeena oli siirtää pieniä määriä dataa langattomasta n. puolen kilometrin etäisyydeltä.

Osaluettelo Raspberry:
-Raspberry PI 3
-Official Raspberry Pi case for the Raspberry Pi 3 Model B
-LoRa moduuli (433Mhz) Adafruit RFM96W LoRa Radio Transceiver Breakout - 433 MHz
-PiHat Adafruit Perma-Proto HAT for Pi Mini Kit - No EEPROM

Arduino:
-Adafruit Feather 32u4 RFM96 LoRa Radio - 433MHz
-2-värinen LED

Antennit yms:
-UFL / SMA adapteri Starelec Oy
-UFL piirikorttiliitin
-SMA kaapeli
-Antenniputket Hobbypark 5-Pack Multicolor Plastic Antenna Tube with Cap for RC Model Cars Boat | eBay


Raspberry kokoonpano:

Kytkentä menee seuraavasti:
LoRa ........ Raspberry
GND ........ GND
3.3V ........ 3.3V
MISO ........ SPI_MISO
MOSI ........ SPI_MOSI
SCK ......... SPI_SCLK
CS ......... CE1
Hardware interrupt ja reset pinnit jätin kytkemättä.
 
Viimeksi muokattu:
  • Tykkää
Reactions: Jke
Tarpeena on siirtää 6+1 (data+osoite) tavua dataa n. kerran kymmenessä minuutissa, mutta välillä jopa parin sekunnin välein. Preamblen jätin oletukseksi 8 tavuun. Koska lähetettävä data sisältää jo valmiiksi tarkistussumman ja se on aina saman pituista, jätin headerin ja CRC kokonaan pois lähetyksestä. Varmistuksena että kaikki data saadaan varmasti siirrettyä, 6+1 tavun paketit siirretään kahteen kertaan. Tarvitaan siis vähintään (6+1+8)x2x8 => 240bit/s.


LoRa bitrate calculatorilla todetaan että asetuksilla 125kHz/12/4:8 saavutetaan sopiva nopeus. Käsittääkseni bandwith vaikuttaa vähiten ja spearing factor eniten kantamaan.


Air timet voi laskea tarkemmin excel taulukolla. Taulukon mukaan yhteen lähetykseen menee 991ms ja käytännössä mitattuna 993ms.


Koodia alettiin työstämään valmiista kirjastoista:
Arduino: adafruit/RadioHead
Raspberry: adafruit/Adafruit_CircuitPython_RFM9x

Kirjastot oli alunperin tarkoitettu huomattavasti monimutkaisempaan kommunikointiin joten tein niistä yksinkertaisemmat versiot yhdensuuntaiseen kommunikointiin. Yhteysasetukset oli toteutettu kirjastoissa turhan monimutkaisesti joten muutin koodia niin että ne voidaan kirjoittaa suoraan LoRan muistipaikkoihin hexana.

Rekisterit löytyy s. 102: https://cdn.sparkfun.com/assets/learn_tutorials/8/0/4/RFM95_96_97_98W.pdf

Yhteysparametreiksi asetin:
0x01 = 0x80 //Lora mode
0x06 = 0x6C //Taajuus MSB 433Mhz => 433000000*2^19/32000000
0x07 = 0x40 //Taajuus MID
0x08 = 0x00 //Taajuus LSB
0x09 = 0x8B //PA_BOOST = 1, OutputPower = 13
0x0E = 0x00 //FIFO RX address = 0
0x0F = 0x00 //FIFO TX address = 0
0x1D = 0x79 //125kHz, 4:8, Implicit header mode
0x1E = 0xC0 //SF=12, normal mode, CRC off
0x20 = 0x00 //Preamble MSB = 0
0x21 = 0x08 //Preamble LSB = 8 tavua

Ylläolevilla asetuksilla lähetystehon pitäisi olla +13dBm.

Kantamaa testasin kytkemällä lähettävän raspberryn varavirtalähteeseen ja vastaanottavan arduinon puhelimeen OTG kaapelilla jossa luin lukemia terminaaliemulaattorilla.

RSSI lukemat näytti mitä saattuu eli jo muutamien kymmenien metrien päässä lukema oli -128dBm ja siinä se pysyi siihen saakka kuin yhteys katkesi. Onko kellään tietoa onko nuo vain LoRa piirin bugeja vai pitäisikö asetuksista vielä säätää jotain?

Täysin yllättäen sain yhteyden toimimaan vielä 6,7km päähän ilman suoraan näköyhteyttä. Puolen killometrin tarve täyttyy siis helposti.

Edit: Muokattu yhteysasetuksia
 
Viimeksi muokattu:
Muistelisin että SF7 sai suht helposti 6km ilman suurempia kikkailuja. Antennina tais olla vaan LTE "pupunkorva". Toki vastaanottajana oli TTN verkon LoRa base station.
 
Kiinnostava projekti ja hyvin kuvattu prosessi jos voit päivittää ketjua vielä jatkossakin.

Kiinnostaa vielä miten hoidat virran tarpeet maastossa käytätkö varavirtalähdettä ja kuinka kauan käytännössä virta riittää?
 
Kantamaa olisi kyllä mielenkiintoista testata vain sen kannalta että mihin asti ihanteellisissa olosuhteissä pääsee näillä "peruslaitteilla". Ongelmaksi vain muodostuu että mistä löytää paikan missä saa 10km näköyhteyden. Tuossa 6,7km testissä lähetin oli autossa joten lasista tulee jonkinverran vaimennusta. Jos raspille ottaa ssh yhteyden VPN:n yli voisi molempian laitteiden yhteysasetuksia muuttaa samaan aikaa vertailua varten.

Laitetta käytetään vain maks. 8 tuntia kerrallaan joten virransyöttö ei muodostu ongelmaksi. Virta tulee varavirtalähteestä (18200mAh) jolla aikaisempi versio 4G mokkulalla toimi jopa 2 vuorokautta. Kaikki python prosessit (4x sarjaporttilukija ja 1xLoRa) voisi suorittaa 10ms välein. Tuosta muodostuu kuitenkin ongelma että raspi ottaa niin vähän virtaa ettei Vartan varavirtalähde meinaa pysyä käynnissä. Nopeutin prosesseja suoritettavaksi 5ms välin jolloin kuormitus nousee sen verran että varavirtalähde ei sammu.
 
Viimeksi muokattu:
LoRa piirin asetukset kannattaa säätää niin, että A) operoi radiolaitetta sille varatulla taajuusalueella ja B) taajuusalueella tapahtuva operointi on esim. säteilytehon osalta sallituissa puitteissa.

Nythän kumpikaan näistä ei valittavasti toteudu. 425MHz ei osu yleisien lyhyen kantaman radiolähettimille varatuille taajuusalueille. Tuossa sinänsä ampuu itseään jalkaan, eli tuolla alueella toimii radiolähettimiä, jotka toimivat jokseen noin 1000-kertaisella säteilyteholla. Vastaavasti esim. 433MHz maksimi säteilyteho on 25mW eli +13.9dBm mikäli lähetin on aktiivisena enintään 10% ajasta. Se mikä on kiinalaisen RF:n absoluuttinen totuus on toki asia joka pitäisi erikseen mitata.

Vaikka nuokin korjaa, niin CE-vaatimustenmukaisuushan ei noilla linkatuilla RF-tuotteilla täyty. Traficomin tarjoaa aiheesta lisää esim. täällä, määräykset 4 ja 15 lie ne mielenkiintoisimmat. Jos sattuu joku virkaintoinen kohdalle, niin sakkojen paikka.
 
LoRa piirin asetukset kannattaa säätää niin, että A) operoi radiolaitetta sille varatulla taajuusalueella ja B) taajuusalueella tapahtuva operointi on esim. säteilytehon osalta sallituissa puitteissa.

Nythän kumpikaan näistä ei valittavasti toteudu. 425MHz ei osu yleisien lyhyen kantaman radiolähettimille varatuille taajuusalueille. Tuossa sinänsä ampuu itseään jalkaan, eli tuolla alueella toimii radiolähettimiä, jotka toimivat jokseen noin 1000-kertaisella säteilyteholla. Vastaavasti esim. 433MHz maksimi säteilyteho on 25mW eli +13.9dBm mikäli lähetin on aktiivisena enintään 10% ajasta. Se mikä on kiinalaisen RF:n absoluuttinen totuus on toki asia joka pitäisi erikseen mitata.

Vaikka nuokin korjaa, niin CE-vaatimustenmukaisuushan ei noilla linkatuilla RF-tuotteilla täyty. Traficomin tarjoaa aiheesta lisää esim. täällä, määräykset 4 ja 15 lie ne mielenkiintoisimmat. Jos sattuu joku virkaintoinen kohdalle, niin sakkojen paikka.

Mites noi tehot mitataan? Eli onko puhtaasti lähettimen teho, riippumatta antennista? Jos on suuntaava antenni niin eikö se häiriökin kohdistu paljon pienemmälle alueelle, jolloin jonkun virkaintoisen mittailijan pitäisi osua juuri oikeaan paikkaan ollakseen linjassa antennin kanssa
 
Mites noi tehot mitataan? Eli onko puhtaasti lähettimen teho, riippumatta antennista? Jos on suuntaava antenni niin eikö se häiriökin kohdistu paljon pienemmälle alueelle, jolloin jonkun virkaintoisen mittailijan pitäisi osua juuri oikeaan paikkaan ollakseen linjassa antennin kanssa
Kyllä säteilytehon määrittämisessä oletaan huomioon niin lähetin, antenni kuin siirtolinjakin, ks lisää radiotaajuusmääräyksestä. Mikä mahtaa olla kiinnijäämisriski esim. toimintasuhteen ylittämisestä? Eikö tässä jo vuosia sitten ollut uutisia että Ficoran/Traficomin/mikälienykyään keilausautoja oli vähennetty reippaasti? Pk-seudulla lienevät aktiivisimmillaan.
 
Mites noi tehot mitataan? Eli onko puhtaasti lähettimen teho, riippumatta antennista? Jos on suuntaava antenni niin eikö se häiriökin kohdistu paljon pienemmälle alueelle, jolloin jonkun virkaintoisen mittailijan pitäisi osua juuri oikeaan paikkaan ollakseen linjassa antennin kanssa

ERP (Effective Radiated Power) -mittauksista on kerrottu esimerkiksi ETSI EN 300 220 standardissa; ihan vapaasti saatavilla oleva asiakirja. Käytännössä siis juurikin kuten tuossa yllä todettiin, eli koko lähetysketju huomioiden (lähettimen teho, antennin vahvistus, liittimien ja kaapelien häviöt, sovitus).

Totta kai saa olla aika harvinaisen virkaintoista virkailijaa, että tuosta mitään seurauksia koituu, mutta mielestäni noin yleisperiaatteena olisi kuitenkin hyvä noudattaa noita määräyksiä. Siellä eetterissä on kuitenkin muitankin käyttäjiä ja tässätkin tapauksessa osuttiin kaistalle jossa oli näennäisesti vähemmän liikennettä, mutta yksikin laite linjoilla niin oma QSO lakkaa kulkemasta.

Varmaan todellisin ongelma on se, että jos meno menee liian villiksi, niin laitevalmistajilta edellytetään toimenpiteitä tämän kaltaisten juttujen estämiseksi. Voi johtaa siihen, että komponenttitason firmikset ja datasheetit siirtyvät hiljalleen NDA:n alle kun pääasiallinen raha tulee laitevalmistajien kautta ja laitevalmistajat eivät saa laitteitaan spekseihin, mikäli estotoimenpiteitä ei ole tehty; sen sijaan että laitevalmistaja itse käyttäisi tähän aikaa ja rahaa, valitaan vain komponenttivalmistaja jolla nämä asiat ovat jo kunnossa.
 
Toteutin muutama vuosi takaperin myös LoRa-pohjaisen tiedonsiirron Raspberry PI:n ja STM32:n välille kun tarvitsin etäohjattavan pistorasian ja kaupallisissa ei kantama riittänyt. LoRa-moduuli oli Semtechin SX1278, muistaakseni Ai-Thinkerin breakout boardilla (eli ehkä joku kopio?). Matkaa ei ollut kilometrejä, mutta satakunta metriä ja seiniä yms välissä. Oli tarkoitus joskus testata GPS:n kanssa tuon maksimikantamaa ulkona mutten sitä tehnyt, ehkä pitäisi kokeilla vielä...

Tein 2kpl dipoliantenneja ja yhden monopolin (oikea nimitys?) kantaman vertailua varten. Antennien pituudeksi tuli 1/4 aallonpituus eli 165mm.

Dipolissa koaksiaalikaapelin johtimet on yhdistetty antenniputkin sisällä oleviin kytkentäjohtimiin. Monipoliantennin sai kätevästi toteutettua kulma SMA -liittimellä.
Minä käytin antennina tällaista "coil loaded" antennia (linkin takaa myös löytyy ilmeisesti alunperin Elektorissa ollut artikkeli). Tuo ainakin tuntui toimivan hyvin, juotettuna suoraan LoRa-moduulin pinniin.

Yhteysparametreiksi asetin:
0x01 = 0x80 //Lora mode
0x06 = 0x6C //Taajuus MSB 433Mhz => 433000000*2^19/32000000
0x07 = 0x40 //Taajuus MID
0x08 = 0x00 //Taajuus LSB
0x09 = 0x8B //PA_BOOST = 1, OutputPower = 13
0x0E = 0x00 //FIFO RX address = 0
0x0F = 0x00 //FIFO TX address = 0
0x1D = 0x79 //125kHz, 4:8, Implicit header mode
0x1E = 0xC0 //SF=12, normal mode, CRC off
0x20 = 0x00 //Preamble MSB = 0
0x21 = 0x08 //Preamble LSB = 8 tavua
Minulla ei ollut kaistavaatimuksia, muutama tavu dataa kerran minuutissa ja lisäksi komennot (päälle/pois yms) silloin kun tarvitsee. Käytin STM32:ssa tätä kirjastoa pohjana ajurille mutta muuttelin aika paljon jotta sopi omaan käyttöön. Raspberry PI:n puolella käytin nykyisin jo vanhaa versiota sx1278-LoRa-RaspberryPi:stä.

Rekisterit laitoin:
sx1278_rf.frequency = SX1278_434MHZ;
sx1278_rf.power = SX1278_POWER_14DBM;
sx1278_rf.LoRa_Rate = SX1278_LORA_SF_8;
sx1278_rf.LoRa_BW = SX1278_LORA_BW_62_5KHZ;
sx1278_rf.LoRa_CR = SX1278_LORA_CR8;
sx1278_rf.LoRa_CRC = 1;
sx1278_rf.LoRa_preamble = 6;
sx1278_rf.packetLength = 16;

Alunperin ajatus oli laittaa spread factor (LoRa_Rate tuossa ajurissa) 12 jolloin kantaman piti olla suurin, mutta tällöin tuli korruptoituneita viestejä. SF 8 tuntui toimivan. Lisäksi 62.5 kHz kaistanleveys salli kiteen (crystal) käyttämisen eikä tarvinnut olla TCXO. Lähetysteho 14 dBm on 25 mW joka ymmärtääkseni on sallittu kun lähetysaika on alle 10 %.

Muistaakseni preamblessa oli kanssa joku homma, että sen pitää olla tarpeeksi pitkä jos haluaa että radio herää virransäästöstä ajoissa tms, mutten nyt muista tarkemmin miten tuo oli.
 

Statistiikka

Viestiketjuista
261 775
Viestejä
4 546 788
Jäsenet
74 846
Uusin jäsen
Urnaakkeliz

Hinta.fi

Back
Ylös Bottom