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

Deja tu comentario