- Materiales necesarios
- Conectando Raspberry Pi con LoRa
- Conectando Arduino con LoRa
- pyLoRa para Raspberry Pi
- Configuración del módulo Raspberry Pi para LoRa
- Programando Raspberry Pi para LoRa
- Código Arduino para LoRa para comunicarse con Raspberry Pi
- Probando la comunicación LoRa entre Raspberry Pi y Arduino
LoRa se está volviendo cada vez más popular con la llegada de IoT, Connected Cars, M2M, Industry 4.0, etc. Debido a su capacidad para comunicarse a largas distancias con muy menos energía, los diseñadores lo utilizan preferiblemente para enviar / recibir datos de una cosa alimentada por batería. Ya hemos discutido los conceptos básicos de LoRa y cómo usar LoRa con Arduino. Aunque la tecnología está diseñada originalmente para que un Nodo LoRa se comunique con una puerta de enlace LoRa, hay muchos escenarios en los que un Nodo LoRa tiene que comunicarse con otro Nodo LoRa para intercambiar información a larga distancia. Entonces, en este tutorial aprenderemos cómo usar un módulo LoRa SX1278 con Raspberry pipara comunicarse con otro SX1278 conectado a un microcontrolador como Arduino. Este método puede ser útil en muchos lugares, ya que Arduino podría actuar como un servidor para obtener datos de los sensores y enviarlos a Pi a una larga distancia a través de LoRa y luego el Pi que actúa como cliente puede recibir esta información y cargarla en el podría ya que tiene acceso a Internet. Suena interesante, ¿verdad? Entonces empecemos.
Materiales necesarios
- Módulo LoRa SX1278 433MHz - 2 Nos
- Antena LoRa 433MHz - 2Nos
- Arduino UNO- u otra versión
- Frambuesa pi 3
Se asume que su Raspberry Pi ya está flasheado con un sistema operativo y puede conectarse a Internet. De lo contrario, siga el tutorial Introducción a Raspberry Pi antes de continuar. Aquí estamos usando Rasbian Jessie instalado Raspberry Pi 3.
Advertencia: Utilice siempre su módulo SX1278 LoRa con antenas de 433 MHz; de lo contrario, el módulo podría dañarse.
Conectando Raspberry Pi con LoRa
Antes de entrar en los paquetes de software, preparemos el hardware. El SX1278 es un módulo Lora de 16 pines que se comunica usando SPI en 3.3V Logic. La Raspberry pi también funciona en un nivel lógico de 3.3V y también tiene un puerto SPI incorporado y un regulador de 3.3V. Entonces podemos conectar directamente el módulo LoRa con la Raspberry Pi. La tabla de conexiones se muestra a continuación.Frambuesa pi | Lora - Módulo SX1278 |
3,3 V | 3,3 V |
Suelo | Suelo |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Habilitar |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
También puede utilizar el diagrama de circuito a continuación como referencia. Tenga en cuenta que el diagrama de circuito se creó utilizando el módulo RFM9x que es muy similar al módulo SX1278, por lo que la apariencia puede diferir en la imagen de abajo.
Las conexiones son bastante sencillas, el único problema que puede enfrentar es que el SX1278 no es compatible con la placa de prueba, por lo que debe usar cables de conexión directamente para hacer las conexiones o usar dos placas de prueba pequeñas como se muestra a continuación. Además, pocas personas sugieren alimentar el módulo LoRa con un riel de alimentación de 3.3V separado, ya que es posible que el Pi no pueda generar suficiente corriente. Sin embargo, al ser Lora un módulo de baja potencia, debería funcionar en el riel de 3.3V de Pi, probé lo mismo y descubrí que funciona sin ningún problema. Pero tómalo con una pizca de sal. Mi configuración de conexión de LoRa con Raspberry pi se parece a esto a continuación
Conectando Arduino con LoRa
La conexión para el módulo Arduino sigue siendo la misma que usamos en nuestro tutorial anterior. La única diferencia será que, en lugar de usar la biblioteca de Sandeep Mistry, usaremos la biblioteca Rspreal basada en Radio head, que discutiremos más adelante en este proyecto. El circuito se da a continuación
Nuevamente, puede usar el pin de 3.3V en Arduino Uno o usar un regulador de 3.3V separado. En este proyecto he utilizado el regulador de voltaje integrado. La tabla de conexiones de clavijas se proporciona a continuación para ayudarlo a realizar las conexiones fácilmente.
Módulo LoRa SX1278 | Placa Arduino UNO |
3,3 V | 3,3 V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Dado que el módulo no cabe en una placa de pruebas, he utilizado los cables de conexión directamente para realizar las conexiones. Una vez realizada la conexión, la configuración de Arduino LoRa se verá así a continuación
pyLoRa para Raspberry Pi
Hay muchos paquetes de Python que puede usar con LoRa. También comúnmente, la Raspberry Pi se usa como LoRaWAN para obtener datos de múltiples nodos LoRa. Pero, en este proyecto nuestro objetivo es hacer comunicación Peer to Peer entre dos módulos Raspberry Pi o entre una Raspberry Pi y un Arduino. Entonces, decidí usar el paquete pyLoRa. Tiene módulos rpsreal LoRa Arduino y rpsreal LoRa Raspberry pi que se pueden usar en el entorno Arduino y Raspberry Pi. Por ahora, centrémonos en el entorno Raspberry Pi.
Configuración del módulo Raspberry Pi para LoRa
Como se dijo anteriormente, el módulo LoRa funciona con la comunicación SPI, por lo que debemos habilitar SPI en Pi y luego instalar el paquete pylora . Siga los pasos a continuación para hacer lo mismo, después de abrir la ventana de terminal de Pi. Nuevamente, estoy usando masilla para conectarme a mi Pi, puede usar su método conveniente.
Paso 1: Ingrese a la ventana de configuración usando el siguiente comando. Para obtener la ventana de abajo
sudo raspi-config
Paso 2: Navegue a las opciones de interfaz y habilite SPI como se muestra en la imagen a continuación. Tenemos que habilitar la interfaz SPI porque, como comentamos, la pantalla LCD y PI se comunican a través del protocolo SPI.
Paso 3: guarde los cambios y vuelva a la ventana de la terminal. Asegúrese de que pip y python estén actualizados y luego instale el paquete RPi.GPIO usando el siguiente comando.
pip instalar RPi.GPIO
Esta clase de paquete nos ayudará a controlar el pin GPIO en la Pi. Si se instaló correctamente, su pantalla se verá así
Paso 4: De manera similar, proceda con la instalación del paquete spidev usando el siguiente comando. Spidev es un enlace de Python para Linux que se puede utilizar para realizar comunicaciones SPI en Raspberry Pi.
pip instalar spidev
Si la instalación es exitosa, la terminal debería verse así a continuación.
Paso 5: A continuación, instalemos el paquete pyLoRa usando el siguiente comando pip. Este paquete instala los modelos de radio asociados con LoRa.
pip instalar pyLoRa
Si la instalación es exitosa, verá la siguiente pantalla.
El paquete PyLoRa también admite comunicación cifrada que se puede usar con Arduino y Raspberry Pi sin problemas. Esto mejorará la seguridad de los datos en su comunicación. Pero debe instalar un paquete separado después de este paso, lo cual no estoy haciendo ya que el cifrado no está en el alcance de este tutorial. Puede seguir los enlaces de github anteriores para obtener más detalles.
Después de este paso, puede agregar la información de la ruta del paquete a pi e intentarlo con el programa Python que se proporciona al final. Pero no pude agregar la ruta correctamente y, por lo tanto, tuve que descargar manualmente la biblioteca y usar la misma directamente para mis programas. Entonces tuve que continuar con los siguientes pasos
Paso 6: Descargue e instale el paquete python-rpi.gpio y el paquete spidev usando el siguiente comando.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
La ventana de la terminal debería mostrar algo como esto después de ambas instalaciones.
Paso 7: también instale git y luego úselo para clonar el directorio de Python para nuestra Raspberry Pi. Puedes hacerlo usando los siguientes comandos.
sudo apt-get install git sudo git clone
Una vez que haya completado este paso , debe encontrar el subdirectorio SX127x en la carpeta de inicio de Raspberry Pi. Esto tendrá todos los archivos necesarios asociados con la biblioteca.
Programando Raspberry Pi para LoRa
En una comunicación LoRa peer to peer, el módulo que transmite la información se llama servidor y el módulo que recibe la información se llama cliente. En la mayoría de los casos, el Arduino se usará en el campo con un sensor para medir datos y el Pi se usará para recibir estos datos. Entonces, decidí usar Raspberry Pi como cliente y Arduino como servidor en este tutorial. El programa cliente completo de Raspberry Pi se puede encontrar en la parte inferior de esta página. Aquí intentaré explicar las líneas importantes del programa.
Precaución: asegúrese de que el archivo del programa esté en el mismo directorio donde se encuentra la carpeta de la biblioteca SX127x. Puede copiar esta carpeta y usarla en cualquier lugar si desea portar el proyecto.
El programa es bastante simple, tenemos que configurar el módulo LoRa para que funcione en 433Mhz y luego escuchar los paquetes entrantes. Si recibimos algo, simplemente lo imprimimos en la consola. Como siempre, comenzamos el programa importando las bibliotecas de Python necesarias.
desde el tiempo import sleep desde SX127x.LoRa import * from SX127x.board_config import BOARD BOARD.setup ()
En este caso, el paquete de tiempo se usa para crear retrasos, el paquete Lora se usa para la comunicación LoRa y board_config se usa para configurar la placa y los parámetros de LoRa. También configuramos la placa usando la función BOARD.setup () .
A continuación, creamos la clase Python LoRa con tres definiciones. Dado que solo aplicamos sangría para que el programa funcione como un cliente de frambuesa, la clase solo tiene tres funciones, a saber, la clase init, la clase de inicio y la clase on_rx_done . La clase init inicializa el módulo LoRa en 433MHz con un ancho de banda de 125kHz como se establece en el método set_pa_config . Luego, también pone el módulo en modo de suspensión para ahorrar consumo de energía.
# Los valores predeterminados de rango medio después de init son 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 chips / símbolo, CRC en 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (detallado) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
La función de arranque es donde configuramos el módulo como receptor y obtenemos como RSSI (Indicador de recepción intensidad de la señal), el estado, la frecuencia de funcionamiento, etc. Configuramos el módulo para que funcione en modo receptor continuo (RXCONT) desde el modo de suspensión y luego usamos un bucle while para leer valores como RSSI y el estado del módem. También descargamos los datos del búfer en serie en el terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Finalmente, la función on_rx_done se ejecuta después de leer el paquete entrante. En esta función, los valores recibidos se mueven a una variable llamada carga útil desde el búfer de Rx después de establecer el indicador de recepción en alto. Luego, los valores recibidos se decodifican con utf-8 para imprimir datos legibles por el usuario en el shell. También volvemos a poner el módulo en modo de suspensión hasta que se reciba otro valor.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'ignore')) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
La parte restante del programa es simplemente imprimir los valores recibidos en la consola y terminar el programa usando una interrupción del teclado. Nuevamente configuramos la placa en modo de suspensión incluso después de la finalización del programa para ahorrar energía.
intente: lora.start () excepto KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") finalmente: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Código Arduino para LoRa para comunicarse con Raspberry Pi
Como mencioné anteriormente, el código rpsreal es compatible con Arduino y Pi y, por lo tanto, es posible la comunicación entre Arduino y Pi. Funciona basado en la biblioteca de Radiohead de AirSpayce. Por lo tanto, primero debe instalar la biblioteca de cabezales de radio en su Arduino IDE.
Para hacerlo, visite la página de Github y descargue la biblioteca en la carpeta ZIP. Luego colóquelo en la carpeta de la biblioteca de su Arduino IDE. Ahora, reinicie el IDE de Arduino y encontrará archivos de ejemplo para la biblioteca principal de Radio. Aquí programaremos el Arduino para que funcione como un servidor LoRa para enviar paquetes de prueba como 0 a 9. El código completo para hacer lo mismo se puede encontrar en la parte inferior de esta página como siempre. Aquí explicaré algunas líneas importantes del programa.
Comenzamos el programa importando la biblioteca SPI (instalada por defecto) para usar el protocolo SPI y luego la biblioteca RH_RF95 del cabezal de radio para realizar la comunicación LoRa. Luego definimos a qué pin de Arduino hemos conectado el pin de selección de chip (CS), Reset (RST) e Interrupción (INT) del LoRa con Arduino. Finalmente también definimos que el módulo debe funcionar en una frecuencia de 434MHz e inicializar el módulo LoRa.
#incluir
Dentro de la función de configuración , reiniciaremos el módulo LoRa tirando de su pin de reinicio a bajo durante 10 milisegundos para comenzar de nuevo. Luego lo inicializamos con el módulo que creamos anteriormente usando la biblioteca Radio head. Luego, configuramos la frecuencia y la potencia de transmisión para el servidor LoRa. Cuanto mayor sea la transmisión, más distancia viajarán los paquetes, pero consumirán más energía.
void setup () { // Inicializar Serial Monitor Serial.begin (9600); // Restablecer pinMode del módulo LoRa (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, BAJO); retraso (10); escritura digital (RFM95_RST, ALTA); retraso (10); // Inicializar el módulo LoRa while (! Rf95.init ()) { Serial.println ("Error de inicialización de radio LoRa"); mientras (1); } // Establezca la frecuencia predeterminada 434.0MHz if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); mientras (1); } rf95.setTxPower (18); // Potencia de transmisión del Módulo Lora }
Dentro de la función de bucle infinito, simplemente tenemos que enviar el paquete de datos a través del módulo LoRa. Estos datos pueden ser cualquier cosa como el valor del sensor del comando del usuario. Pero para simplificar, enviaremos un valor de carácter de 0 a 9 para cada intervalo de 1 segundo y luego inicializaremos el valor de nuevo a 0 después de llegar a 9. Tenga en cuenta que los valores solo se pueden enviar en un formato de matriz de caracteres y el tipo de datos debe ser unit8_t que es 1 byte a la vez. El código para hacer lo mismo se muestra a continuación.
bucle vacío () { Serial.print ("Enviar:"); char radiopacket = char (valor)}; rf95.send ((uint8_t *) paquete de radio, 1); retraso (1000); valor ++; si (valor> '9') valor = 48; }
Probando la comunicación LoRa entre Raspberry Pi y Arduino
Ahora que tenemos tanto nuestro hardware como el programa listos, simplemente tenemos que cargar el código Arduino en la placa UNO y el boceto de Python debe iniciarse en pi. Mi configuración de prueba con el hardware conectado, se parece a esto a continuación
Una vez que se inicia el boceto del cliente de Python en Pi (use solo Python 3), si todo funciona correctamente, debería ver los paquetes Arduino recibidos en pi a través de la ventana de shell. Debería notar "Recibido: 0" a 9 como se muestra en la imagen a continuación.
El código completo de Raspberry pi con todas las bibliotecas necesarias se puede descargar desde aquí.
Ahora puede mover el servidor Arduino y verificar el rango del módulo; también es posible mostrar el valor RSSI en el shell si es necesario. El funcionamiento completo del proyecto se puede encontrar en el video vinculado a continuación. Ahora que sabemos cómo establecer una comunicación LoRa de baja potencia a larga distancia entre Arduino y Raspberry pi, podemos proceder a agregar un sensor en el lado de Arduino y la plataforma en la nube en el lado de Pi para hacer un paquete completo de IoT.
Espero que haya entendido el proyecto y haya disfrutado construyéndolo. Si tiene problemas para hacer que funcione, utilice la sección de comentarios a continuación o los foros para otras consultas técnicas.