Intro

Conectar un proyecto de cualquier magnitud para compartir datos en tiempo real es clave y necesario. Muchas veces los protocolos para enviar y recibir información suelen no ser los adecuados o no están disponibles en el área donde los necesitamos. Esto me paso en un proyecto donde tenia que conectar dos Raspberry Pis para compartir información de manera rápida y con ciertas limitantes.

photo_2017-09-20_22-11-40

En ocasiones con abrir un simple socket por medio de la red y enviar información es suficiente; pero que sucede cuando no hay red, cuando no se puede usar una conexión Bluetooth y quieres un rápido movimiento de datos entre dispositivos.

Mi solución fue utilizar SDR(Software Defined Radio) por ser practico y barato. Hay diferentes tecnologías que pueden ayudar a mandar señales de radio de un dispositivo a otro(P2P) de una manera sencilla, practica y a distancia, como lo es el caso de LoRa. Los primeros manuales que estuvieron disponibles de LoRa en español fueron los del buen amigo SabasHaciendo IoT con LoRa.

Screen Shot 2017-12-11 at 9.39.03 PM.png

El “problema” que tuve con LoRa fue que no tenía ningún dispositivo disponible a la mano. Revise en mi gabinete de chucherías, de esas cosas que mantengo amontonadas en un rincón para cuando se necesiten y solo encontré dos SDR CC1101. Los radios CC1101 son muy prácticos ya que los puedes manejar en diferentes frecuencias(315/433/868/915MHZ) para velocidad o distancia utilizando software.

Haciendo referencia a un post anterior acerca de Raspberry Pi y el transrecividor CC1101 en el cual explico lo que son las conexiones usando el puerto SPI de la Raspberry. Ahí describo como junto con Sabas creamos un prototipo para poder montar el SDR de una manera rápida y compacta usando un pequeña PCB(Print Circuit Board)

El Programa y el Problema

El CC1101 cuenta con una librería muy buena y compacta en lenguaje C, la cual se puede descargar directamente desde este repositorio; esta librería está diseñada para enviar y recibir datos en archivos separados para Arduino o Raspberry Pi(RX_Demo y TX_Demo) ¿Pero qué pasa cuando quieres recibir y transmitir rápidamente? Si pensaste en tener un receptor.c y un emisor.c para que hagan el trabajo, no es una idea tan descabellada.

El problema es que no se puede manejar un “full duplex” desde el GPIO de la Raspberry Pi. Lo que si se puede hacer es integrar el código del emisor y receptor en un mismo archivo y darle velocidad al código y generar un half duplex.

En este post lo que trataremos de hacer es crear un archivo que pueda funcionar como emisor y receptor simultáneamente. Así solo se tendrá que copiar un solo archivo a la máquina que desee y cambiarlo con ciertos parámetros como el número de receptor y emisor, así crearemos un código compacto.

Comencemos analizando el corazón del archivo emisor(TX_Demo.cpp) Agregue comentarios en la imagen para entender un poco el comportamiento del programa.

Screen Shot 2017-12-11 at 9.22.22 PM

Por otra parte, en el archivo receptor(RX_Demo.cpp) tenemos el siguiente código:

Screen Shot 2017-12-11 at 9.18.08 PM

Ahora lo que hice fue modificar el TR_Demo.cpp y combiné ambos archivos en TR_main.cpp:

Screen Shot 2017-12-11 at 9.18.22 PM.png

Lo que hace este código es crear un programa que revisa si hay paquetes nuevos y si no los hay, envía datos al receptor. Si se corriera este programa en dos Raspberries diferentes usando los CC1101 sobre el GPIO la única modificación que se tendría que hacer sería el emisor y el receptor al momento de ejecución:

Raspberry Pi 1> sudo ./TR_main -a3 -r1 -i1000 -t10 -c1 -f434 -m100

Raspberry Pi 2> sudo ./TR_main -a1 -r3 -i1000 -t10 -c1 -f434 -m100

-a: dirección del emisor
-r: dirección del receptor
-i: enviar mensaje en cuantos milisegundos
-t: número de intentos para enviar el paquete
-c: canal de transmisión
-f: frecuencia
-m: modulación

dkwtmgbvoaaqnrm

Puedes encontrar más detalles en el repositorio de SpaceTeddy


Probando el programa: