Siempre me ha gustado controlar cosas a distancia, juguetes de radio control, luces por bluetooth, …
Hace tiempo adquirí unos pequeños emisores y receptores de RF para Arduino pero no encontraba el momento para probarlos. Finalmente he sacado algo de tiempo y aunque no es mucho al menos he comprobado que funcionan con unas pocas lineas de código.
El Emisor – Cliente
Lista de componentes del EmisorRF
- Arduino Uno 5V, 16MHz
- Transmisor RF 315Mhz
Led de control de envío/finalmente utilizo el de la propia placa: 13- Pulsador
Pines utilizados:
- 5V
- GRN
- 3, envío de datos RF
- 5 Pulsador
Código fuente
Lo más complicado es establecer las conexiones correctamente, el código de envío del mensaje en si son dos lineas.
#include <VirtualWire.h> int count=0; void setup(){ Serial.begin(9600); // Solo para depuración, salida terminal Serial.println("setup"); vw_set_ptt_inverted(true); // Requerido para DR3100 vw_setup(1000); // Bits por seg vw_set_tx_pin(3); pinMode(8, INPUT); digitalWrite(5, LOW); digitalWrite(13, false); } void loop(){ char msg[24]; if(digitalRead(5) == HIGH){ count++; if(count>9) count=0; Serial.print(count); Serial.print(" "); //char *msg = "1"; sprintf(msg, "%i",count); Serial.print(msg); Serial.println(";"); digitalWrite(13, true); // Enciende Led para mostrar transmisión en curso vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Espera hasta que todo el mensaje ha salido digitalWrite(13, false); // Apaga Led, fin del envio } }
El Receptor – Servidor
El receptor serie el servidor que realiza la tarea, en este ejemplo se enciende el led al recibir datos y muestra por terminal serie el valor recibido.
Lista de componentes
- Arduino Pro Mini 5V 16Mhz
- Receptor RF 315MHz
Led de control de recepción
Pines utilizados:
- 5V
- GRN
- 4, recepción de datos RF
8 Led recepción datos,finalmente utilizo el de la propia placa
Código fuente del receptor
#include <VirtualWire.h> int count=0; void setup(){ Serial.begin(9600); // Solo para depuración, salida terminal Serial.println("setup"); // Inicializa IO y ISR vw_set_ptt_inverted(true); // Requerido para DR3100 vw_setup(1000); // Bits por seg vw_set_rx_pin(4); vw_rx_start(); // Inicia al receptor digitalWrite(13, LOW); } void loop(){ uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)){ // No bloquea Serial.println("Data"); int i; digitalWrite(13, HIGH); // Enciende led en señal de inicio de recepción Serial.print("Got: "); for (i = 0; i < buflen; i++){ Serial.print(buf[i]); // recorre el buffer } Serial.println(""); digitalWrite(13, LOW); // Apaga el led, fin de la recepción } delay (50); }
Una vez recibido el valor en el receptor únicamente queda hacer algo con el, activar un relé, poner en marcha un motor,… eso queda a la imaginación de cada uno.
* Tanto en el emisor como en el receptor el alcance mejora sensiblemente al utilizar el led integrado en las placas, entiendo que tiene más fuerza/corriente para emitir.
* Con una antena de unos 20cms el alcance llega a 3 metros aproximadamente
Saludos