Comunicación por RF 433 Mhz

portadaPOR FIN!!!! Hoy voy a enseñaros una maravilla de la tecnología, anda que no he estado tiempo detrás de esto y por fin tengo todo lo que necesitaba, los equipos, la idea, el tiempo………… Se trata de comunicación por radiofrecuencia entre arduino y Raspberry, como demostrativo, encenderé y apagaré un pequeño LED vía radiofrecuencia. A ello!!!!! Materiales necesarios:
  • Arduino: He usado el UNO, iba a usar el NANO pero no tenía un adaptador para pilas de 9V que encajara en él.
  • Raspberry
  • Unos cuantos jumpers de varios tipos, macho-macho y hembra-hembra
  • Un breadboard
  • Una pila de 9V y un adaptador de Jack.
  • Módulos de RF, los puedes encontrar en cualquier web de chinos mandarinos.
  • Un led con una resistencia (220 ohm)
  Los módulos de RF son tan sencillos como esto: rf Son módulos unidireccionales :( , es decir, el receptor recibe y el emisor emite, fíjate que curioso 😛 (lo cual es una M, porque qué bonito sería que los dos valieran para las dos cosas…aunque por 2 euros pues tampoco les vamos a pedir maravillas) Os pongo los esquemas en fritzing, como viene ya siendo habitual: Esquema Arduino fritzing ardu Esquema Raspberry fritzing raspi   El montaje queda así de chulo, he atado con una goma elástica el ardu y la pila para que no se muevan :) , es digna de ver la pedazo de antena que he puesto al receptor jajajaja (es el núcleo de un cable coaxial de TV)   2014-04-25 23.40.05   Y ahora os voy a explicar los códigos, hay que montar dos, uno en ardu y otro en raspi, como ya os habéis podido imaginar. He utilizado la librería RCSWITCH para arduino y la librería 433UTILS para raspi. ARDUINO: Este será el encargado de recibir, y que cuando reciba un número concreto se encienda el LED (chapuceroooooooooo podías haber hecho que se encienda con un ON y que se apague con un OFF!!!!!!!!, si, soy ingeniero, ya lo siento pero lo primero que se me viene a la cabeza son números y he tenido a bien usar el 5 para encender y el 7 para apagar :P) Nos bajamos de aquí la librería RCSWITCH. La instalamos tal y como nos cuenta nuestro amigo el mismísimo Massimo banzi en los tutoriales de arduino, colocando la librería en una carpeta dentro del directorio de arduino con el nombre libraries. Va foto: libreria ardu Tras esto escribimos el código:
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int led=4;                    //ponemos en el pin 4 el LED

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receptor en el inerrupt => que es el pin #2
  pinMode(led, OUTPUT);         
}

void loop() {
  
  if (mySwitch.available()) {              // si tenemos datos disponibles que recibir
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) 
    {
      Serial.print("No se que es esto");   //Por si se recibe algo raro
    } 
    else 
    {
      Serial.print("Recibido el valor ");
      Serial.println(value);
      if (value == 5)
        {
        Serial.println("Encendemos LED");
        digitalWrite(led, HIGH);
        }
      else
        {
        Serial.println("Apagamos LED");
        digitalWrite(led, LOW);
        }
      mySwitch.resetAvailable();
    }
  }
}
    Ya tenemos preparado el ardu! Ahora a por la Raspi: RASPBERRY: Ahora nos tenemos que pegar con Linux, lo primero, tener descargada la librería WIRINGPI (la versión de C, no la de python), es una librería que controla los GPIO de la raspberry, ya conté esto en otra entrada. POR SI ACASO :
pi@raspberrypi ~ $ sudo apt-get install git-core
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ git clone git://git.drogon.net/wiringPi
pi@raspberrypi ~ $ cd wiringPi
pi@raspberrypi ~ $ git pull origin
pi@raspberrypi ~ $ cd wiringPi
pi@raspberrypi ~ $ ./build
  Ahora bajamos 433UTILS (por cierto, se basa también en RCSWITCH):
pi@raspberrypi ~ $ git clone git://github.com/ninjablocks/433Utils.git
Aqui la chicha está escrita en C++, en un fichero que se llama codeSend.cpp, lo abrimos y cambiamos si tenemos que cambiarlo, el PIN de conexión en la raspberry, ojo que hay que introducir el pin de acuerdo a la nomenclatura de WiringPI!!!!!! El código es este:
#include "RCSwitch.h"
#include <stdlib.h>
#include <stdio.h>


int main(int argc, char *argv[]) {

    int PIN = 0;
   
    int code = atoi(argv[1]);

    if (wiringPiSetup () == -1) return 1;
        printf("sending code[%i]\n", code);
        RCSwitch mySwitch = RCSwitch();
        mySwitch.enableTransmit(PIN);

    mySwitch.send(code, 24);

        return 0;

}
  Si lo hemos modificado hay que volver a hacer ./build para compilarlo. Entonces, para hacerlo más bonito lo vamos a ejecutar en Python con el siguiente código:  
import os


while True:

 while True:
   try:
     digito = int(input("Que hago??  "))
     break

   except:
     print "Solo digitos enteros"

 if digito==5:
   os.system( 'sudo ./codesend 5' );
   print 'Encendido'
   print ' '
 else:
   os.system( 'sudo ./codesend 7' );
   print 'Apagado'
   print ' '
  shell Y ya lo tenemos todo!!! ejecutamos este último script y voila!!! Con todo esto hemos conseguido un equipo que funciona de forma autónoma que es capaz de recibir señales por radiofrecuencia y realizar acciones, en este caso más sencillo encender un LED, pero esto se puede extrapolar a activar un Rele que gestiona cargas, que es lo que yo veo realmente interesante, pudiendo cortar la alimentación de cualquier cosa :). Si invertimos el funcionamiento podríamos tener sensores inalámbricos, de temperatura, humedad, movimiento, presencia, distancia, y no necesitamos estar al lado suyo para que nos envíe datos :) De momento he conseguido solamente unos 12 metros de distancia en interiores (que no es moco de pavo) intentaré hacer una antena algo más chula que tenga más ganancia a ver que pasa. Saludos!!! y thanks for reading!! [ And of course, if further information is required, do not hesitate to contact me :) ]

11 thoughts on “Comunicación por RF 433 Mhz

    1. Jose Hervás

      Gracias Lean!!!, son 3 centímetros de antena, le he puesto a los dos la misma, si. A ver si saco un rato y le hago una enroscada como la que le pusiste tu, aunque no mejoró mucho no?? :S :S

       
      Reply
      1. Pedromi

        Hola Jose.
        Te felicito por tu proyecto,tu inquietud y tu generosidad al publicarlo.Me admiro viendo tantas cosas mostradas y explicadas en la red pero en inglés, ni siquiera nos atrevemos a preguntar en español en esos foros, así que cuando buscando cosas de arduino me he tropezado con tu proyecto me ha encantado por encima de todo ver que hay quien difunde en español y con categoría.Te animo a que los vídeos los comentes toda la comunidad hispana te lo agradecerá.

        Un saludo

         
        Reply
        1. Jose Hervás

          Muchas gracias Pedromi, es muy gratificante ver que la gente te lee y que además lo encuentran útil y aclarador, es una motivación para seguir adelante muy grande (a pesar de que lleve un tiempo inactivo por temas de trabajo…)

          Muchísimas gracias por tu valoración!! 😉 me animaré a comentar los videos entonces jeje :)

           
          Reply
  1. Thiago Teixeira

    Hola José, muy bueno su proyecto, gracias por compartir.
    Yo tb hizo algunos proyectos con eso sensor pero solo con Arduino.
    Me felicito muy en mirar el conteudo en español sobre el Assunto.
    Quiero alertar a ti que su diseño do esquema en arduino tiene uno pequeño error no pin data de Receiver que estas conectado al VCC. Pero para quien coñeces la library no hay de teñer problema.
    Tu sabes como podria hacer lo proceso contrario? Arduino enviar datos para Raspberry pi?

    Muchas gracias, por compatir! “disculpe mi español”

     
    Reply
  2. Triplo

    Felicidades por tu logro y por compartir. Te cuento que yo tambien tenia limitantes con la distancia del RF, revise la documentaciòn oficial y encontre que una longitud adecuada para la antena serian unos 17,3cm. Con respecto al voltaje, con 5V andarà muy bien pero acumularas mas ruido, por esa razon recomiendan los 3V. Yo he hecho las pruebas y te comento que tengo toda mi casa conectada con 7 arduinos y un raspberry, cubriendo unos 100mts cuadrados, sin inconveniente alguno.

    Abrazos y Exito !!!

     
    Reply
    1. Jose Hervás

      Muchas gracias Triplo, la verdad que tengo un poco abandonado el tema por cuestiones laborales pero ahora lo voy a reactivar otra vez y tendré en cuenta tus recomendaciones 😀
      Vaya pasada, tienes montada toda una red de sensores en casa, te felicito por ello!!

      Gracias de nuevo, un abrazo!!

       
      Reply
  3. dbds

    Tengo unos conocimientos muy escasos de todo esto, pero en el diagrama que has puesto conectas el GND del rf a un pin del arduino, el cátodo del led lo conectas con un pin del arduino y el ánodo pasa por el gnd del arduino, ¿estas seguro que eso esta bien?

     
    Reply
    1. Jose Hervás

      el 0V de arduino debería ir conectado al – (cátodo) del LED, tienes razón que está mal el esquema, con el RF pasa lo mismo, se me han descolocado todos los PINES, lo correcto es:

      – 0V arduino a cátodo de LED
      – 5V arduino a resistencia
      – Resistencia a ánodo de LED
      – RF + a 5V de arduino
      – RF – a 0V arduino
      – RF Señal a un pin digital de arduino

      Disculpa el malentendido!! Un saludo!

       
      Reply
  4. dbds

    Esta genial, te felicito, pero tengo un problema y es que no se me enciende el led. He comprobado que los pins y gpio son los correctos, pero aun así no enciende nada, sabes que puede ser??

     
    Reply
    1. Jose Hervás

      Te recomiendo que aísles tu circuito y tu programa en partes más pequeñas, primero comprueba que enciendes el LED sin RF, luego comprueba por separado el RF, solo a mandar caracteres. Y luego conectas esos caracteres en tu programa con el LED, así no debería haber ningún problema y te aseguras que el hardware está bien montado :)

       
      Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>