ESP32 LoRa for dummys - Baliza (Beacon)
- Monitorizar las condiciones de propagación
- Hacer seguimiento o tracker (puede transmitirse las coordenadas obtenidas por GNSS si dispone de este chip la placa)
- Transmitir valores de telemetría o meteorológicos si se dota a la placa de desarrollo de los dispositivos adecuados
- Jugar a la caza del zorro ocultándola con el fin de que sea radiolocalizada y encontrada por los participantes
- ...
- Clonar la librería del proyecto, para ello entrar en el terminal y situaros en el directorio donde queremos que se cree la copia (p.e. arduino) y ejecutar git clone https://github.com/sergev/morse-beacon.git
- Entrar en Arduino IDE
- Comprobar que está instalado Arduino GFX y actualizar o instalar según el caso.
- Entrar en la opción de HERRAMIENTAS y seleccionar:
- la placa de desarrollo ( p.e. ESP32-PICO-D4 revision v1.1 )
- la conexión serie (p.e. wchusbserie). Si esta no aparce cambie de cable USB
- Hacer una copia de seguridad del modulo que vamos a modificar morse-beacon.ino => morse-beacon.bak pero guardela en otro dicrectorio de lo contrario le dará l siguiente error "error: redefinition of 'const uint8_t Fixed8x16Bitmaps []'"
- Borrar la memoria de la placa (Si hay algo de valor hacer backup previamente)
- python3 esptool.py --port /dev/cu.wchusbserialXXXXXXXXXXXX erase_flash
- Cargar y modificar el módulo morse-beacon.ino
- El código es compatible con
- TTGO Lora32 board
- Heltec Lora32 board
- Algunos parámetros modificables
- #define FREQ_HZ 433575000 // 433.575 MHz
- #define TX_DBM 17 // 50 mW
- #define WPM 12
- send_message("KK6ABQ/B QRPP 50 mW FOX HUNT");
- Este módulo llama a los siguientes (En negrita los del proyecto)
- #include <SPI.h>
- #include <Wire.h> Es necesario para comuicar ESP32 por I2C con pantalla OLED
- #include <Adafruit_GFX.h>
- #include "Adafruit_SSD1306.h"
- #include "Fixed8x16.h"
- #include "LoRa.h"
- Compilar ( V Verificar)
"El Sketch usa 321457 bytes (24%) del espacio de almacenamiento de programa. El máximo es 1310720 bytes. Las variables Globales usan 19440 bytes (5%) de la memoria dinámica, dejando 308240 bytes para las variables locales. El máximo es 327680 bytes."
- Cargar (->)
- Actualizando ...
esptool.py v4.6Serial port /dev/cu.wchusbserial58870212941Connecting....Chip is ESP32-D0WDQ6-V3 (revision v3.1)Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme NoneCrystal is 40MHzMAC: 2c:bc:bb:83:40:0cUploading stub...Running stub...Stub running...Changing baud rate to 921600Changed.Configuring flash size...Flash will be erased from 0x00001000 to 0x00007fff...Flash will be erased from 0x00008000 to 0x00008fff...Flash will be erased from 0x0000e000 to 0x0000ffff...Flash will be erased from 0x00010000 to 0x0005efff...Compressed 24896 bytes to 16262...Writing at 0x00001000... (100 %)Wrote 24896 bytes (16262 compressed) at 0x00001000 in 0.6 seconds (effective 314.6 kbit/s)...Hash of data verified.Compressed 3072 bytes to 146...Writing at 0x00008000... (100 %)Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 391.0 kbit/s)...Hash of data verified.Compressed 8192 bytes to 47...Writing at 0x0000e000... (100 %)Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 518.3 kbit/s)...Hash of data verified.Compressed 322192 bytes to 181353...Writing at 0x00010000... (8 %)Writing at 0x0001acfd... (16 %)Writing at 0x000280a1... (25 %)Writing at 0x0002d79d... (33 %)Writing at 0x00032f2f... (41 %)Writing at 0x000385b5... (50 %)Writing at 0x0003dad7... (58 %)Writing at 0x00043068... (66 %)Writing at 0x00048386... (75 %)Writing at 0x0004e7bb... (83 %)Writing at 0x00058c64... (91 %)Writing at 0x0005e390... (100 %)Wrote 322192 bytes (181353 compressed) at 0x00010000 in 3.5 seconds (effective 746.8 kbit/s)...Hash of data verified.Leaving...Hard resetting via RTS pin...
- Reset
- En funcionamiento led rojo fijo y azul parpadea
// ESP32 433 LORA32 V2.1_1.6// LED#define LED 25// LORA#define LORA_SCK 5 // IO5 -- SCLK
#define LORA_MISO 19 // IO19 -- MISO#define LORA_MOSI 27 // IO27 -- MOSI#define LORA_SS 18 // IO18 -- CS#define LORA_RST 23 // IO12 -- RST RESET for V2.1 (use IO14 for V2.0)
#define LORA_DI0 26 // IO26 -- DIO Interrupt Request// OLED#define OLED_RST NOT_A_PIN // IO16 -- RESET
#define OLED_SDA 21 // IO21 -- SDA for TTGO Lora32 board#define OLED_SCL 22 // IO22 -- SCL
// comentario/* abre comentario de varias lineas*/ cierra comentario de varias líneas; terminación de una instrucción
void setup () {} Función que se ejecuta una vez
void loop () {} Función que se ejecuta en bucle o de forma continua
Sí , basta con modificar la frecuencia, compilar para la placa ESP32 que tengamos (LILYGO ® TTGO LoRa32 V2.1_1.6 versión 433/868/915Mhz ESP32 LoRa OLED 0,96 pulgadas tarjeta SD Bluetooth WIFI módulo inalámbrico ESP-32 SMA SX1276), en nuestro caso ESP32 Dev Module y cargar// EU863 863-870 MHz#define FREQ_HZ 866500000 // 866.500 MHz
¿Funcionará en 144 MHZ?
En principio con una tarjeta LILYGO ® TTGO LoRa32 V2.1_1.6 versión 433 debe poder trabajar en 144 MHZ.
Modificado el programa funciona sin problemas
Según la especificación es de 20 dBm que corresponde a 100 mWSí, se puede modificar hasta el maximo o disminuirlo.
Recuerde que +3dB es duplicar la potencia y -3dB es la mitad#define TX_DBM 20
La cobertura pracica en ciudad con 20 dbm es de unos 800m (Se puede sintonixzar y demodular sin problemas con un walkie talkie de FM)
¿Cual es la longitud máxima del mensaje?
Indefinida pero en la pantalla solamente caben 64 caracteres por lo que habría que implementar un contador para que cuando llegue a este valor la borre o cualquier otra solucion.
Una solución rapida es incluir tantas lineas de mensajes de 84 con su borrado y reubicación del cursor, como se desse
send_message(" ");
display.clearDisplay();display.setCursor(0, Fixed8x16.yAdvance);
¿Se pueden generar caracteres de forma aleatoria para practicar?
Sí
Hay que definir la semilla para la generación aleatoria y la lista de caracteres
randomSeed(analogRead(0)); // Semilla aleatoria
const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:/?=";const int alphabetLength = sizeof(alphabet) - 1; // -1 para evitar el carácter nulo
Y sustituir el codigo de envio de un mensaje por
int randomIndex = random(0, alphabetLength);char randomLetter[2]; // Arreglo para almacenar la letra y el terminador nulrandomLetter[0] = alphabet[randomIndex];
randomLetter[1] = '\0'; // Terminador nulosend_message(randomLetter);
int randomIndex1 = random(0, alphabetLength);
int randomIndex2 = random(0, alphabetLength);
int randomIndex3 = random(0, alphabetLength);
int randomIndex4 = random(0, alphabetLength);
int randomIndex5 = random(0, alphabetLength);
char randomLetter[6];
randomLetter[0] = alphabet[randomIndex1];randomLetter[1] = alphabet[randomIndex2];randomLetter[2] = alphabet[randomIndex3];randomLetter[3] = alphabet[randomIndex4];randomLetter[4] = alphabet[randomIndex5];randomLetter[5] = '\0';send_message(randomLetter);delay(1000);
Otras ideas de mejora que requieren algo de programación
- Emisión con saltos de frecuencia para cazas del zorro con handicap
- Emisión de una señal de tiempo ( para placas con GPS)
- Emisión de las coordenadas ( para placas con GPS)
- Emisión de jinggle jugando con el tono
- ...
- MORSE BEACON https://github.com/sergev/morse-beacon/tree/master
- LORAFOX https://github.com/kemenril/LoRaFox
Comentarios
Publicar un comentario