viernes, 27 de enero de 2023

Comunicación entre arduino y Raspberry pi pico con LORA

  Página principal

LORA (LoRaWAN) SX1278
Raspberry pi pico

IDE Arduino
Transmision temperatura desde ATMEGA a Raspberry pi pico
Módulo AHT20 - OLED


Tenía una raspberry pi pico, y mi idea era comunicar el arduino con la raspberry pi pico a través de LORA (LoRaWAN).
En primer lugar monto el transmisor con un arduino junto con el sensor de temperatura y humedad (AHT20).
En anteriores montajes ya había realizado varios montajes, en este lo junto todo.

EMISOR




El sensor AHT20 se comunica mediante el bus I2C, funciona a 5V.
Module AHT20 // Arduino UNO/NANO   
    A4->SDA
    A5->SDL
    GND->GND
    5V->VIN

El transmisor LORA SX1278 se comunica mediante el bus SPI, funciona a 3.3V .
Module SX1278 // Arduino UNO/NANO   
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   D12
    MOSI        ->   D11    
    SLCK        ->   D13
    Nss         ->   D10
    Di00        ->   D2
    RST         ->   D9    

Los datos de temperatura y humedad se envían cada 1500 mS.
El formato es:
Num=23  Temperatura=20.34  Humedad=50.34


RECEPTOR





El OLED se comunica mediante el bus I2C.
OLED ->  PICO
    SLC->1
    SDA->0
    VCC->3V3
    GND->GND

Como en la Raspberry pi pico se pueden utilizar diferentes PINS para el bus I2C, debemos indicar que PINS se deben utilizar.
Esto se realiza en la configuración con:
    Wire.setSDA(0);
    Wire.setSCL(1);
    Wire.begin();
 
Nos falta conectar el receptor LORA SX1278 al raspberry mediante el bus SPI.
Module SX1278 // Raspberry pico pi
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   16
    MOSI        ->   19
    SLCK        ->   18
    Nss         ->   17
La configuración en la parte del programa fue difícil, es lo que mas me costó.
#define M_MISO  16
#define M_CS  17
#define M_SCK 18
#define M_MOSI  19

const uint8_t SPI_MISO = M_MISO;
const uint8_t SPI_CS = M_CS;
const uint8_t SPI_SCK = M_SCK;
const uint8_t SPI_MOSI = M_MOSI;

 LoRa.setPins(M_CS);

La conexión del pin de interrupción DIO0 no se hace debido a que no está implementada en la librería, además tampoco se utiliza el pin de RESET.

He creado una función que lee la cadena recibida y extrae el valor de una cadena pedida.
Esta función es muy útil para cualquier otro montaje.
/* busca en una cadena (*in), una cadena (*busqueda), y devuelve el valor en (*valor) */
int busqueda(char* in, char* busqueda, char* valor)

Ejemplo:
    if (1 == busqueda(buffer, (char*)"Num=", bufferS))
        {
            Serial.print(" valorNum=");
            Serial.println(bufferS);
            nums=atoi(bufferS);
        }


VIDEO DEL FUNCIONAMIENTO

PROGRAMA Y LIBRERÍAS



Saludos.
Juan Galaz



Bibliografía:

https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
https://www.electroschematics.com/rf-radio-frequency/
https://electronoobs.com/eng_arduino_tut97.php
https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
https://www.semtech.com/products/wireless-rf/lora-connect/sx1278
https://oa.upm.es/44890/1/TFM_JOSE_DANIEL_RODRIGUEZ_MUNCA.pdf
https://www.2cigroup.com/es/conceptos-de-actualidad-lora-y-lorawan/


https://github.com/adafruit/Adafruit_AHTX0
https://github.com/Longan-Labs/GROVE-ATH-RESOURCES

No hay comentarios:

Publicar un comentario