Kazalo:
- Zaloge
- 1. korak: Knjižnica
- 2. korak: Pinout
- 3. korak: AUX Pin
- 4. korak: Popolnoma povezana shema Esp8266
- 5. korak: Popolnoma povezana shema Arduino
- 6. korak: Knjižnica: Konstruktor
- 7. korak: Začnite
- 8. korak: Konfiguracija in informacijska metoda
- 9. korak: Posoda za odzive
- 10. korak: Možnost osnovne konfiguracije
- Korak: Pošljite sporočilo o prejemu
- Korak: Običajen način prenosa
- Korak: Upravljajte strukturo
- Korak 14: Fiksni način namesto običajnega
- Korak 15: Hvala
Video: Brezžična komunikacija LoRa od 3 do 8 km z nizkocenovno napravo E32 (sx1278/sx1276) za Arduino, Esp8266 ali Esp32: 15 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:02
Ustvarjam knjižnico za upravljanje EBYTE E32 na podlagi Semtech serije naprav LoRa, zelo zmogljive, preproste in poceni naprave.
Različico 3 km lahko najdete tukaj, različico 8 km pa tukaj
Delajo lahko na razdalji od 3000m do 8000m in imajo veliko funkcij in parametrov. Zato ustvarim to knjižnico, da poenostavim uporabo.
To je rešitev za pridobivanje podatkov iz metropolitanskih senzorjev ali za upravljanje brezpilotnih letal.
Zaloge
Arduino UNO
Wemos D1 mini
LoRa E32 TTL 100 3 km različica
Različica LoRa E32 TTL 1W 8Km
1. korak: Knjižnica
Mojo knjižnico najdete tukaj.
Prenesti.
Kliknite gumb DOWNLOADS v zgornjem desnem kotu in preimenujte nestisnjeno mapo LoRa_E32.
Preverite, ali mapa LoRa_E32 vsebuje LoRa_E32.cpp in LoRa_E32.h.
Mapo knjižnice LoRa_E32 postavite v mapo / libraries /. Morda boste morali ustvariti podmapo knjižnice, če je to vaša prva knjižnica.
Znova zaženite IDE.
2. korak: Pinout
Kot lahko vidite, lahko prek zatičev M0 in M1 nastavite različne načine.
Obstaja nekaj zatičev, ki jih je mogoče uporabiti na statičen način, če pa ga povežete z mikrokrmilnikom in jih konfigurirate v knjižnici, boste pridobili na zmogljivosti in lahko nadzirate ves način prek programske opreme, vendar bomo naslednjič bolje razložili.
3. korak: AUX Pin
Kot sem že rekel, ni pomembno, da vse izhode povežete z izhodom mikrokrmilnika, da lahko zatiče M0 in M1 nastavite na VISOKO ali NIZKO, da dobite želeno konfiguracijo, in če ne povežete AUX, knjižnica nastavi razumno zamudo, da se prepričate da je operacija končana.
AUX pin
Pri prenosu podatkov se lahko uporabi za prebujanje zunanjega MCU in vrnitev HIGH na koncu prenosa podatkov.
Pri prejemu AUX gre NIZKO in se vrne VELIKO, ko je medpomnilnik prazen.
Uporablja se tudi za samopreverjanje za obnovitev normalnega delovanja (ob vklopu in načinu mirovanja/programa).
4. korak: Popolnoma povezana shema Esp8266
Shema povezave esp8266 je enostavnejša, ker deluje pri isti napetosti logičnih komunikacij (3,3 V).
Za dobro stabilnost je pomembno, da dodate vlečni upor (4, 7Kohm).
5. korak: Popolnoma povezana shema Arduino
Delovna napetost Arduino je 5V, zato moramo na RX pin M0 in M1 modula LoRa dodati delilnik napetosti, da preprečimo poškodbe. Več informacij lahko dobite tukaj Delilnik napetosti: kalkulator in aplikacija.
Lahko uporabite 2Kohm upor za GND in 1Kohm od signala kot skupaj na RX.
6. korak: Knjižnica: Konstruktor
Naredil sem nabor precej številnih konstruktorjev, saj imamo lahko več možnosti in situacij za upravljanje.
LoRa_E32 (bajt rxPin, bajt txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (bajt rxPin, bajt txPin, bajt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (bajt rxPin, bajt txPin, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Ustvarjen je prvi niz konstruktorjev, ki prenesejo upravljanje serijskih in drugih zatičev v knjižnico.
rxPin in txPin sta pin za povezavo z UART in sta obvezna.
auxPin je pin, ki preverja stanje delovanja, prenosa in sprejemanja (v nadaljevanju bomo bolje razložili), ta pin Ni obvezen, če ga ne nastavite, uporabim zakasnitev, da se operacija lahko zaključi (z zakasnitvijo).
m0pin in m1Pin sta nožici za spremembo NAČINA delovanja (glej zgornjo tabelo), mislim, da se bodo ti zatiči v "produkciji" povezali neposredno VISOKO ali NIZKO, vendar jih za preizkus koristno upravlja knjižnica.
bpsRate je pretok SoftwareSerial običajno 9600 (edina hitrost prenosa v načinu programmin/sleep)
Preprost primer je
#include "LoRa_E32.h" LoRa_E32 e32ttl100 (2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX
SoftwareSerial lahko uporabimo neposredno z drugim konstruktorjem
LoRa_E32 (HardwareSerial* serijski, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* serijski, bajt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* serijski, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
Primer zgornjega dela s tem konstruktorjem lahko naredite tako.
#include #include "LoRa_E32.h"
SoftwareSerial mySerial (2, 3); // RX, TX
LoRa_E32 e32ttl100 (& mySerial);
// LoRa_E32 e32ttl100 (& mySerial, 5, 7, 6);
Zadnji niz konstruktorjev dovoljuje uporabo HardwareSerial namesto SoftwareSerial.
LoRa_E32 (SoftwareSerial* serijski, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* serijski, bajt auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* serijski, bajt auxPin, bajt m0Pin, bajt m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
7. korak: Začnite
Ukaz begin se uporablja za zagon zaporedja in zatičev v načinu vnosa in izhoda.
void begin ();
v izvedbi je
// Zagon vseh zatičev in UART
e32ttl100.begin ();
8. korak: Konfiguracija in informacijska metoda
Obstaja nabor metod za upravljanje konfiguracije in pridobivanje informacij o napravi.
ResponseStructContainer getConfiguration ();
ResponseStatus setConfiguration (konfiguracija konfiguracije, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
ResponseStructContainer getModuleInformation ();
void printParameters (konfiguracija konfiguracije strukture);
ResponseStatus resetModule ();
9. korak: Posoda za odzive
Za poenostavitev upravljanja odziva ustvarim nabor vsebnikov, ki so zame zelo koristni za upravljanje napak in vračanje splošnih podatkov.
ResponseStatus
To je vsebnik stanja in ima 2 preprosti vstopni točki, s tem lahko dobite kodo stanja in opis kode stanja
Serial.println (c.getResponseDescription ()); // Opis kode
Serial.println (c.koda); // 1 če uspeh
Koda je
USPEH = 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
ResponseContainer
Ta vsebnik je ustvarjen za upravljanje odziva String in ima 2 vstopni točki.
podatki z nizom, vrnjenim iz sporočila, in status primerek RepsonseStatus.
ResponseContainer rs = e32ttl.receiveMessage ();
Niz sporočilo = rs.data;
Serial.println (rs.status.getResponseDescription ());
Serial.println (sporočilo);
ResponseStructContainer
To je bolj "zapleten" vsebnik, ki ga uporabljam za upravljanje strukture, ima isto vstopno točko ResponseContainer, vendar so podatki prazni kazalec za upravljanje kompleksne strukture.
ResponseStructContainer c;
c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami
Konfiguracija konfiguracije = *(Konfiguracija *) c.data;
Serial.println (c.status.getResponseDescription ());
Serial.println (c.status.code);
getConfiguration in setConfiguration
Prvi način je getConfiguration, z njim lahko znova naložite vse podatke, shranjene v napravi.
ResponseStructContainer getConfiguration ();
Tukaj je primer uporabe.
ResponseStructContainer c;
c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami
Konfiguracija konfiguracije = *(Konfiguracija *) c.data;
Serial.println (c.status.getResponseDescription ());
Serial.println (c.status.code);
Serial.println (configuration. SPED.getUARTBaudRate ());
Struktura konfiguracije ima vse podatke o nastavitvah in dodam vrsto funkcij, da dobim ves opis posameznih podatkov.
konfiguracija. ADDL = 0x0; // Prvi del addressconfiguration. ADDH = 0x1; // Drugi del konfiguracije naslova. CHAN = 0x19; // Konfiguracija kanala. OPTION.fec = FEC_0_OFF; // Konfiguracija stikala za odpravljanje napak naprej. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Konfiguracija načina prenosa. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // konfiguracija za upravljanje izvleka. OPTION.transmissionPower = POWER_17; // konfiguracija moči prenosa dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Čakalni čas za konfiguracijo prebujanja. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfiguracija hitrosti prenosa zraka. SPED.uartBaudRate = UART_BPS_115200; // Konfiguracija hitrosti prenosa komunikacije. SPED.uartParity = MODE_00_8N1; // paritetni bit
Imate enakovredno funkcijo za vse atribute, da dobite ves opis:
Serial.print (F ("Chan:")); Serial.print (configuration. CHAN, DEC); Serial.print (" ->"); Serial.println (configuration.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (configuration. SPED.uartParity, BIN); Serial.print (" ->"); Serial.println (configuration. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (configuration. SPED.uartBaudRate, BIN); Serial.print (" ->"); Serial.println (configuration. SPED.getUARTBaudRate ()); Serial.print (F ("SpeedAirDataRate:")); Serial.print (configuration. SPED.airDataRate, BIN); Serial.print (" ->"); Serial.println (configuration. SPED.getAirDataRate ()); Serial.print (F ("OptionTrans:")); Serial.print (configuration. OPTION.fixedTransmission, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (configuration. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (configuration. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (configuration. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (configuration. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getTransmissionPowerDescription ());
Na enak način setConfiguration želi konfiguracijsko strukturo, zato menim, da je boljši način za upravljanje konfiguracije, da pridobite trenutno, uporabite edino potrebno spremembo in jo znova nastavite.
ResponseStatus setConfiguration (konfiguracija konfiguracije, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
konfiguracija je predhodno prikazana struktura, saveType vam dovoljuje izbiro, če sprememba postane trajno samo za trenutno sejo.
ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguracija); konfiguracija. ADDL = 0x0; konfiguracija. ADDH = 0x1; konfiguracija. CHAN = 0x19; configuration. OPTION.fec = FEC_0_OFF; configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; configuration. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; configuration. OPTION.transmissionPower = POWER_17; configuration. OPTION.wirelessWakeupTime = WAKE_UP_1250; configuration. SPED.airDataRate = AIR_DATA_RATE_011_48; configuration. SPED.uartBaudRate = UART_BPS_115200; configuration. SPED.uartParity = MODE_00_8N1; // Nastavitev konfiguracije spremenjena in nastavljena tako, da ne zadrži konfiguracije ResponseStatus rs = e32ttl100.setConfiguration (konfiguracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.koda); printParameters (konfiguracija);
Vsi parametri se upravljajo kot konstantni:
10. korak: Možnost osnovne konfiguracije
Korak: Pošljite sporočilo o prejemu
Najprej moramo uvesti preprosto, a uporabno metodo za preverjanje, ali je kaj v sprejemnem medpomnilniku
int na voljo ();
Preprosto vrne, koliko bajtov imate v trenutnem toku.
Korak: Običajen način prenosa
Običajen/pregleden način prenosa se uporablja za pošiljanje sporočil vsem napravam z istim naslovom in kanalom.
Obstaja veliko načinov pošiljanja/prejemanja sporočila, ki jih bomo podrobno razložili:
ResponseStatus sendMessage (sporočilo const String);
ResponseContainer acceptMessage ();
Prva metoda je sendMessage in se uporablja za pošiljanje niza na napravo v običajnem načinu.
ResponseStatus rs = e32ttl.sendMessage ("Prova"); Serial.println (rs.getResponseDescription ());
Druga naprava preprosto deluje v zanki
če (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Niz sporočilo = rs.data; // Najprej dobite podatke Serial.println (rs.status.getResponseDescription ()); Serial.println (sporočilo); }
Korak: Upravljajte strukturo
Če želite poslati kompleksno strukturo, lahko uporabite to metodo
ResponseStatus sendMessage (sporočilo const void *, velikost const uint8_t); ResponseStructContainer receiveMessage (velikost const uint8_t);
Uporablja se za pošiljanje strucutre, na primer:
struct Messaggione {char type [5]; sporočilo char [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", res}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());
in na drugi strani lahko tako prejmete sporočilo
ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data; Serial.println (messaggione.message); Serial.println (messaggione.mitico);
Preberite delno strucure
Če želite prebrati prvi del sporočila za upravljanje več vrst struktur, lahko uporabite to metodo.
ResponseContainer receiveInitialMessage (velikost const uint8_t);
Ustvarim ga tako, da prejme niz z vrsto ali drugo za identifikacijo strukture za nalaganje.
struct Messaggione {// Delna struktura brez sporočila typechar [8]; bool mitico; }; tip znakov [5]; // prvi del strukture ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Vstavi niz v niz znakov (ni potreben) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("VRSTA TIPA:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (tip); // Preberite preostanek strukture ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;
Korak 14: Fiksni način namesto običajnega
Na enak način ustvarim niz metod za uporabo s fiksnim prenosom
Fiksni prenos
Spremeniti morate samo način pošiljanja, ker ciljna naprava ne prejme preambule z nastavitvami naslova in kanala za fiksni način.
Torej za sporočilo String imate
ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, sporočilo const String); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, sporočilo const String);
in za strukturo, ki jo imate
ResponseStatus sendFixedMessage (bajt ADDL, bajt ADDH, bajt CHAN, const void *sporočilo, const uint8_t velikost); ResponseStatus sendBroadcastFixedMessage (bajt CHAN, const void *sporočilo, const uint8_t velikost);
Tukaj je preprost primer
ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, & messaggione, sizeof (Messaggione)); // ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, "Ciao");
Fiksni prenos ima več scenarijev
Če pošiljate na določeno napravo (drugi scenariji Fiksni prenos), morate dodati ADDL, ADDH in CHAN za neposredno identifikacijo.
ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Sporočilo napravi");
Če želite poslati sporočilo vsem napravam v določenem kanalu, lahko uporabite to metodo.
ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Sporočilo napravam kanala");
Če želite prejemati vsa oddajna sporočila v omrežju, morate nastaviti ADDH in ADDL z BROADCAST_ADDRESS.
ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Pomembno je, da dobite konfiguracijski kazalec pred vsemi drugimi operacijami Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfiguracija); konfiguracija. ADDL = BROADCAST_ADDRESS; konfiguracija. ADDH = BROADCAST_ADDRESS; // Nastavitev konfiguracije spremenjena in nastavljena tako, da ne zadrži konfiguracije ResponseStatus rs = e32ttl100.setConfiguration (konfiguracija, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.koda); printParameters (konfiguracija);
Korak 15: Hvala
Zdaj imate vse informacije za svoje delo, vendar mislim, da je pomembno pokazati nekaj realnih primerov, da bi bolje razumeli vse možnosti.
- Naprava LoRa E32 za Arduino, esp32 ali esp8266: nastavitve in osnovna uporaba
- Naprava LoRa E32 za Arduino, esp32 ali esp8266: knjižnica
- Naprava LoRa E32 za Arduino, esp32 ali esp8266: konfiguracija
- Naprava LoRa E32 za Arduino, esp32 ali esp8266: stacionarni prenos
- Naprava LoRa E32 za Arduino, esp32 ali esp8266: varčevanje z energijo in pošiljanje strukturiranih podatkov
Priporočena:
Brezžična šifrirana komunikacija Arduino: 5 korakov
Brezžična šifrirana komunikacija Arduino: Pozdravljeni vsi, v tem drugem članku vam bom razložil, kako uporabiti čip Atecc608a za zaščito vaše brezžične komunikacije. Za to bom uporabil NRF24L01+ za brezžični del in Arduino UNO. Mikro čip ATECC608A je oblikoval
Brezžična različica Ali so moja garažna vrata odprta ali zaprta?: 7 korakov
Brezžična različica … Ali so moja garažna vrata odprta ali zaprta?: Želeli smo preprost, poceni in zanesljiv sistem označevanja, ki nam je pokazal, ali so naša garažna vrata odprta ali zaprta. Obstaja veliko " Ali so moja garažna vrata odprta " projekti. Večina teh projektov je trdno povezana. V mojem primeru zagnano
Dolga razdalja, 1,8 km, brezžična komunikacija Arduino-Arduino s HC-12 .: 6 korakov (s slikami)
Dolga razdalja, 1,8 km, brezžična komunikacija Arduino-Arduino s HC-12 .: V tem navodilu se boste naučili komunicirati med Arduinosom na dolge razdalje do 1,8 km na prostem. HC-12 je brezžično serijsko vrata komunikacijski modul, ki je zelo uporaben, izredno zmogljiv in enostaven za uporabo. Najprej boste zapustili
Brezžična komunikacija z oddajnim modulom NRF24L01 za projekte na osnovi Arduino: 5 korakov (s slikami)
Brezžična komunikacija z oddajnim modulom NRF24L01 za projekte, ki temeljijo na Arduinu: To je moja druga vadnica o robotih in mikrokrmilnikih, ki jih je mogoče poučiti. Res je neverjetno videti svojega robota živega in delujočega po pričakovanjih in verjemite, da bo bolj zabavno, če z robotom ali drugimi brezžičnimi napravami upravljate hitro in
Brezžična brezžična električna energija v radijskih valovih v Katmanduju: 6 korakov
Brezžična brezžična oblika električnih radijskih valov v Katmanduju: Kar sem naredil, sem to prilagodil in poenostavil in ima samo dva konca namesto štirih. Prava velikost palačinke z dvema koncema, povezanima z Arialom, in tla delujeta kot sprejemnik. Dolg odsek dveh arij, eden povezan z g