Módulo transceptor LoRa SX1262
El módulo LoRa Core1262-868M incorpora un chip RF SX1262 de nueva generación, mayor eficiencia energética y mayor distancia de transmisión que el SX1278 tradicional, con una alta capacidad anti interferencia.
Programas realizados con STEAMakers Blocks
Con esta disposición de pines, de forma que DIO1 esté conectado al GPIO12 del ESP32, RESET al GPIO13, CS al GPIO5, CLK al GPIO18, MOSI al GPIO23 y MISO al GPIO19 y el entorno de programación de STEAMakers Blocks no he conseguido que funcione.
También he probado que DIO1 esté conectado al GPIO14 del ESP32, RESET al GPIO12, CS al GPIO5, CLK al GPIO18, BUSY al GPIO 13, MOSI al GPIO23 y MISO al GPIO19, pero tampoco he conseguido que funcione en el entorno de programación de STEAMakers Blocks.
Programas de thekakester
En Github podemos encontrar unos sencillos programas para este transceptor. Están probados con una placa Adafruit Metro ESP32-S2 Express.
Ejemplo de recepción
#include "LoraSx1262.h" LoraSx1262* radio; byte receiveBuff[255]; void setup() { Serial.begin(9600); Serial.println("Booted"); radio = new LoraSx1262(); } void loop() { //Receive a packet over radio int bytesRead = radio->lora_receive_async(receiveBuff, sizeof(receiveBuff)); if (bytesRead > -1) { //Print the payload out over serial Serial.print("Received: "); Serial.write(receiveBuff,bytesRead); Serial.println(); //Add a newline after printing } }
Ejemplo de transmisión
#include "LoraSx1262.h" byte payload = "Hello world. This a pretty long payload. We can transmit up to 255 bytes at once, which is pretty neat if you ask me"; LoraSx1262* radio; void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("Booted"); radio = new LoraSx1262(); } void loop() { Serial.print("Transmitting... "); radio->transmit(payload,strlen(payload)); Serial.println("Done!"); delay(1000); }
Uso de la librería RadioLib
RadioLib permite a sus usuarios integrar todo tipo de módulos de comunicación inalámbrica, protocolos e incluso modos digitales en un único sistema consistente. Se pueden encontrar variados programas para Arduino y SX1262. (Wiki)
SX126x Channel Activity Detection Receive
/*
RadioLib SX126x Receive after Channel Activity Detection ExampleThis example uses SX1262 to scan the current LoRachannel and detect ongoing LoRa transmissions.Unlike SX127x CAD, SX126x can detect any partof LoRa transmission, not just the preamble.If a packet is detected, the module will switchto receive mode and receive the packet.Other modules from SX126x family can also be used.For default module settings, see the wiki pagehttps://github.com/jgromes/RadioLib/wiki/Default-configuration#sx126x---lora-modemFor full API reference, see the GitHub Pageshttps://jgromes.github.io/RadioLib/*/// include the library#include <RadioLib.h>// SX1262 has the following connections:// NSS pin: 10// DIO1 pin: 2// NRST pin: 3// BUSY pin: 9SX1262 radio = new Module(10, 2, 3, 9);// or detect the pinout automatically using RadioBoards// https://github.com/radiolib-org/RadioBoards/*#define RADIO_BOARD_AUTO#include <RadioBoards.h>Radio radio = new RadioModule();*/// whether we are receiving, or scanningbool receiving = false;// flag to indicate that a packet was detected or CAD timed outvolatile bool scanFlag = false;// this function is called when a complete packet// is received by the module// IMPORTANT: this function MUST be 'void' type// and MUST NOT have any arguments!#if defined(ESP8266) || defined(ESP32)ICACHE_RAM_ATTR#endifvoid setFlag(void) {// something happened, set the flagscanFlag = true;}void setup() {Serial.begin(9600);// initialize SX1262 with default settingsSerial.print(F("[SX1262] Initializing ... "));int state = radio.begin();if (state == RADIOLIB_ERR_NONE) {Serial.println(F("success!"));} else {Serial.print(F("failed, code "));Serial.println(state);while (true) { delay(10); }}// set the function that will be called// when LoRa packet or timeout is detectedradio.setDio1Action(setFlag);// start scanning the channelSerial.print(F("[SX1262] Starting scan for LoRa preamble ... "));state = radio.startChannelScan();if (state == RADIOLIB_ERR_NONE) {Serial.println(F("success!"));} else {Serial.print(F("failed, code "));Serial.println(state);}}void loop() {// check if the flag is setif(scanFlag) {int state = RADIOLIB_ERR_NONE;// reset flagscanFlag = false;// check ongoing receptionif(receiving) {// DIO triggered while reception is ongoing// that means we got a packet// you can read received data as an Arduino StringString str;state = radio.readData(str);// you can also read received data as byte array/*byte byteArr[8];state = radio.readData(byteArr, 8);*/if (state == RADIOLIB_ERR_NONE) {// packet was successfully receivedSerial.println(F("[SX1262] Received packet!"));// print data of the packetSerial.print(F("[SX1262] Data:\t\t"));Serial.println(str);// print RSSI (Received Signal Strength Indicator)Serial.print(F("[SX1262] RSSI:\t\t"));Serial.print(radio.getRSSI());Serial.println(F(" dBm"));// print SNR (Signal-to-Noise Ratio)Serial.print(F("[SX1262] SNR:\t\t"));Serial.print(radio.getSNR());Serial.println(F(" dB"));// print frequency errorSerial.print(F("[SX1262] Frequency error:\t"));Serial.print(radio.getFrequencyError());Serial.println(F(" Hz"));} else {// some other error occurredSerial.print(F("[SX1262] Failed, code "));Serial.println(state);}// reception is done nowreceiving = false;} else {// check CAD resultstate = radio.getChannelScanResult();if (state == RADIOLIB_LORA_DETECTED) {// LoRa packet was detectedSerial.print(F("[SX1262] Packet detected, starting reception ... "));state = radio.startReceive();if (state == RADIOLIB_ERR_NONE) {Serial.println(F("success!"));} else {Serial.print(F("failed, code "));Serial.println(state);}// set the flag for ongoing receptionreceiving = true;} else if (state == RADIOLIB_CHANNEL_FREE) {// channel is freeSerial.println(F("[SX1262] Channel is free!"));} else {// some other error occurredSerial.print(F("[SX1262] Failed, code "));Serial.println(state);}}// if we're not receiving, start scanning againif(!receiving) {Serial.print(F("[SX1262] Starting scan for LoRa preamble ... "));state = radio.startChannelScan();if (state == RADIOLIB_ERR_NONE) {Serial.println(F("success!"));} else {Serial.print(F("failed, code "));Serial.println(state);}}}}
Uso de la librería Ra01S
En Github nopnop2002 tiene ejemplos de código para programar SX1262 en Arduino.
Conexiones entre SX1262 y ESP32
CONEXIONES SX1262 ↔ ESP32
Función SX1262 Pin del SX1262 Conectar al pin ESP32 Descripción
NSS / CS CS / NSS GPIO 5 (recomendado) Chip Select SPI
SCK SCK GPIO 18 SPI Clock
MOSI MOSI GPIO 23 SPI Master Out
MISO MISO GPIO 19 SPI Master In
DIO1 DIO1 GPIO 14 Interrupciones / eventos
BUSY BUSY GPIO 13 Señal de ocupado
NRST RESET GPIO 12 Reset del SX1262
3.3V VCC 3V3 ESP32 Alimentación
GND GND GND Tierra común





No hay comentarios:
Publicar un comentario