Hacklab ASU logo Hacklab ASUHacer, reparar, aprender juntos
Electrónica

Cómo conectar una RaspberryPi y Arduino por RF

Tengo una placa Arduino en el patio midiendo la humedad de una maceta y una Raspberry Pi dentro de casa guardando los datos. Entre las dos hay una pared de ladrillo, unos ocho metros y ningún cable.

Ilustración abstracta para Cómo conectar una RaspberryPi y Arduino por RF

Tengo una placa Arduino en el patio midiendo la humedad de una maceta y una Raspberry Pi dentro de casa guardando los datos. Entre las dos hay una pared de ladrillo, unos ocho metros y ningún cable. Lo que las une es un módulo NRF24L01 de cada lado, una plaquita del tamaño de una uña que cuesta menos que un café y que, cuando funciona, parece magia. Cuando no funciona, parece una broma pesada.

Esta guía está pensada para la segunda situación: explico cada pieza en orden y cierro con las fallas que más vi repetirse en el taller.

Qué es exactamente el NRF24L01

Es un transceptor de radio de 2,4 GHz, la banda del wifi: puede enviar y recibir, aunque no a la vez. Se comunica por SPI, un bus de cuatro líneas donde un dispositivo manda (el maestro) y otro obedece. El maestro es la Arduino o la Pi; el módulo siempre obedece.

Algunos datos que conviene tener a mano:

  • Velocidad de aire configurable en 250 kbps, 1 Mbps o 2 Mbps.
  • Paquetes de hasta 32 bytes de carga útil.
  • 125 canales posibles, separados por 1 MHz.
  • Alcance de 10 a 30 metros en interior con la versión de antena impresa; la versión con amplificador y antena externa (PA/LNA) llega mucho más lejos, pero consume bastante más.
  • Alimentación entre 1,9 y 3,6 V.

La alimentación de 3,3 V, el detalle que decide todo

El módulo se alimenta con 3,3 V. Nunca con 5 V. Las líneas de datos toleran 5 V en la mayoría de los ejemplares, por eso la Arduino Uno puede hablarle directamente, pero el pin VCC no. Si lo conectás al pin de 5 V, en el mejor caso deja de responder; en el peor, se calienta y queda inservible.

Ahora bien, tener 3,3 V no alcanza. El NRF24L01 consume muy poco en reposo, pero en el instante en que transmite pide picos de corriente de unos 12 a 15 mA, y la versión con amplificador puede pasar de 100 mA. El regulador de 3,3 V de una Arduino Uno clónica muchas veces no responde con la rapidez suficiente y la tensión cae justo cuando el módulo la necesita. El resultado son transmisiones que fallan una de cada tres veces sin ningún patrón visible.

La solución es barata: un capacitor electrolítico de 10 µF (yo uso 47 µF cuando tengo) soldado lo más cerca posible de VCC y GND del módulo, respetando la polaridad. Actúa como una pequeña reserva que cubre los picos. En la Pi también lo pongo: cuesta centavos y elimina una variable del diagnóstico.

Cableado, pin por pin

El módulo tiene ocho pines en dos filas de cuatro; el del recuadro cuadrado es GND. Estas son mis conexiones en una Arduino Uno o Nano:

  1. GND del módulo a GND de la Arduino.
  2. VCC del módulo a 3,3 V de la Arduino, con el capacitor en paralelo.
  3. CE al pin digital 7. Este pin activa la radio para transmitir o escuchar.
  4. CSN al pin digital 8. Le indica al módulo que el mensaje SPI es para él.
  5. SCK al pin 13, MOSI al pin 11 y MISO al pin 12. Estos tres son fijos en la Uno porque son el SPI por hardware.
  6. IRQ queda libre. Sirve para interrupciones, pero para empezar no hace falta.

En la Raspberry Pi la lógica es la misma, con otros números. Los pines SPI0 del conector de 40 pines son: MOSI en el físico 19, MISO en el 21, SCK en el 23 y CE0 en el 24, que usaremos como CSN. El CE de la radio va a un GPIO cualquiera; yo elijo el GPIO 22, que es el pin físico 15. Alimentación en el pin físico 1 (3,3 V) y masa en el 6. Antes de conectar nada, habilitá la interfaz SPI desde la herramienta de configuración del sistema y reiniciá. Sin ese paso, la Pi no ve el bus aunque el cableado esté perfecto.

Usá cables cortos, de 10 cm o menos; los dupont de 20 cm suelen dar errores intermitentes.

Librerías y la primera prueba

Del lado de Arduino, la librería más usada se llama RF24 y se instala desde el gestor de librerías del propio entorno, buscando ese nombre. Trae varios ejemplos; el más útil para empezar es el que hace un "ping" de ida y vuelta. Al abrirlo vas a ver dos números al principio que indican los pines CE y CSN. Cambialos por 7 y 8 si seguiste mi cableado, o por los que hayas usado.

En la Raspberry Pi existe la misma librería con envoltorio para Python; compilarla tarda unos 5 minutos en una Pi 3. Ambos programas deben coincidir en tres parámetros:

  • El mismo canal, por ejemplo el 76.
  • La misma velocidad de aire. Para la primera prueba elegí 250 kbps, que llega más lejos y perdona más.
  • Direcciones de tubería cruzadas: lo que una escribe es lo que la otra lee.

La prueba: la Arduino envía cada segundo un número que aumenta en uno, y la Pi lo muestra en la terminal. Si después de 60 segundos ves 60 números seguidos, sin huecos, el enlace es sano. Si ves 41, tenés un problema de alimentación o de distancia, y conviene resolverlo ahora y no cuando el sensor ya esté atornillado en el patio.

Si en algún momento querés llevar esto a algo más lúdico, el mismo par de radios sirve para armar mandos inalámbricos; en el taller lo probamos con una consola emulada, algo que se cuenta en cómo la Raspberry Pi revive consolas y juegos retro.

Lo que dicen los foros y no siempre es cierto

El consejo más repetido es "subí la potencia al máximo". No como primer paso. Al máximo, el consumo sube y, con los módulos a menos de un metro, el receptor se satura y pierde paquetes. Lo vi pasar en una mesa de trabajo: dos radios a 30 cm, potencia máxima, 20 % de pérdidas. Bajamos a potencia mínima y la pérdida fue cero.

Mi orden es otro: primero potencia baja y 250 kbps, con las placas a dos o tres metros. Cuando eso anda sin fallas, alejás una placa y solo entonces subís la potencia, de a un nivel.

Una radio que funciona a medias es peor que una que no funciona, porque te hace dudar del código cuando el problema es eléctrico.

Fallas comunes y cómo reconocerlas

Estas son las que más se repiten, con el síntoma que producen:

  • Los registros leen todos 0x00 o 0xFF. La Pi o la Arduino no hablan con el módulo. Revisá MISO y MOSI, que se invierten con facilidad, y que SPI esté habilitado.
  • Funciona un rato y después se cuelga. Casi siempre es alimentación. Capacitor, o una fuente de 3,3 V externa con masa común.
  • El emisor dice que envió, pero el receptor no ve nada. Canal, velocidad o dirección distintos en cada programa. Imprimí la configuración de ambos lados y comparala línea por línea.
  • Pierde paquetes cerca de un router. El canal elegido está pisado por el wifi. Probá canales altos, del 100 en adelante, que quedan fuera de la mayoría de las redes domésticas.
  • Uno de los módulos nunca funciona. Hay clones defectuosos: en un lote de diez, dos no respondían. Cambialo antes de depurar una tarde entera.

Si llegaste hasta acá con los dos programas intercambiando números, ya tenés la base para cualquier proyecto de sensores. El paso siguiente que recomiendo para esta semana es dejar el enlace corriendo una noche entera y contar a la mañana cuántos paquetes se perdieron. Ese número te dice más sobre tu montaje que cualquier diagrama, y si querés ver otras ideas donde la electrónica se mezcla con el juego, pasá por la electrónica escondida dentro de los mundos de juego.

LB
Lucía Benítez

Lucía empezó reparando radios viejas en la mesa de la cocina y hoy escribe sobre circuitos, Arduino y radiofrecuencia sin dar nada por sabido.

More posts by Lucía

More from the blog