Inhoudsopgave:
- Benodigdheden
- Stap 1: Bibliotheek
- Stap 2: Pinout
- Stap 3: AUX-pin
- Stap 4: Volledig verbonden schema Esp8266
- Stap 5: Volledig verbonden Schema Arduino
- Stap 6: Bibliotheek: Constructor
- Stap 7: Begin
- Stap 8: Configuratie- en informatiemethode
- Stap 9: Responscontainer
- Stap 10: Basisconfiguratieoptie
- Stap 11: Bericht ontvangen verzenden
- Stap 12: Normale verzendmodus
- Stap 13: Structuur beheren
- Stap 14: Vaste modus in plaats van normale modus
- Stap 15: Bedankt
Video: LoRa 3 km tot 8 km draadloze communicatie met goedkope E32 (sx1278 / sx1276) apparaat voor Arduino, Esp8266 of Esp32 - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:14
Ik maak een bibliotheek om EBYTE E32 te beheren op basis van de Semtech-serie van LoRa-apparaten, een zeer krachtig, eenvoudig en goedkoop apparaat.
U vindt de 3Km-versie hier, de 8Km-versie hier
Ze kunnen werken over een afstand van 3000 m tot 8000 m, en ze hebben veel functies en parameters. Dus ik maak deze bibliotheek om het gebruik te vereenvoudigen.
Het is een oplossing om data op te halen uit grootstedelijke sensoren of om drones te besturen.
Benodigdheden
Arduino UNO
Wemos D1 mini
LoRa E32 TTL 100 3Km-versie
LoRa E32 TTL 1W 8Km versie
Stap 1: Bibliotheek
Mijn bibliotheek vind je hier.
Downloaden.
Klik op de DOWNLOADS-knop in de rechterbovenhoek, hernoem de niet-gecomprimeerde map LoRa_E32.
Controleer of de map LoRa_E32 LoRa_E32.cpp en LoRa_E32.h bevat.
Plaats de LoRa_E32 bibliotheekmap in uw /libraries/ map. Mogelijk moet u de submap bibliotheken maken als dit uw eerste bibliotheek is.
Start de IDE opnieuw.
Stap 2: Pinout
Zoals je kunt zien, kun je verschillende modi instellen via M0- en M1-pinnen.
Er zijn enkele pinnen die op een statische manier kunnen worden gebruikt, maar als je het op de microcontroller aansluit en ze in de bibliotheek configureert, krijg je betere prestaties en kun je alle modi via software besturen, maar we gaan het hierna beter uitleggen.
Stap 3: AUX-pin
Zoals ik al zei Het is niet belangrijk om alle pinnen op de uitgang van de microcontroller aan te sluiten, je kunt de M0- en M1-pinnen op HOOG of LAAG zetten om de gewenste configuratie te krijgen, en als je geen AUX aansluit, stelt de bibliotheek een redelijke vertraging in om zeker te zijn dat de operatie is voltooid.
AUX-pin
Bij het verzenden van gegevens kan worden gebruikt om de externe MCU te wekken en HOOG terug te geven bij het voltooien van de gegevensoverdracht.
Wanneer AUX wordt ontvangen, wordt het LAAG en wordt het HOOG geretourneerd wanneer de buffer leeg is.
Het wordt ook gebruikt voor zelfcontrole om de normale werking te herstellen (bij inschakelen en slaap-/programmamodus).
Stap 4: Volledig verbonden schema Esp8266
esp8266-verbindingsschema is eenvoudiger omdat het werkt op hetzelfde voltage van logische communicatie (3.3v).
Het is belangrijk om een pull-up weerstand (4, 7Kohm) toe te voegen om een goede stabiliteit te krijgen.
Stap 5: Volledig verbonden Schema Arduino
Arduino-werkspanning is 5v, dus we moeten een spanningsdeler toevoegen op RX-pin M0 en M1 van de LoRa-module om schade te voorkomen, u kunt hier meer informatie krijgen Spanningsdeler: rekenmachine en applicatie.
U kunt een weerstand van 2Kohm naar GND en 1Kohm van het signaal gebruiken dan samen te voegen op RX.
Stap 6: Bibliotheek: Constructor
Ik heb een reeks van vrij veel constructeurs gemaakt, omdat we meer opties en situaties kunnen beheren.
LoRa_E32 (byte rxPin, byte txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (byte rxPin, byte txPin, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (byte rxPin, byte txPin, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
De eerste set constructors is gemaakt om het beheer van seriële en andere pinnen aan de bibliotheek te delegeren.
rxPin en txPin is de pin om verbinding te maken met UART en ze zijn verplicht.
auxPin is een pin die de werking, verzending en ontvangststatus controleert (we gaan het hierna beter uitleggen), die pin Het is niet verplicht, als je het niet instelt, pas ik een vertraging toe om de bewerking zichzelf te laten voltooien (met latentie).
m0pin en m1Pin zijn de pinnen om de bedieningsmodus te wijzigen (zie de tabel hierboven), ik denk dat deze pinnen in "productie" direct HOOG of LAAG gaan verbinden, maar voor de test kunnen ze handig worden beheerd door de bibliotheek.
bpsRate is de boudrate van SoftwareSerial is normaal gesproken 9600 (de enige baudrate in programmeer-/slaapmodus)
Een eenvoudig voorbeeld is:
#include "LoRa_E32.h"LoRa_E32 e32ttl100(2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX
We kunnen een SoftwareSerial direct gebruiken met een andere constructor
LoRa_E32 (HardwareSerial* serieel, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* serieel, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* serieel, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Het voorbeeldbovenwerk met deze constructor kan zo zijn.
#include #include "LoRa_E32.h"
SoftwareSerial mySerial(2, 3); // RX, TX
LoRa_E32 e32ttl100(&mySerial);
// LoRa_E32 e32ttl100(&mySerial, 5, 7, 6);
De laatste set constructor is om het gebruik van een HardwareSerial in plaats van SoftwareSerial toe te staan.
LoRa_E32 (SoftwareSerial* serieel, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* serieel, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* serieel, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Stap 7: Begin
Het begin-commando wordt gebruikt om Serial en pinnen op te starten in invoer- en uitvoermodus.
ongeldig begin();
in uitvoering is
// Start alle pinnen en UART. op
e32ttl100.begin();
Stap 8: Configuratie- en informatiemethode
Er is een reeks methoden voor het beheren van de configuratie en het verkrijgen van informatie over het apparaat.
ResponseStructContainer getConfiguration();
ResponseStatus setConfiguration (configuratieconfiguratie, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
ResponseStructContainer getModuleInformation();
void printParameters (struct Configuratieconfiguratie);
ResponseStatus resetModule();
Stap 9: Responscontainer
Om het beheer van reacties te vereenvoudigen, maak ik een set containers, voor mij erg handig om fouten te beheren en generieke gegevens terug te sturen.
Reactiestatus
Dit is een statuscontainer en heeft 2 eenvoudige toegangspunten, hiermee kunt u de statuscode en de beschrijving van de statuscode krijgen
Serial.println(c.getResponseDescription()); // Beschrijving van code
Seriële.println(c.code); // 1 als Succes
De code is:
SUCCES = 1, ERR_UNKNOWN, ERR_NOT_SUPPORT, ERR_NOT_IMPLEMENT, ERR_NOT_INITIAL, ERR_INVALID_PARAM, ERR_DATA_SIZE_NOT_MATCH, ERR_BUF_TOO_SMALL, ERR_TIMEOUT, ERR_HARDWARE, ERR_HEAD_NOT_RECOGNIZED
ReactieContainer
Deze container is gemaakt om String-respons te beheren en heeft 2 toegangspunten.
gegevens met de tekenreeks die is geretourneerd door het bericht en de status een instantie van RepsonseStatus.
ResponseContainer rs = e32ttl.receiveMessage();
String bericht = rs.data;
Serial.println(rs.status.getResponseDescription());
Serial.println(bericht);
ResponseStructContainer
Dit is de meer "complexe" container, ik gebruik deze om de structuur te beheren. Het heeft hetzelfde toegangspunt als ResponseContainer, maar gegevens zijn een lege aanwijzer om een complexe structuur te beheren.
ResponseStructContainer c;
c = e32ttl100.getConfiguration();// Het is belangrijk om de configuratieaanwijzer op te halen vóór alle andere bewerkingen
Configuratie configuratie = *(Configuratie*) c.data;
Serial.println(c.status.getResponseDescription());
Serial.println(c.status.code);
getConfiguration en setConfiguration
De eerste methode is getConfiguration, u kunt het gebruiken om alle gegevens op te halen die op het apparaat zijn opgeslagen.
ResponseStructContainer getConfiguration();
Hier een gebruiksvoorbeeld.
ResponseStructContainer c;
c = e32ttl100.getConfiguration();// Het is belangrijk om de configuratieaanwijzer op te halen vóór alle andere bewerkingen
Configuratie configuratie = *(Configuratie*) c.data;
Serial.println(c.status.getResponseDescription());
Serial.println(c.status.code);
Serial.println(configuratie. SPED.getUARTBaudRate());
Configuratiestructuur heeft alle gegevens van instellingen en ik voeg een reeks functies toe om alle beschrijvingen van afzonderlijke gegevens te krijgen.
configuratie. ADDL = 0x0; // Eerste deel van adresconfiguratie. ADDH = 0x1; // Tweede deel van adresconfiguratie. CHAN = 0x19;// Kanaalconfiguratie. OPTION.fec = FEC_0_OFF; // Forward error correction switch configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Configuratie transmissiemodus. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up-beheerconfiguratie. OPTION.transmissionPower = POWER_17; // dBm zendvermogen configuratie. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Wachttijd voor ontwaakconfiguratie. SPED.airDataRate = AIR_DATA_RATE_011_48; // Configuratie luchtgegevenssnelheid. SPED.uartBaudRate = UART_BPS_115200; // Configuratie baudrate communicatie. SPED.uartParity = MODE_00_8N1; // Pariteitsbit
U hebt de equivalente functie voor alle attributen om alle beschrijvingen te krijgen:
Serial.print(F("Chan: ")); Serial.print (configuratie. CHAN, DEC); Serieel.print(" -> "); Serial.println(configuratie.getChannelDescription());Serial.println(F(" ")); Serial.print(F("SpeedParityBit: ")); Serial.print(configuratie. SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuratie. SPED.getUARTParityDescription()); Serial.print(F("SpeedUARTDatte: ")); Serial.print(configuratie. SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuratie. SPED.getUARTBaudRate()); Serial.print(F("SpeedAirDataRate: ")); Serial.print(configuratie. SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuratie. SPED.getAirDataRate()); Serial.print(F("OptionTrans: ")); Serial.print(configuratie. OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuratie. OPTION.getFixedTransmissionDescription()); Serial.print(F("OptionPullup: ")); Serial.print(configuratie. OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuratie. OPTION.getIODroveModeDescription()); Serial.print(F("OptionWakeup: ")); Serial.print(configuratie. OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuratie. OPTION.getWirelessWakeUPTimeDescription()); Serial.print(F("OptionFEC: ")); Serial.print(configuratie. OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuratie. OPTION.getFECDescription()); Serial.print(F("OptionPower: ")); Serial.print(configuratie. OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuratie. OPTION.getTransmissionPowerDescription());
Op dezelfde manier wil setConfiguration een configuratiestructuur, dus ik denk dat de betere manier om de configuratie te beheren is om de huidige op te halen, de enige wijziging toe te passen die je nodig hebt en deze opnieuw in te stellen.
ResponseStatus setConfiguration (configuratieconfiguratie, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
configuratie is de structuur die eerder wordt getoond, saveType staat u toe om te kiezen of de wijziging permanent wordt alleen voor de huidige sessie.
ResponseStructContainer c;c = e32ttl100.getConfiguration(); // Het is belangrijk om de configuratieaanwijzer te krijgen vóór alle andere bewerkingen Configuratieconfiguratie = *(Configuratie*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters (configuratie); configuratie. ADDL = 0x0; configuratie. ADDH = 0x1; configuratie. CHAN = 0x19; configuratie. OPTION.fec = FEC_0_OFF; configuratie. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; configuratie. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; configuratie. OPTION.transmissionPower = POWER_17; configuratie. OPTION.wirelessWakeupTime = WAKE_UP_1250; configuratie. SPED.airDataRate = AIR_DATA_RATE_011_48; configuratie. SPED.uartBaudRate = UART_BPS_115200; configuratie. SPED.uartParity = MODE_00_8N1; // Configuratie gewijzigd en ingesteld om de configuratie niet vast te houden ResponseStatus rs = e32ttl100.setConfiguration (configuratie, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serieel.println(rs.code); printParameters (configuratie);
De parameters worden allemaal als constant beheerd:
Stap 10: Basisconfiguratieoptie
Stap 11: Bericht ontvangen verzenden
Eerst moeten we een eenvoudige maar bruikbare methode introduceren om te controleren of er iets in de ontvangende buffer zit
int beschikbaar();
Het geeft gewoon terug hoeveel bytes je in de huidige stream hebt.
Stap 12: Normale verzendmodus
De normale/transparante transmissiemodus wordt gebruikt om berichten naar alle apparaten met hetzelfde adres en kanaal te verzenden.
Er zijn veel manieren om berichten te verzenden / ontvangen, we gaan het in detail uitleggen:
ResponseStatus sendMessage (const String-bericht);
ResponseContainer ReceiveMessage();
De eerste methode is sendMessage en wordt gebruikt om een string naar een apparaat te sturen in de normale modus.
ResponseStatus rs = e32ttl.sendMessage("Prova");Serial.println(rs.getResponseDescription());
Het andere apparaat doet het gewoon op de lus
if (e32ttl.available() > 1){ResponseContainer rs = e32ttl.receiveMessage(); String bericht = rs.data; // Haal voor het eerst de gegevens op Serial.println(rs.status.getResponseDescription()); Serial.println(bericht); }
Stap 13: Structuur beheren
Als u een complexe structuur wilt verzenden, kunt u deze methode gebruiken
ResponseStatus sendMessage(const void *message, const uint8_t size);ResponseStructContainer receiverMessage(const uint8_t size);
Het wordt gebruikt om strucutre te verzenden, bijvoorbeeld:
struct Messaggione {char type [5]; char bericht[8]; bool-mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage(&messaggione, sizeof(Messaggione)); Serial.println(rs.getResponseDescription());
en aan de andere kant kun je het bericht dus ontvangen
ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Messaggione));struct Messaggione messaggione = *(Messaggione*) rsc.data; Serial.println(messaggione.message); Serial.println(messaggione.mitico);
Lees gedeeltelijke structuur
Als u het eerste deel van het bericht wilt lezen om meer soorten structuren te beheren, kunt u deze methode gebruiken.
ResponseContainer ReceiveInitialMessage (const uint8_t size);
Ik creëer het om een string met type of iets anders te ontvangen om de te laden structuur te identificeren.
struct Messaggione { // Gedeeltelijke structuur zonder typechar-bericht [8]; bool-mitico; }; tekentype [5]; // eerste deel van de structuur ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type)); // Zet string in een char array (niet nodig) memcpy (type, rs.data.c_str(), sizeof(type)); Serial.println("LEES TYPE: "); Serial.println(rs.status.getResponseDescription()); Serieel.println(type); // Lees de rest van de structuur ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Messaggione)); struct Messaggione messaggione = *(Messaggione*) rsc.data;
Stap 14: Vaste modus in plaats van normale modus
Op dezelfde manier creëer ik een set methoden om te gebruiken met vaste transmissie
Vaste transmissie
U hoeft alleen de verzendmethode te wijzigen, omdat het bestemmingsapparaat de preambule met Address en Channel quando settato il fixed mode niet ontvangt.
Dus voor String-bericht heb je
ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String bericht);ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String bericht);
en voor structuur heb je
ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *message, const uint8_t size);ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *message, const uint8_t size);
Hier een eenvoudig voorbeeld
ResponseStatus rs = e32ttl.sendFixedMessage(0, 0, 0x17, &messaggione, sizeof(Messaggione));// ResponseStatus rs = e32ttl.sendFixedMessage(0, 0, 0x17, "Ciao");
Vaste verzending heeft meer scenario's
Als u naar een specifiek apparaat verzendt (tweede scenario's Vaste verzending), moet u ADDL, ADDH en CHAN toevoegen om het rechtstreeks te identificeren.
ResponseStatus rs = e32ttl.sendFixedMessage(2, 2, 0x17, "Bericht naar een apparaat");
Als u een bericht naar alle apparaten in een bepaald kanaal wilt sturen, kunt u deze methode gebruiken.
ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Bericht aan een apparaat van een kanaal");
Als u alle broadcastberichten in het netwerk wilt ontvangen, moet u uw ADDH en ADDL instellen op BROADCAST_ADDRESS.
ResponseStructContainer c;c = e32ttl100.getConfiguration(); // Het is belangrijk om de configuratieaanwijzer te krijgen vóór alle andere bewerkingen Configuratieconfiguratie = *(Configuratie*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters (configuratie); configuratie. ADDL = BROADCAST_ADDRESS; configuratie. ADDH = BROADCAST_ADDRESS; // Configuratie gewijzigd en ingesteld om de configuratie niet vast te houden ResponseStatus rs = e32ttl100.setConfiguration (configuratie, WRITE_CFG_PWR_DWN_LOSE); Serial.println(rs.getResponseDescription()); Serieel.println(rs.code); printParameters (configuratie);
Stap 15: Bedankt
Nu heb je alle informatie om je werk te doen, maar ik denk dat het belangrijk is om enkele realistische voorbeelden te laten zien om alle mogelijkheden beter te begrijpen.
- LoRa E32-apparaat voor Arduino, esp32 of esp8266: instellingen en basisgebruik
- LoRa E32-apparaat voor Arduino, esp32 of esp8266: bibliotheek
- LoRa E32-apparaat voor Arduino, esp32 of esp8266: configuratie
- LoRa E32-apparaat voor Arduino, esp32 of esp8266: vaste transmissie
- LoRa E32-apparaat voor Arduino, esp32 of esp8266: energiebesparing en het verzenden van gestructureerde gegevens
Aanbevolen:
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
ESP32 met E32-433T LoRa-module zelfstudie - LoRa Arduino-interface: 8 stappen
ESP32 met E32-433T LoRa-module zelfstudie | LoRa Arduino-interface: Hé, wat is er, jongens! Akarsh hier van CETech. Dit project van mij is een interface met de E32 LoRa-module van eByte, een krachtige 1-watt transceivermodule met een ESP32 met behulp van Arduino IDE. We begrepen de werking van de E32 in onze laatste tutorial
Draadloze communicatie met behulp van goedkope 433MHz RF-modules en Pic-microcontrollers. Deel 2: 4 stappen (met afbeeldingen)
Draadloze communicatie met behulp van goedkope 433MHz RF-modules en Pic-microcontrollers. Deel 2: In het eerste deel van deze instructable demonstreerde ik hoe je een PIC12F1822 programmeert met behulp van MPLAB IDE en XC8-compiler, om een eenvoudige string draadloos te verzenden met goedkope TX/RX 433MHz-modules. De ontvangermodule was via een USB aangesloten op UART TTL kabel advertentie
Draadloze seriële communicatie met Bluefruit: 4 stappen
Draadloze seriële communicatie met Bluefruit: Hier is een eenvoudige stapsgewijze handleiding om uw draden te vervangen door een Bluetooth low energy-verbinding: het kostte me een tijdje om dit uit te zoeken omdat er nauwelijks documentatie is om dit te doen met moderne Bluetooth low energy-technologie zoals als de Bluefrui
Bedien tot 4 servo's met een smartphone of een ander apparaat met een audio-uitgang: 3 stappen
Bedien tot 4 servo's met behulp van een smartphone of elk apparaat met een audio-uitgang: hier presenteer ik een eenvoudige elektronische montage om maximaal vier servo's te besturen met elk apparaat dat een audiobestand kan lezen