Tutorial Arduino | Vehículo Robot Teledirigido por Radio-Frecuencia RF con un Joystick

En este tutorial os presentamos el Robot “Web-Robótica II“, un vehículo teledirigido por Radio-Frecuencia RF, con un emisor y un receptor controlados con placas Arduino/Genuino UNO, mediante un sencillo Joystick. El Robot está propulsado por dos motores DC en las ruedas traseras y activandolos independientemente conseguimos controlar la dirección.

Aquí te explicamos paso a paso el diseño, los componentes, los códigos, etc. Si quieres aprender y tienes un proyecto en mente y voluntad, encontrarás fácilmente la información que te ayudará a realizar tu proyecto y ejecutarlo fácilmente.

Componentes, materiales y funcionamiento

El prototipo está compuesto por dos partes, el módulo Joystick (Equipo emisor) y el vehiculo (Equipo receptor).

Equipo emisor

Si deseas conocer mas sobre el funcionamiento de los módulos de Radio-Frecuencia RF pincha aquí.

El equipo emisor esta formado por una placa Arduino/Genuino UNO, un Joystick y un módulo emisor de Radio-Frecuencia RF.

Modulo-Joystick-Emisor-RadioFrecuencia-RF

Al accionar el Joystick variamos la señal analógica en los ejes X e Y. La placa lee el valor de la señal mediante las entradas analógicas y dependiendo de este valor el módulo emisor emitirá una determinada señal que será recibida por el equipo receptor.

Si deseas conocer mas sobre el funcionamiento de los módulos Joystick pincha aquí.

Los materiales para construir el Módulo Joystick (Equipo emisor):

  •  Placa Arduino/Genuino
  • 1 Módulo emisor de Radio-Frecuencia RF
  • 1 Módulo Protoboard
  • Tuercas y tornillos
  • Separadores
  • Cables de conexión
  • Fuente de alimentación

Esquema y montaje del equipo emisor RF

Receptor WR II

Piezas Modulo Joystick Emisor RadioFrecuencia RF

En primer lugar hemos colocado la placa Arduino/Genuino UNO y el el Módulo Joystick sobre un tablero de madera utilizando tuercas, tornillos y separadores.

Montaje Modulo Joystick Emisor RadioFrecuencia RF

Colocamos el módulo Protoboard sobre la placa Arduino/Genuino UNO.

Montaje Modulo Joystick Emisor RadioFrecuencia RF 2

Conectamos los cables del módulo Joystick a +5V y GND, y los pines del eje X y del eje Y a las entradas A0 y A5 de la placa Arduino/Genuino UNO.

Montaje Modulo Joystick Emisor RadioFrecuencia RF 3

Montaje Modulo Joystick Emisor RadioFrecuencia RF 4

Después conectamos el módulo emisor de Radio-Frecuencia RF a +5V y GND, y la salida ATAD al pin 12 de la placa Arduino/Genuino UNO.

Montaje Modulo Joystick Emisor RadioFrecuencia RF 5

Con todos los componentes en su lugar ya hemos terminado nuestro Joystick para radiocontrol.

Modulo-Joystick-Emisor-RadioFrecuencia-RF

Código/Sketch Arduino para el módulo Joystick (Equipo emisor)

Biblioteca VirtualWire

Los módulos de RF de bajo coste requieren un formato especial de datos, con patrones de sincronización, equilibrio de bits 0 y 1, y comprobación de errores. VirtualWire ofrece todas estas características, lo que permite un mejor rendimiento de los circuitos de radio muy baratos.

Cómo utilizar los módulos RF transmisor y receptor 315Mhz con Arduino

Para usar esta bibiloteca descarga el archivo y súbelo al programa Arduino IDE.

Arduino IDE > Programa > Include Library > Add .Zip Library

Descargar biblioteca (VirtualWire)

Este es código completo para nuestro “ módulo Joystick (Equipo emisor)“, copia, pega y modifica el código según tus necesidades.

// Tutorial Arduino
// Vehículo Robot
// http://Web-Robotica.com
// Teledirigido por Radio-Frecuencia RF con un Joystick
// Profesor J. AHEDO
// Vehículo teledirigido por Radio-Frecuencia RF
// con un emisor y un receptor controlados con placas Arduino/Genuino UNO
// mediante un sencillo Joystick.
// El Robot está propulsado por dos motores DC en las ruedas traseras
// y activandolos independientemente conseguimos controlar la dirección.

#include <VirtualWire.h>
// Incluimos esta biblioteca para los módulos de RF

boolean running = true;
char *controller;
int xPin = A0;
int yPin = A5;
int buttonPin = 0;

int xPosition = 0;
int yPosition = 0;
int buttonState = 1;
void setup() {
Serial.begin(9600);
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
pinMode(13,OUTPUT);
pinMode(buttonPin, INPUT);


vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(4000);// speed of data transfer Kbps
}

void loop(){
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);
  buttonState = digitalRead(buttonPin);
  
  Serial.print("X: ");
  Serial.print(xPosition);
  Serial.print(" | Y: ");
  Serial.print(yPosition);
  Serial.print("buttonState: ");
  Serial.print(buttonState);
  Serial.print(" | Emitiendo: ");
  Serial.println(controller);


 if ( xPosition >= 800 && yPosition >= 800 )  
  {
controller="D"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);

}

else  if ( xPosition >= 800 && yPosition >= 300) 
  {
controller="C"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

else  if ( xPosition >= 300 && yPosition >= 800) 
  {
controller="E"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

else  if ( xPosition >= 800 && yPosition <= 300) 
  {
controller="B"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}
else  if ( xPosition >= 300 && yPosition <= 100) 
  {
controller="A"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

else  if ( xPosition >= 300 && yPosition <= 250) 
  {
controller="3"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}


else  if ( xPosition >= 300 && yPosition <= 400) 
  {
controller="2"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}


else  if ( xPosition >= 300 && yPosition <= 500) 
  {
controller="1"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

else  if ( xPosition <= 300 && yPosition >= 800) 
  {
controller="F"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

else  if ( xPosition <= 300 && yPosition >= 300) 
  {
controller="G"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

else  if ( xPosition <= 300 && yPosition <= 300) 
  {
controller="H"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,1);
}

 else
{
controller="0"  ;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13,0);
}}

Equipo receptor

El vehiculo está formado por el chasis y las ruedas, una placa Arduino/Genuino UNO, un módulo receptor de Radio-Frecuencia RF, un Puente-H y dos motores DC.

El módulo receptor de Radio-Frecuencia RF recibe las diferentes señales de radio de equipo emisor, dependiendo de estas señales el Robot se moverá hacia delante, atras, izquierda y derecha.

Los materiales para construir el Vehículo (Equipo receptor) son los siguientes:

  •  Placa Arduino/Genuino
  • 1 Módulo receptor de Radio-Frecuencia RF
  • 1 Módulo Protoboard
  • 1 Puente-H
  • 2 Motores DC
  • 2 Baterias 9V
  • Tuercas y tornillos
  • Separadores
  • Cables de conexión

Esquema y montaje

Esquema de componentes Vehiculo WR II

Para construir el Vehiculo Robot lo primero ha sido colocar los motores DC con sus ruedas y las ruedas delanteras sobre una lámina de plástico.

Montaje Robot Receptor RadioFrecuencia RF

Hemos aprovechado una piezas de meccano para el diseño de la cabina.

Montaje Robot Receptor RadioFrecuencia RF 3

Colocamos el Puente-H, y a través de de un orificio lo conectamos a los motores DC.

Montaje Robot Receptor RadioFrecuencia RF 5

Montaje Robot Receptor RadioFrecuencia RF 4

Colocamos la placa Arduino/Genuino UNO, con un módulo Protoboard.

Montaje Robot Receptor RadioFrecuencia RF 6

Realizamos la conexiones. Hemos conectado el Puente-H a VCC, a +9V y los pines de señal a los pines 2, 5, 6 y 9 de la placa Arduino/Genuino UNO, y conectamos el módulo receptor de Radio-Frecuencia RF a VCC, a +5V y al pin 12.

Montaje Robot Receptor RadioFrecuencia RF 7

Conectamos dos baterias de 9V, una para alimentar los motores DC, y otra para la placa.

Montaje Robot Receptor RadioFrecuencia RF 9

Para finalizar hemos cogido una caja, la hemos decorado y la colocamos cubriendo los componentes.

Montaje Robot Receptor RadioFrecuencia RF 10

Código/Sketch Arduino para Robot Teledirigido por Radio-Frecuencia

Este es código completo para nuestro “Vehículo Robot Teledirigido por Radio-Frecuencia RF con un Joystick“, copia, pega y modifica el código según tus necesidades.

// Tutorial Arduino
// Vehículo Robot
// http://Web-Robotica.com
// Teledirigido por Radio-Frecuencia RF con un Joystick
// Profesor J. AHEDO
// Vehículo teledirigido por Radio-Frecuencia RF
// con un emisor y un receptor controlados con placas Arduino/Genuino UNO
// mediante un sencillo Joystick.
// El Robot está propulsado por dos motores DC en las ruedas traseras
// y activandolos independientemente conseguimos controlar la dirección.

#include <VirtualWire.h>
// Incluimos esta biblioteca para los módulos de RF

void setup()

{ //Configuración básica
  
  Serial.begin(9600);


    vw_set_ptt_inverted(true);
    vw_set_rx_pin(12); // Pin para el receptor
    vw_setup(4000);  // Bits por segundo
    pinMode(3, OUTPUT); // 
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(9, OUTPUT);

    vw_rx_start();       // Start the receiver PLL running
}
    void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

 
    if (vw_get_message(buf, &buflen)) 

    {  
            
    // Cuando recibe la señal '0'
    // los motores permanecen parados
    if(buf[0]=='0'){
    digitalWrite(3,0);
    digitalWrite(5,0);
    digitalWrite(6,0);
    digitalWrite(9,0);
    }
    // Cuando recibe la señal 'A'
    // los motores avanzan
    
    if(buf[0]=='A'){
    digitalWrite(3,1);
    digitalWrite(5,0);
    digitalWrite(6,0);
    digitalWrite(9,1);

    }
    // Cuando recibe la señal '3'
    // los motores avanzan 75ms y se paran 25ms repetidamente
    // Velocidad mas lenta
        
  if(buf[0]=='3'){
  digitalWrite(3,1);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,1);
  delay(75);  
  digitalWrite(3,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,0);
  delay(25);   

    }
    // Cuando recibe la señal '2'
    // los motores avanzan 50ms y se paran 50ms repetidamente
    // Velocidad mas lenta
    
    if(buf[0]=='2'){
  digitalWrite(3,1);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,1);
  delay(50);  
  digitalWrite(3,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,0);
  delay(50); 

    }
    // Cuando recibe la señal '1'
    // los motores avanzan 25ms y se paran 75ms repetidamente
    // Velocidad mas lenta
    
    if(buf[0]=='1'){
  digitalWrite(3,1);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,1);
  delay(25);  
  digitalWrite(3,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,0);
  delay(75); 

    }   
    // Cuando recibe la señal 'B'
    // los motores avanzan 50ms y solo uno paran 50 ms repetidamente
    // Giro
    
    if(buf[0]=='B'){
  digitalWrite(3,1);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,1);
  delay(50);  
  digitalWrite(3,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,1);
  delay(50); 
 
    }
    // Cuando recibe la señal 'C'
    // un motor avanzan 50ms y se paran 50ms repetidamente
    // Giro   
    if(buf[0]=='C'){
  digitalWrite(3,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,1);
  delay(50);  
  digitalWrite(3,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(9,0);
  delay(50); 
 
    }
    // Cuando recibe la señal 'D'
    // un motor avanzan 50ms y se paran 50ms repetidamente
    // Giro   
   if(buf[0]=='D'){
  digitalWrite(3,0);
  digitalWrite(5,1);
  digitalWrite(6,1);
  digitalWrite(9,0);
  delay(50);  
  digitalWrite(3,0);
  digitalWrite(5,1);
  digitalWrite(6,0);
  digitalWrite(9,0);
  delay(50); 
 
    }
    // Cuando recibe la señal 'E'
    // los motores retroceden 50ms y se paran 50ms repetidamente
    // Retroceso lento
       if(buf[0]=='E'){
  digitalWrite(3,0);
  digitalWrite(5,1);
  digitalWrite(6,1);
digitalWrite(9,0);
delay(50);  
 digitalWrite(3,0);
digitalWrite(5,0);
digitalWrite(6,0);
digitalWrite(9,0);
 delay(50); 
 
    }
    // Cuando recibe la señal 'F'
    // Giro  
 if(buf[0]=='F'){
digitalWrite(3,0);
digitalWrite(5,1);
digitalWrite(6,1);
digitalWrite(9,0);
delay(50);  
 digitalWrite(3,0);
digitalWrite(5,0);
digitalWrite(6,1);
digitalWrite(9,0);
 delay(50); 
 
    }
    // Cuando recibe la señal 'G'
    // Giro      
 if(buf[0]=='G'){
digitalWrite(3,1);
digitalWrite(5,0);
digitalWrite(6,0);
digitalWrite(9,0);
delay(50);  
 digitalWrite(3,0);
digitalWrite(5,0);
digitalWrite(6,0);
digitalWrite(9,0);
 delay(50); 
 
    }
    // Cuando recibe la señal 'H'
    // Giro  
 if(buf[0]=='H'){
digitalWrite(3,1);
digitalWrite(5,0);
digitalWrite(6,0);
digitalWrite(9,1);
delay(50);  
 digitalWrite(3,1);
digitalWrite(5,0);
digitalWrite(6,0);
digitalWrite(9,0);
 delay(50); 
 
    }

    } 

}

 

Deja un comentario

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