Obsah:

Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: 15 kroků
Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: 15 kroků

Video: Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: 15 kroků

Video: Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32: 15 kroků
Video: Free Space and Walls: Radio Wave Propagation and Prediction of Field Strength with EXCEL (EP15) 2024, Listopad
Anonim
Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32
Bezdrátová komunikace LoRa 3 až 8 km s nízkými náklady na zařízení E32 (sx1278/sx1276) pro Arduino, Esp8266 nebo Esp32

Vytvářím knihovnu pro správu EBYTE E32 na základě řady Semtech zařízení LoRa, velmi výkonného, jednoduchého a levného zařízení.

Verzi 3 km najdete zde, verzi 8 km zde

Mohou pracovat na vzdálenost 3000 m až 8 000 m a mají mnoho funkcí a parametrů. Vytvořil jsem tedy tuto knihovnu, abych zjednodušil používání.

Je to řešení pro získávání dat z metropolitních senzorů nebo pro ovládání dronu.

Zásoby

Arduino UNO

Wemos D1 mini

Verze LoRa E32 TTL 100 3Km

Verze LoRa E32 TTL 1W 8Km

Krok 1: Knihovna

Knihovna
Knihovna

Moji knihovnu najdete zde.

Ke stažení.

Klikněte na tlačítko STAŽENÍ v pravém horním rohu, přejmenujte nekomprimovanou složku LoRa_E32.

Zkontrolujte, zda složka LoRa_E32 obsahuje LoRa_E32.cpp a LoRa_E32.h.

Umístěte složku knihovny LoRa_E32 do složky / libraries /. Pokud je to vaše první knihovna, budete možná muset vytvořit podsložku knihoven.

Restartujte IDE.

Krok 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Jak vidíte, můžete nastavit různé režimy pomocí pinů M0 a M1.

Existuje několik pinů, které lze použít staticky, ale pokud jej připojíte k mikrokontroléru a nakonfigurujete je v knihovně, získáte výkon a můžete ovládat všechny režimy pomocí softwaru, ale příště to vysvětlíme lépe.

Krok 3: Pin AUX

AUX pin
AUX pin
AUX pin
AUX pin
AUX pin
AUX pin

Jak jsem již řekl Není důležité připojovat všechny kolíky k výstupu mikrokontroléru, můžete piny M0 a M1 umístit na VYSOKÉ nebo NÍZKÉ, abyste získali požadovanou konfiguraci, a pokud nepřipojíte AUX, knihovna nastavila přiměřené zpoždění, aby bylo jisté že je operace dokončena.

AUX pin

Při přenosu dat lze použít k probuzení externího MCU a návrat HIGH po dokončení přenosu dat.

Při příjmu AUX bude LOW a vrátí HIGH, když je vyrovnávací paměť prázdná.

Používá se také pro vlastní kontrolu k obnovení normálního provozu (v režimu zapnutí a režimu spánku/programu).

Krok 4: Plně připojené schéma Esp8266

Plně připojené schéma Esp8266
Plně připojené schéma Esp8266
Plně připojené schéma Esp8266
Plně připojené schéma Esp8266

Schéma připojení esp8266 je jednodušší, protože pracuje se stejným napětím logické komunikace (3,3 V).

Je důležité přidat pull-up odpor (4, 7Kohm), abyste získali dobrou stabilitu.

Krok 5: Plně připojené schéma Arduino

Plně připojené schéma Arduino
Plně připojené schéma Arduino
Plně připojené schéma Arduino
Plně připojené schéma Arduino

Pracovní napětí Arduino je 5v, proto musíme přidat dělič napětí na piny RX M0 a M1 modulu LoRa, aby nedošlo k poškození, více informací získáte zde Dělič napětí: kalkulačka a aplikace.

Můžete použít rezistor 2Kohm na GND a 1Kohm ze signálu, než dát dohromady na RX.

Krok 6: Knihovna: Konstruktor

Vytvořil jsem řadu poměrně početných konstruktorů, protože můžeme mít více možností a situací, které je třeba spravovat.

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);

První sada konstruktorů je vytvořena tak, aby delegovala správu sériových a dalších pinů do knihovny.

rxPin a txPin je kolík pro připojení k UART a jsou povinné.

auxPin je pin, který kontroluje provoz, přenos a stav příjmu (dále vysvětlíme lépe), tento pin Není povinný, pokud jej nenastavíte, použiji zpoždění, aby bylo možné operaci dokončit sama (s latencí).

m0pin a m1Pin jsou piny pro změnu operace MODE (viz tabulka výše), myslím, že se tyto piny v „produkci“budou připojovat přímo VYSOKÉ nebo NÍZKÉ, ale pro test jsou užitečně spravovány knihovnou.

bpsRate je boudrate SoftwareSerial normálně je 9600 (jediná přenosová rychlost v režimu programmin/spánek)

Jednoduchý příklad je

#include "LoRa_E32.h" LoRa_E32 e32ttl100 (2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX

Můžeme přímo použít SoftwareSerial s jiným konstruktorem

LoRa_E32 (HardwareSerial* sériový, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* sériový, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial* sériový, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Příklad horní s tímto konstruktorem může být podobný.

#include #include "LoRa_E32.h"

SoftwareSerial mySerial (2, 3); // RX, TX

LoRa_E32 e32ttl100 (& mySerial);

// LoRa_E32 e32ttl100 (& mySerial, 5, 7, 6);

Poslední sadou konstruktorů je povolení používat HardwareSerial místo SoftwareSerial.

LoRa_E32 (SoftwareSerial* sériový, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* sériový, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial* sériový, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Krok 7: Začněte

Příkaz begin slouží ke spuštění sériového připojení a pinů ve vstupním a výstupním režimu.

void begin ();

v exekuci je

// Spusťte všechny piny a UART

e32ttl100.begin ();

Krok 8: Konfigurační a informační metoda

Existuje sada metod pro správu konfigurace a získávání informací o zařízení.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (Konfigurační konfigurace, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (konfigurace konfigurace struktury);

ResponseStatus resetModule ();

Krok 9: Kontejner odpovědi

Aby se zjednodušila správa odpovědí, vytvořím sadu kontejnerů, které jsou pro mě velmi užitečné pro správu chyb a vracení obecných dat.

Status odezvy

Toto je kontejner stavu a má 2 jednoduché vstupní body, pomocí kterých můžete získat stavový kód a popis stavového kódu

Serial.println (c.getResponseDescription ()); // Popis kódu

Serial.println (c.code); // 1 pokud úspěch

Kód je

ÚSPĚCH = 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

Tento kontejner je vytvořen pro správu odezvy řetězce a má 2 vstupní body.

data s řetězcem vráceným ze zprávy a stav instance RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Řetězcová zpráva = rs.data;

Serial.println (rs.status.getResponseDescription ());

Serial.println (zpráva);

ResponseStructContainer

Toto je „složitější“kontejner, který používám ke správě struktury. Má stejný vstupní bod jako ResponseContainer, ale data jsou prázdným ukazatelem pro správu složité struktury.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Před všemi ostatními operacemi je důležité získat ukazatel konfigurace

Konfigurace konfigurace = *(Konfigurace *) c.data;

Serial.println (c.status.getResponseDescription ());

Serial.println (c.status.code);

getConfiguration a setConfiguration

První metodou je getConfiguration, kterou můžete použít k obnovení všech dat uložených v zařízení.

ResponseStructContainer getConfiguration ();

Zde příklad použití.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Před všemi ostatními operacemi je důležité získat ukazatel konfigurace

Konfigurace konfigurace = *(Konfigurace *) c.data;

Serial.println (c.status.getResponseDescription ());

Serial.println (c.status.code);

Serial.println (configuration. SPED.getUARTBaudRate ());

Struktura konfigurace obsahuje všechna data nastavení a přidávám řadu funkcí, abych získal veškerý popis jednotlivých dat.

configuration. ADDL = 0x0; // První část addressconfiguration. ADDH = 0x1; // Druhá část konfigurace adresy. CHAN = 0x19; // Konfigurace kanálu. OPTION.fec = FEC_0_OFF; // Konfigurace přepínače opravy chyb vpřed. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // konfigurace režimu přenosu. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Konfigurace správy vytahování. OPTION.transmissionPower = POWER_17; // Konfigurace vysílacího výkonu dBm. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Doba čekání na konfiguraci probuzení. SPED.airDataRate = AIR_DATA_RATE_011_48; // Konfigurace rychlosti přenosu dat. SPED.uartBaudRate = UART_BPS_115200; // Konfigurace přenosové rychlosti komunikace. SPED.uartParity = MODE_00_8N1; // Paritní bit

Chcete -li získat veškerý popis, máte ekvivalentní funkci pro všechny atributy:

Serial.print (F ("Chan:")); Serial.print (konfigurace. 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 ());

Stejně tak setConfiguration chce konfigurační strukturu, takže si myslím, že lepší způsob, jak spravovat konfiguraci, je načíst aktuální, použít jedinou potřebnou změnu a nastavit ji znovu.

ResponseStatus setConfiguration (Konfigurační konfigurace, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

konfigurace je dříve ukázána, saveType vám povolí výběr, pokud se změna stane trvale pouze pro aktuální relaci.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Je důležité získat ukazatel konfigurace před všemi ostatními operacemi Konfigurace konfigurace = *(Konfigurace *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurace); configuration. ADDL = 0x0; configuration. ADDH = 0x1; konfigurace. 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; // Nastavená konfigurace změněna a nastavena tak, aby neuchovávala konfiguraci ResponseStatus rs = e32ttl100.setConfiguration (konfigurace, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurace);

Všechny parametry jsou spravovány jako konstantní:

Krok 10: Základní možnost konfigurace

Základní možnost konfigurace
Základní možnost konfigurace

Krok 11: Odeslání zprávy

Nejprve musíme zavést jednoduchou, ale užitečnou metodu pro kontrolu, zda je něco v přijímací vyrovnávací paměti

int dostupný ();

Jednoduše vrátí, kolik bajtů máte v aktuálním streamu.

Krok 12: Normální režim přenosu

Normální režim přenosu
Normální režim přenosu

Režim normálního/transparentního přenosu se používá k odesílání zpráv na všechna zařízení se stejnou adresou a kanálem.

Existuje mnoho způsobů odesílání/přijímání zpráv, které podrobně vysvětlíme:

ResponseStatus sendMessage (const String message);

ResponseContainer receiveMessage ();

První metoda je sendMessage a používá se k odeslání řetězce na zařízení v normálním režimu.

ResponseStatus rs = e32ttl.sendMessage ("Prova"); Serial.println (rs.getResponseDescription ());

Druhé zařízení jednoduše provede smyčku

if (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Řetězcová zpráva = rs.data; // Vůbec první získání dat Serial.println (rs.status.getResponseDescription ()); Serial.println (zpráva); }

Krok 13: Správa struktury

Pokud chcete odeslat komplexní strukturu, můžete použít tuto metodu

ResponseStatus sendMessage (const void *message, const uint8_t size); ResponseStructContainer receiveMessage (const uint8_t size);

Používá se k odesílání strucutre, například:

struct Messaggione {char typ [5]; char zpráva [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

a na druhé straně můžete zprávu přijmout

ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data; Serial.println (messaggione.message); Serial.println (messaggione.mitico);

Přečtěte si částečnou strukturu

Pokud si chcete přečíst první část zprávy a spravovat více typů strucutre, můžete použít tuto metodu.

ResponseContainer receiveInitialMessage (velikost konst uint8_t);

Vytvořil jsem to pro příjem řetězce s typem nebo jiným pro identifikaci struktury, která se má načíst.

struct Messaggione {// Částečný strucutre bez zprávy typechar [8]; bool mitico; }; typ char [5]; // první část struktury ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (typ)); // Vložte řetězec do pole char (není potřeba) memcpy (typ, rs.data.c_str (), sizeof (typ)); Serial.println ("TYP ČTENÍ:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (typ); // Přečíst zbytek struktury ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = *(Messaggione *) rsc.data;

Krok 14: Opravený režim namísto normálního režimu

Stejným způsobem vytvářím sadu metod pro použití s pevným přenosem

Opravený přenos

Musíte změnit pouze způsob odesílání, protože cílové zařízení neobdrží preambuli s pevným režimem nastavení adresy a kanálu.

Takže pro řetězcovou zprávu máte

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String zpráva); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String zpráva);

a pro strukturu máte

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void *zpráva, const uint8_t velikost); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void *zpráva, const uint8_t velikost);

Zde jednoduchý příklad

ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, & messaggione, sizeof (Messaggione)); // ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, "Ciao");

Pevný přenos má více scénářů

Pokud odesíláte na konkrétní zařízení (druhý scénář Pevný přenos), musíte přidat ADDL, ADDH a CHAN, abyste jej mohli přímo identifikovat.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, "Zpráva do zařízení");

Pokud chcete odeslat zprávu na všechna zařízení v zadaném kanálu, můžete použít tuto metodu.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, "Zpráva pro zařízení kanálu");

Pokud chcete přijímat všechny vysílané zprávy v síti, musíte nastavit ADDH a ADDL pomocí BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Je důležité získat ukazatel konfigurace před všemi ostatními operacemi Konfigurace konfigurace = *(Konfigurace *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (konfigurace); configuration. ADDL = BROADCAST_ADDRESS; configuration. ADDH = BROADCAST_ADDRESS; // Nastavená konfigurace změněna a nastavena tak, aby neuchovávala konfiguraci ResponseStatus rs = e32ttl100.setConfiguration (konfigurace, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (konfigurace);

Krok 15: Díky

Nyní máte všechny informace, které je třeba provést, ale myslím, že je důležité ukázat několik realistických příkladů, abyste lépe porozuměli všem možnostem.

  1. Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: nastavení a základní použití
  2. Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: knihovna
  3. Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: konfigurace
  4. Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: pevný přenos
  5. Zařízení LoRa E32 pro Arduino, esp32 nebo esp8266: úspora energie a odesílání strukturovaných dat

Doporučuje: