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:
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???
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!