- Vereiste materialen
- Raspberry Pi verbinden met LoRa
- Arduino verbinden met LoRa
- pyLoRa voor Raspberry Pi
- Configuratie van de Raspberry Pi voor LoRa-module
- Raspberry Pi programmeren voor LoRa
- Arduino-code voor LoRa om te communiceren met Raspberry Pi
- LoRa-communicatie tussen Raspberry Pi en Arduino testen
LoRa wordt steeds populairder met de komst van IoT, Connected Cars, M2M, Industry 4.0 enz. Vanwege het vermogen om over lange afstanden te communiceren met zeer weinig stroom, wordt het bij voorkeur gebruikt door ontwerpers om gegevens te verzenden / ontvangen van een batterijgevoed ding. We hebben de basisprincipes van LoRa al besproken en hoe je LoRa met Arduino kunt gebruiken. Hoewel de technologie oorspronkelijk bedoeld is om een LoRa-knooppunt te laten communiceren met een LoRa-gateway, zijn er veel scenario's waarin een LoRa-knooppunt moet communiceren met een andere LoRa-knooppunt om informatie over lange afstanden uit te wisselen. In deze tutorial zullen we dus leren hoe we een LoRa-module SX1278 met Raspberry pi kunnen gebruikenom te communiceren met een andere SX1278 die is aangesloten op een microcontroller zoals Arduino. Deze methode kan op veel plaatsen van pas komen, omdat de Arduino zou kunnen fungeren als een server om gegevens van sensoren op te halen en deze via LoRa over een lange afstand naar Pi te sturen, waarna de Pi die als client fungeert deze informatie kan ontvangen en uploaden naar de zou kunnen omdat het toegang heeft tot internet. Klinkt interessant toch? Dus laten we beginnen.
Vereiste materialen
- SX1278 433 MHz LoRa-module - 2 nrs
- 433 MHz LoRa-antenne - 2 nrs
- Arduino UNO- of andere versie
- Raspberry Pi 3
Aangenomen wordt dat uw Raspberry Pi al is geflasht met een besturingssysteem en verbinding kan maken met internet. Als dit niet het geval is, volgt u de handleiding Aan de slag met Raspberry Pi voordat u verder gaat. Hier gebruiken we Rasbian Jessie geïnstalleerde Raspberry Pi 3.
Waarschuwing: gebruik altijd uw SX1278 LoRa-module met 433 MHz-antennes; anders kan de module beschadigd raken.
Raspberry Pi verbinden met LoRa
Voordat we met de softwarepakketten beginnen, moeten we de hardware gereed maken. De SX1278 is een 16-pins Lora-module die communiceert met SPI op 3.3V Logic. De Raspberry pi werkt ook op 3.3V logisch niveau en heeft ook een ingebouwde SPI-poort en 3.3V-regelaar. We kunnen de LoRa-module dus rechtstreeks verbinden met de Raspberry Pi. De verbindingstabel wordt hieronder weergegevenRaspberry Pi | Lora - SX1278-module |
3.3V | 3.3V |
Grond | Grond |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | NSS / inschakelen |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
U kunt ook het onderstaande schakelschema gebruiken als referentie. Merk op dat het schakelschema is gemaakt met behulp van de RFM9x-module die sterk lijkt op de SX1278-module, waardoor het uiterlijk in de onderstaande afbeelding kan verschillen.
De verbindingen zijn redelijk rechttoe rechtaan, het enige probleem waarmee u te maken kunt krijgen, is dat de SX1278 niet compatibel is met breadboards, dus u moet rechtstreeks verbindingsdraden gebruiken om de verbindingen te maken of twee kleine breadboards gebruiken, zoals hieronder wordt weergegeven. Ook stellen maar weinig mensen voor om de LoRa-module van stroom te voorzien met een afzonderlijke 3.3V-voedingsrail, omdat de Pi mogelijk niet voldoende stroom kan leveren. Hoewel Lora een energiezuinige module is, zou het moeten werken op de 3.3V-rail van Pi, ik heb hetzelfde getest en ontdekte dat het zonder enig probleem werkte. Maar neem het toch met een snufje zout. Mijn verbindingsopbouw van LoRa met Raspberry pi ziet er hieronder ongeveer zo uit
Arduino verbinden met LoRa
De aansluiting voor de Arduino-module blijft dezelfde als die we in onze vorige tutorial hebben gebruikt. Het enige verschil is dat in plaats van de bibliotheek van Sandeep Mistry te gebruiken, we de Rspreal-bibliotheek op basis van Radio head zullen gebruiken, die we later in dit project zullen bespreken. Het circuit is hieronder weergegeven
Nogmaals, je kunt de 3.3V-pin op Arduino Uno gebruiken of een aparte 3.3V-regelaar gebruiken. In dit project heb ik de boordspanningsregelaar gebruikt. De pin-verbindingstabel wordt hieronder gegeven om u te helpen de verbindingen gemakkelijk te maken.
LoRa SX1278-module | Arduino UNO-bord |
3.3V | 3.3V |
GND | GND |
Nl / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Omdat de module niet in een breadboard past, heb ik de aansluitdraden direct gebruikt om de aansluitingen te maken. Zodra de verbinding is gemaakt, ziet de Arduino LoRa- installatie er hieronder ongeveer zo uit
pyLoRa voor Raspberry Pi
Er zijn veel python-pakketten die u met LoRa kunt gebruiken. De Raspberry Pi wordt ook vaak gebruikt als een LoRaWAN om gegevens van meerdere LoRa-knooppunten te krijgen. Maar in dit project is ons doel om Peer-to-Peer-communicatie tussen twee Raspberry Pi-modules of tussen een Raspberry Pi en een Arduino te doen. Dus besloot ik om het pyLoRa-pakket te gebruiken. Het heeft een rpsreal LoRa Arduino en rpsreal LoRa Raspberry pi-modules die kunnen worden gebruikt op de Arduino en de Raspberry Pi-omgeving. Laten we ons voorlopig concentreren op de Raspberry Pi-omgeving.
Configuratie van de Raspberry Pi voor LoRa-module
Zoals eerder verteld werkt de LoRa-module met SPI-communicatie, dus we moeten SPI op Pi inschakelen en vervolgens het pylora- pakket installeren. Volg de onderstaande stappen om hetzelfde te doen, na het openen van het terminalvenster van Pi. Nogmaals, ik gebruik stopverf om verbinding te maken met mijn Pi, je kunt je handige methode gebruiken.
Stap 1: Ga naar het configuratievenster met de volgende opdracht. Om het onderstaande venster te krijgen
sudo raspi-config
Stap 2: Navigeer naar interface-opties en schakel SPI in zoals weergegeven in de onderstaande afbeelding. We moeten de SPI-interface inschakelen omdat, zoals we hebben besproken, de LCD en PI communiceren via het SPI-protocol
Stap 3: Sla de wijzigingen op en ga terug naar het terminalvenster. Zorg ervoor dat pip en python zijn bijgewerkt en installeer vervolgens het RPi.GPIO- pakket met behulp van de volgende opdracht.
pip installeer RPi.GPIO
Deze pakketklasse helpt ons de GPIO-pin op de Pi te besturen. Als het succesvol is geïnstalleerd, ziet uw scherm er als volgt uit
Stap 4: Ga op dezelfde manier verder met het installeren van het spidev- pakket met behulp van de volgende opdracht. Spidev is een python-binding voor Linux die kan worden gebruikt om SPI-communicatie op Raspberry Pi uit te voeren.
pip spidev installeren
Als de installatie succesvol is, zou de terminal er als volgt uit moeten zien.
Stap 5: Laten we vervolgens het pyLoRa-pakket installeren met behulp van de volgende pip-opdracht. Dit pakket installeert de radiomodellen die zijn gekoppeld aan LoRa.
pip pyLoRa installeren
Als de installatie is gelukt, ziet u het volgende scherm.
Het PyLoRa-pakket ondersteunt ook gecodeerde communicatie die naadloos kan worden gebruikt met Arduino en Raspberry Pi. Dit zal de gegevensbeveiliging in uw communicatie verbeteren. Maar u moet na deze stap een afzonderlijk pakket installeren, wat ik niet doe, aangezien codering niet binnen het bestek van deze zelfstudie valt. U kunt de bovenstaande github-links volgen voor meer informatie.
Na deze stap kun je de pakketpadinformatie toevoegen aan pi en het proberen met het python-programma dat aan het einde wordt gegeven. Maar ik kon het pad niet met succes toevoegen en moest daarom de bibliotheek handmatig downloaden en deze rechtstreeks voor mijn programma's gebruiken. Dus ik moest doorgaan met de volgende stappen
Stap 6: Download en installeer het python-rpi.gpio-pakket en het spidev-pakket met behulp van de onderstaande opdracht.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Het terminalvenster zou zoiets als dit moeten weergeven na beide installaties.
Stap 7: Installeer ook git en gebruik het vervolgens om de python-map voor onze Raspberry Pi te klonen. U kunt dat doen met de volgende opdrachten.
sudo apt-get install git sudo git clone
Zodra deze stap is voltooid , zou u de submap SX127x in de thuismap van Raspberry Pi moeten vinden. Dit heeft alle vereiste bestanden die aan de bibliotheek zijn gekoppeld.
Raspberry Pi programmeren voor LoRa
In een peer-to-peer LoRa-communicatie wordt de module die de informatie verzendt een server genoemd en de module die de informatie ontvangt een client. In de meeste gevallen wordt de Arduino in het veld gebruikt met een sensor om data te meten en wordt de Pi gebruikt om deze data te ontvangen. Dus besloot ik om de Raspberry Pi als client en de Arduino als server te gebruiken in deze tutorial. Het complete Raspberry Pi-clientprogramma vindt u onderaan deze pagina. Hier zal ik proberen de belangrijke regels in het programma uit te leggen.
Let op: Zorg ervoor dat het programmabestand zich in dezelfde map bevindt als de bibliotheekmap SX127x. U kunt deze map kopiëren en overal gebruiken als u het project wilt porten.
Het programma is vrij eenvoudig, we moeten de LoRa-module instellen om in 433Mhz te werken en vervolgens naar inkomende pakketten te luisteren. Als we iets ontvangen, drukken we het eenvoudig af op de console. Zoals altijd beginnen we het programma door de vereiste python-bibliotheken te importeren.
vanaf tijd import slaap vanuit SX127x.LoRa import * vanuit SX127x.board_config import BOARD BOARD.setup ()
In dit geval wordt het tijdpakket gebruikt om vertragingen te creëren, het Lora-pakket wordt gebruikt voor LoRa-communicatie en de board_config wordt gebruikt om de board- en LoRa-parameters in te stellen. We hebben ook het bord ingesteld met de functie BOARD.setup () .
Vervolgens maken we de python LoRa-klasse met drie definities. Omdat we alleen inspringen om het programma te laten werken als een Raspberry-client, heeft de klasse slechts drie functies, namelijk de klasse init, startklasse en on_rx_done . De init-klasse initialiseert de LoRa-module in 433 MHz met een bandbreedte van 125 kHz, zoals ingesteld in de set_pa_config- methode. Vervolgens wordt de module ook in de slaapstand gezet om stroom te besparen.
# Medium Range Defaults na init zijn 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 chips / symbol, CRC op 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
De startfunctie is waar we de module configureren als ontvanger en verkrijgen zoals RSSI (ontvangstsignaalsterkte-indicator), status, werkfrequentie enz. We hebben de module ingesteld om te werken in continue ontvangermodus (RXCONT) vanuit slaapmodus en gebruiken vervolgens een while-lus om waarden zoals RSSI en modemstatus te lezen. We spoelen ook de gegevens in de seriële buffer naar de terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Ten slotte wordt de functie on_rx_done uitgevoerd nadat het inkomende pakket is gelezen. In deze functie worden de ontvangen waarden verplaatst naar een variabele genaamd payload vanuit de Rx-buffer nadat de ontvangende vlag hoog is ingesteld. Vervolgens worden de ontvangen waarden gedecodeerd met utf-8 om door de gebruiker leesbare gegevens op de shell af te drukken. We zetten de module ook weer in de slaapstand totdat een andere waarde wordt ontvangen.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'negeren')) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Het resterende deel van het programma is om de ontvangen waarden op de console af te drukken en het programma te beëindigen met een toetsenbordonderbreking. We zetten het bord opnieuw in de slaapstand, zelfs na beëindiging van het programma om stroom te besparen.
probeer: lora.start () behalve KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") tot slot: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino-code voor LoRa om te communiceren met Raspberry Pi
Zoals ik eerder al zei , ondersteunt de rpsreal- code zowel Arduino als Pi en daarom is communicatie tussen Arduino en Pi mogelijk. Het werkt op basis van de Radiohead Library van AirSpayce's. U moet dus eerst de radiokopbibliotheek op uw Arduino IDE installeren.
Ga hiervoor naar de Github-pagina en download de bibliotheek in de ZIP-map. Plaats het vervolgens in de bibliotheekmap van uw Arduino IDE. Start nu de Arduino IDE opnieuw en u zult voorbeeldbestanden vinden voor de radiokopbibliotheek. Hier zullen we de Arduino programmeren om te werken als een LoRa-server om testpakketten zoals 0 tot 9 te verzenden. De complete code om hetzelfde te doen is zoals altijd onder aan deze pagina te vinden. Hier zal ik enkele belangrijke regels in het programma uitleggen.
We beginnen het programma door de SPI-bibliotheek (standaard geïnstalleerd) te importeren om het SPI-protocol te gebruiken en vervolgens de RH_RF95-bibliotheek van de radiokop om LoRa-communicatie uit te voeren. Vervolgens bepalen we op welke pin van Arduino we de Chip select (CS), Reset (RST) en Interrupt (INT) pin van de LoRa met Arduino hebben aangesloten. Ten slotte definiëren we ook dat de module moet werken in 434 MHz-frequentie en initialiseren we de LoRa-module.
# omvatten
Binnen de setup- functie zullen we de LoRa-module resetten door de reset-pin 10 milli seconde naar laag te trekken om opnieuw te beginnen. Vervolgens initialiseren we het met de module die we eerder hebben gemaakt met behulp van de Radio Head-bibliotheek. Vervolgens stellen we de frequentie en het zendvermogen in voor de LoRa-server. Hoe hoger de transmissie, hoe groter de afstand die uw pakketten zullen afleggen, maar ze zullen meer stroom verbruiken.
void setup () { // Initialize Serial Monitor Serial.begin (9600); // Reset LoRa Module pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); vertraging (10); digitalWrite (RFM95_RST, HIGH); vertraging (10); // Initialiseer LoRa-module terwijl (! Rf95.init ()) { Serial.println ("LoRa-radio-initialisering mislukt"); terwijl (1); } // Stel de standaardfrequentie 434,0 MHz in als (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); terwijl (1); } rf95.setTxPower (18); // Zendvermogen van de Lora-module }
Binnen de oneindige lusfunctie hoeven we het datapakket eenvoudig via de LoRa-module te verzenden. Deze gegevens kunnen zoiets zijn als de sensorwaarde van de gebruikersopdracht. Maar voor de eenvoud sturen we de char-waarde 0 tot 9 voor elk interval van 1 seconde en initialiseren de waarde vervolgens terug naar 0 nadat we 9 hebben bereikt. Merk op dat de waarden alleen in een char-array-indeling kunnen worden verzonden en het type gegevens moet unit8_t zijn dat is 1 byte per keer. De code om hetzelfde te doen, wordt hieronder weergegeven
void loop () { Serial.print ("Verzenden:"); char radiopacket = char (waarde)}; rf95.send ((uint8_t *) radiopacket, 1); vertraging (1000); waarde ++; if (waarde> '9') waarde = 48; }
LoRa-communicatie tussen Raspberry Pi en Arduino testen
Nu we zowel onze hardware als het programma klaar hebben, hoeven we alleen maar de Arduino-code te uploaden naar het UNO-bord en de python-sketch moet op pi worden gestart. Mijn testopstelling met beide aangesloten hardware ziet er hieronder ongeveer zo uit
Zodra de python-clientschets is gestart op de Pi (gebruik alleen python 3) en als alles goed werkt, zou je de Arduino-pakketten moeten zien die in pi zijn ontvangen via het shell-venster. U zou "Ontvangen: 0" tot 9 moeten opmerken, zoals weergegeven in de onderstaande afbeelding.
De volledige Raspberry pi-code met alle vereiste bibliotheken kan hier worden gedownload.
U kunt nu de Arduino-server verplaatsen en het bereik van de module controleren; het is ook mogelijk om indien nodig de RSSI-waarde op de shell weer te geven. De volledige werking van het project is te vinden in de onderstaande video. Nu we weten hoe we LoRa-communicatie over lange afstanden met laag vermogen tussen Arduino en Raspberry pi tot stand kunnen brengen, kunnen we doorgaan met het toevoegen van een sensor aan de Arduino-kant en een cloudplatform aan de Pi-kant om een compleet IoT-pakket te maken.
Ik hoop dat je het project hebt begrepen en met plezier hebt gebouwd. Als je problemen hebt om het te laten werken, gebruik dan de commentaarsectie hieronder of de forums voor andere technische katernen.