Cómo conectar una RaspberryPi y Arduino por RF

En este tutorial vamos a ver como utilizar el módulo de bajo costo/consumo NRF24L01 para comunicar una RaspberryPI (RPi) con una Arduino.

Del lado de la Arduino se utiliza el entorno de programación de la Arduino (simil C#), y del lado de la RPi tenemos la opción de utilizar librerías para C++ o Python.

Vamos a asumir cierto conocimiento sobre el entorno de programación de Arduino y algo de Linux ya que configuraremos el módulo RF en la RPi a través de la consola. También, el programa que correrá en la RPi está escrito en Python, por lo que si queremos modificarlo tendremos que aprender un poquito sobre el lenguaje.  Estaremos utilizando las librerías RF24, que ya incluyen versiones para ambos dispositivos. Por lo tanto necesitarás clonar el proyecto, o bien bajarte el empaquetado del enlace anterior.

Lado Arduino

Primero vamos a ver como configurar el Arduino. El diagrama de conexiones se puede ver mas abajo, aunque puede servir saber que tendremos libertad de reemplazar los pines 9 y 10 por dos pines cualquiera.

Antes que nada, es necesario instalar la librería. No estoy seguro si el suite de Arduino ya contiene las librerías RF24, pero de no ser así necesitarás copiar la carpeta RF24 a la carpeta de Arduino (la ubicación de esta carpeta depende de tu sistema operativo. Puedes ver como instalar librerías automáticamente aquí ).

Ahora podemos conectar el módulo nRF24l01 como lo indica el diagrama:

PIN NRF24L01 Arduino UNO
1 GND GND
2 VCC 3.3V
3 CE digIO 9
4 CSN digIO 10
5 SCK digIO 13
6 MOSI digIO 11
7 MISO digIO 12
8 IRQ

Una vez hecho eso, vamos a grabar el programa de ejemplo “GettingStarted” en la memoria de la Arduino, cambiando los números (7,8) en la línea 16 del código a los pines que se eligieron para conectar los pines CE y CSN respectivamente (9 y 10 en el diagrama que mostramos aquí). Este ejemplo empieza escuchando la radio en espera de un mensaje que llegue. Si se ingresa la letra ‘T’ a través de la consola serial, entra en modo transmición, enviando una sucesión de números y presentando en pantalla el resultado del envío.

Una vez cargado el programa podemos abrir una consola serial (a 57600 baud) y veremos unas lineas de inicialización del modulo, y a continuación se quedará esperando una señal. Si mandamos la letra “T” a través de la consola estaremos seteando la arduino en modo transmición, y deberíamos ver como falla en obtener una respuesta una y otra vez (por supuesto, falta programar la RPi).

Lado Raspberry Pi

Antes que nada, para poder utilizar los puertos GPIO de la Raspberry será necesario activarlos utilizando el comando

raspi-config

desde una consola y eligiendo la opción correspondiente. Les pedirá que reinicien, momento en el cual pueden aprovechar para conectar el módulo a la Raspberry como se muestra en el diagrama (ojo, verificar que se trata de una Raspberry Pi modelo B rev 2, o alguna que tenga el puerto P1. Principalmente tienen que tener mucho cuidado de no conectar el positivo al negativo y viceversa ya que esto quemaría el módulo al instante. Si pueden, les recomiendo colocar un diodo en el pin GND sólo por seguridad).

PIN NRF24L01 RPI Conector
RPi -P1
1 GND rpi-gnd (6)
2 VCC rpi-3v3 (1)
3 CE rpi-gpio22 (22)*
4 CSN rpi-gpio8 (24)*
5 SCK rpi-sckl (23)
6 MOSI rpi-mosi (19)
7 MISO rpi-miso (21)
8 IRQ

* estos pines deben ser especificados al iniciar la radio en el programa, por lo que es bueno tenerlos anotados.

Una vez prendida la RPi nuevamente, ingresan estos comandos desde una consola para instalar las librerías:

cd ~
git clone https://github.com/tmrh20/RF24.git RF24 
cd RF24 
sudo make install 
cd examples_RPi 

Ahora es necesario cambiar los pines que aparecen en el código de ejemplo, ya que no usan los mismos que mostramos aquí. Para eso pueden abrir el archivo de ejemplos gettingstarted.cpp y cambiar la línea 45 a:

RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);

Luego podemos compilar y correr el script

make
sudo ./gettingstarted 

Si la Arduino sigue conectada y en modo transmisión (y el espíritu de la máquina está satisfecho), deberán ver unos números que indican que la comunicación fue exitosa. Se puede cambiar el modo en los dos programas para comprobar que se tiene comunicación en las dos direcciones.

Si quieren probar los demás scripts de ejemplo, necesitan encontrar y cambiar la definición de pines en la línea de código que inicia la radio.

Eso es todo. Más adelante veremos qué utilidades puede tener este tipo de comunicaciones.

Fuentes:

Extras:

Acá les dejo unas placas que diseñe en Eagle por si les interesa aplicar el tutorial anterior. 

NRF24L01 – PLACAS

2 opiniones en “Cómo conectar una RaspberryPi y Arduino por RF”

  1. buenas noches para empezar una felicitación por tu blog pero tengo una duda aqui se usa una raspberry con puerto rev 2 y yo tengo una conexion GPIO de 40 pines modelo B+ V1.2 por lo cual no entiendo como se debe conectar???

    1. http://elecurls.tripod.com/images/rpi-b-pinout.jpg
      ahi arriba enlazo una imagen con el pinout de la RPi B+.
      Lo importante es ubicar los pines según los nombres:
      MOSI, MISO, SCLK, 3.3V, GND, GPIO8 y GPIO22.
      Como podes ver en el pinout, esto corresponde a los pines
      19, 21, 23, 17, 20, 24 y 15 (en realidad para los pines 3.3V y GND tenes varias opciones, deberías poder usar cualquiera de ellas)
      Finalmente, en el código tenés que indicarle los pines en el constructor de radio, que por algún motivo hacen referencia al pin físico de la placa en vez de usar el nombre genérico “GPIO 8” y “GPIO 22”, y dejar que el sistema los redirija a los pines correspondientes.
      Según veo en internet, el constructor puede escribirse de la siguiente manera:
      RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);

      Fijate que lo único que cambia son los nombres de los pines a los que va conectado el nRF24, haciendo referencia a la placa RPI y al pin físico utilizado (15 y 24 en este caso).

      Espero que con esto ya logres conectar.

      Suerte!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *