¿Quieres añadir capacidades inalámbricas a tu próximo proyecto Arduino, por menos del precio de una taza de café? ¡Bueno, entonces los módulos transmisores y receptores de RF de 433MHz son justo para ti! A menudo se pueden conseguir en línea por menos de dos dólares el par, lo que los convierte en una de las opciones de comunicación de datos más baratas que se pueden conseguir. Y lo mejor de todo, estos módulos son súper pequeños, lo que le permite incorporar una interfaz inalámbrica en casi cualquier proyecto.
Resumen de hardware
Veamos más de cerca los Módulos Transmisor y Receptor RF de 433MHz.
Este pequeño módulo es un transmisor entre dos. Es realmente simple como parece. El corazón del módulo es el resonador SAW que está sintonizado para el funcionamiento de 433,xx MHz. Hay un transistor de conmutación y unos pocos componentes pasivos, eso es todo.
Cuando se aplica un ALTO lógico a la entrada DATA, el oscilador funciona produciendo una onda portadora de salida de RF constante a 433,xx MHz y cuando la entrada DATA se lleva a BAJO lógico, el oscilador se detiene. Esta técnica se conoce como Amplitude Shift Keying, de la que hablaremos en detalle en breve.
Este es un módulo receptor. Aunque parece complejo, es tan sencillo como el módulo transmisor. Consiste en un circuito sintonizado de RF y un par de amplificadores OP para amplificar la onda portadora recibida del transmisor. La señal amplificada se alimenta además a un PLL (Phase Lock Loop) que permite al decodificador «bloquear» un flujo de bits digitales que proporciona una mejor salida decodificada e inmunidad al ruido.
ASK – Amplitude Shift Keying
Como se ha comentado anteriormente, para enviar los datos digitales por radio, estos módulos utilizan una técnica llamada Amplitude Shift Keying o ASK. En la codificación por desplazamiento de amplitud, la amplitud (es decir, el nivel) de la onda portadora (en nuestro caso es una señal de 433MHz) se cambia en respuesta a la señal de datos entrante.
Esto es muy similar a la técnica analógica de modulación de amplitud con la que puede estar familiarizado si está familiarizado con la radio AM. A veces se llama modulación de amplitud binaria porque sólo hay dos niveles que nos preocupan. Usted puede pensar en ello como un interruptor ON/OFF.
- Para Digital 1 – Esto impulsa la portadora a plena potencia.
- Para Digital 0 – Esto corta la portadora por completo.
Así es como la modulación de amplitud parece:
La modulación de amplitud tiene la ventaja de ser muy simple de implementar. Es bastante sencillo diseñar el circuito decodificador. Además, ASK necesita menos ancho de banda que otras técnicas de modulación como FSK (Frequency Shift Keying). Esta es una de las razones de su bajo coste.
La desventaja, sin embargo, es que ASK es susceptible a las interferencias de otros dispositivos de radio y al ruido de fondo. Pero siempre que mantenga su transmisión de datos a una velocidad relativamente lenta puede funcionar de forma fiable en la mayoría de los entornos.
433MHz RF Transmitter & Receiver Pinout
Vamos a echar un vistazo a la pinout de 433MHz RF Transmitter and Receiver Modules.
El pin DATA acepta los datos digitales que se van a transmitir.
VCC suministra energía para el transmisor. Puede ser cualquier tensión DC positiva entre 3,5V y 12V. Tenga en cuenta que la salida de RF es proporcional a la tensión de alimentación, es decir, cuanto mayor sea la tensión, mayor será el alcance.
GND es un pin de tierra.
Antenna es un pin para la antena externa. Como se ha comentado anteriormente, querrá soldar un trozo de cable sólido de 17,3 cm a esta patilla para mejorar el alcance.
VCC suministra energía para el receptor. A diferencia del transmisor, la tensión de alimentación del receptor debe ser de 5V.
Los pines DATA dan salida a los datos digitales recibidos. Los dos pines centrales están unidos internamente, por lo que puede utilizar cualquiera de ellos para la salida de datos.
GND es un pin de tierra.
Antenna es un pin para la antena externa que a menudo no está marcado. Es la almohadilla en la parte inferior izquierda del módulo, justo al lado de la pequeña bobina. De nuevo, querrás soldar un trozo de cable sólido de 17,3 cm a este pin para mejorar el alcance.
Cableado – Conexión del transmisor y receptor de RF de 433MHz a Arduino UNO
¡Ahora que sabemos todo sobre los módulos es el momento de ponerlos en práctica!
Como vamos a enviar datos entre dos placas Arduino, necesitaremos por supuesto dos placas Arduino, dos breadboards y un par de cables de puente.
El cableado del transmisor es bastante sencillo. Sólo tiene tres conexiones. Conecta el pin VCC al pin 5V y GND a tierra en el Arduino. El pin de entrada de datos debe conectarse al pin digital #12 del Arduino. Debes intentar utilizar el pin 12 ya que por defecto la librería que utilizaremos en nuestro sketch utiliza este pin para la entrada de datos.
La siguiente ilustración muestra el cableado.
Una vez que tengas el transmisor cableado puedes pasar al receptor. El cableado del receptor es tan fácil como el del transmisor.
Una vez más sólo hay que hacer tres conexiones. Conecte el pin VCC a 5V pin y GND a tierra en el Arduino. Cualquiera de los dos pines de salida de datos del medio debe conectarse al pin digital nº 11 del Arduino.
Así es como debe quedar el cableado del receptor.
Ahora que tanto el transmisor como el receptor están cableados necesitaremos escribir algo de código y enviarlo a las respectivas placas Arduino. Como probablemente sólo tengas un PC, empezaremos por el transmisor. Una vez cargado el código allí, pasaremos al receptor. El Arduino al que está conectado el transmisor puede alimentarse mediante una fuente de alimentación o una batería.
Librería RadioHead – una navaja suiza para módulos inalámbricos
Antes de empezar a codificar, hay una librería llamada RadioHead que necesitaremos instalar en nuestro IDE de Arduino y que hará que escribir el código sea mucho más sencillo.
RadioHead es una librería que permite una sencilla transferencia de datos entre placas Arduino. Es tan versátil que se puede utilizar para manejar todo tipo de dispositivos de comunicación por radio, incluyendo nuestros módulos de 433MHz.
Lo que hace la librería RadioHead es tomar nuestros datos, encapsularlos en un paquete de datos que incluye un CRC (Cyclic Redundancy Check) y luego enviarlo con el preámbulo y la cabecera necesarios a otro Arduino. Si los datos se reciben correctamente, el Arduino receptor es informado de que hay datos disponibles y procede a decodificarlos y actuar sobre ellos.
El paquete RadioHead se compone de la siguiente manera: Al inicio de cada transmisión se envía un flujo de 36 bits de pares de bits «1» y «0», llamado «Preámbulo de entrenamiento». Estos bits son necesarios para que el receptor ajuste su ganancia antes de recibir los datos reales. A continuación, se envía un «Símbolo de Inicio» de 12 bits y, a continuación, se añaden los datos reales (carga útil).
Al final del paquete se añade una Secuencia de Comprobación de Trama o CRC que es recalculada por RadioHead en el extremo del receptor y, si la comprobación CRC es correcta, se avisa al dispositivo receptor. Si la comprobación CRC falla, el paquete se descarta.
El paquete completo tiene el siguiente aspecto:
Puedes descargar la librería, visitando la web airspayce.com o, simplemente haga clic en este botón para descargar el zip:
Para instalarla, abra el IDE de Arduino, vaya a Sketch > Incluir biblioteca > Añadir biblioteca .ZIP, y luego seleccione el archivo RadioHead que acaba de descargar. Si necesitas más detalles sobre la instalación de una librería, visita este tutorial Instalar una librería Arduino.
Código Arduino – Para el transmisor RF de 433MHz
En nuestro experimento nos limitaremos a enviar un simple mensaje de texto desde el transmisor al receptor. Será útil para entender cómo utilizar los módulos y puede servir como base para experimentos y proyectos más prácticos.
Aquí está el sketch que utilizaremos para nuestro transmisor:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init();} void loop(){ const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);}
Es un sketch bastante corto pero es todo lo que necesitas para conseguir transmitir una señal.
El sketch comienza incluyendo la librería RadioHead ASK. También necesitamos incluir la librería Arduino SPI ya que la librería RadioHead depende de ella.
#include <RH_ASK.h>#include <SPI.h>
A continuación, necesitamos crear un objeto ASK para poder acceder a las funciones especiales relacionadas con la librería RadioHead ASK.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
En la función setup, necesitamos inicializar el objeto ASK.
// Initialize ASK Objectrf_driver.init();
En la función loop, empezamos preparando un mensaje. Es una simple cadena de texto y se almacena en un puntero de caracteres llamado msg. Tenga en cuenta que, su mensaje puede ser cualquier cosa, pero no debe exceder de 27 caracteres para un mejor rendimiento. Y asegúrese de contar el número de caracteres en él, ya que necesitará ese conteo en el código del receptor. En nuestro caso, tenemos 11 caracteres.
// Preparing a messageconst char *msg = "Hello World";
El mensaje se transmite entonces utilizando una función send()
. Tiene dos parámetros: el primero es la matriz de datos y el segundo es el número de bytes (longitud de los datos) que hay que enviar. La función send()
es usualmente seguida por la función waitPacketSent()
que espera hasta que cualquier paquete de transmisión anterior termine de ser transmitido. Después de eso el sketch espera un segundo para dar tiempo a nuestro receptor a recibir todo.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Código Arduino – Para el receptor RF de 433MHz
Conecta el Arduino receptor al ordenador y carga el siguiente código:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init(); // Setup Serial Monitor Serial.begin(9600);} void loop(){ // Set buffer to size of expected message uint8_t buf; uint8_t buflen = sizeof(buf); // Check if received packet is correct size if (rf_driver.recv(buf, &buflen)) { // Message received with valid checksum Serial.print("Message Received: "); Serial.println((char*)buf); }}
Al igual que el cade transmisor, el código del receptor comienza cargando las librerías RadioHead y SPI y creando un objeto ASK.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
En la función setup: inicializamos el objeto ASK y también configuramos el monitor serie ya que así es como veremos nuestro mensaje recibido.
rf_driver.init();Serial.begin(9600);
En la función loop: creamos un buffer de tamaño igual al del mensaje transmitido. En nuestro caso, es 11, ¿recuerdas? Tendrás que ajustarlo para que coincida con la longitud de tu mensaje. Asegúrese de incluir los espacios y la puntuación, ya que todos ellos cuentan como caracteres.
uint8_t buf;uint8_t buflen = sizeof(buf);
A continuación, llamamos a una función recv()
. Esto enciende el receptor si no está ya encendido. Si hay un mensaje válido disponible, copia el mensaje a su primer búfer de parámetros y devuelve true, si no, devuelve false. Si la función devuelve true, el sketch entra en la sentencia if e imprime el mensaje recibido en el monitor serie.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Entonces volvemos al inicio del bucle y lo hacemos todo de nuevo.
Después de cargar el sketch abre tu monitor serie. Si todo está bien deberías ver tu mensaje.
Mejorar el alcance de los módulos RF de 433MHz
La antena que utilices tanto para el transmisor como para el receptor puede afectar realmente al alcance que podrás obtener con estos módulos RF. De hecho, sin una antena, tendrás suerte de comunicarte a una distancia de más de un metro.
Con un diseño de antena adecuado, podrás comunicarte a una distancia de 50 metros. Por supuesto, eso es al aire libre en un espacio abierto. Su alcance en interiores, especialmente a través de las paredes, se verá ligeramente debilitado.
La antena no tiene por qué ser complicada. Un simple trozo de cable de un solo núcleo puede ser una excelente antena tanto para el transmisor como para el receptor. El diámetro de la antena apenas tiene importancia, siempre que se mantenga la longitud de la misma.
La antena más eficaz tiene la misma longitud que la de la onda para la que se utiliza. A efectos prácticos, bastará con la mitad o la cuarta parte de esa longitud.
La longitud de onda de una frecuencia se calcula como:
Longitud de onda de la frecuencia = | Velocidad de transmisión (v) |
Frecuencia de transmisión (f) |
En el aire, la velocidad de transmisión es igual a la velocidad de la luz, que es de 299.792.458 m/s para ser exactos. Así, para la banda de 433 MHz la longitud de onda es:
Longitud de onda de la frecuencia = | 299.792.458 m/s |
433.000.000 Hz | |
= | 0.6924 metros |
= | 69,24 cm |
Como la antena de onda completa de 69,24 cm es una antena bastante larga, no es muy práctica de utilizar. Por eso optaremos por una antena de un cuarto de onda, que equivale a unos 17,3 cm o 6,8 pulgadas.
Por si acaso, si estás experimentando con otros transmisores de radio que utilizan diferentes frecuencias, puedes utilizar la misma fórmula para calcular la longitud de antena necesaria. Bastante fácil, ¿verdad?
Incluso una antena de 17,3 cm puede parecer incómoda en tu pequeño proyecto Arduino. Pero NO te sientas tentado a enrollar la antena para hacerla más compacta ya que esto afectará seriamente el alcance. Una antena recta es siempre lo mejor