Vehículo radio-controlado con Arduino










Vídeo demostrativo:

Código para el emisor:

#include <VirtualWire.h>
 
const int dataPin = 9;

const int pinx = A0;
const int piny = A1;
const int pinboton = 8;

int valorx = 0;
int valory = 0;
int auxvalorx = 0;
int auxvalory = 0;
bool boton = true;  // la pulsacion del boton da un low
bool auxboton = true;

String cadena;  
char buf[VW_MAX_MESSAGE_LEN];

void setup()  {
    pinMode(pinboton , INPUT_PULLUP); //activar resistencia pull up, al pulsar sale un low
    vw_setup(2400);
    vw_set_tx_pin(dataPin);
}
 
void loop() {
    //leer valores
    auxvalorx = analogRead(pinx);
    auxvalory = analogRead(piny);
    auxboton = digitalRead(pinboton);

    valorx = auxvalorx;
    cadena = "x" + String(valorx); /// convertir a string y añadir x al inico
    cadena.toCharArray(buf,sizeof(buf)); // Convertir a char array
    vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
    vw_wait_tx(); // Esperar envio

    valory = auxvalory;
    cadena = "y" + String(valory); /// convertir a string y añadir y al inicio
    cadena.toCharArray(buf,sizeof(buf)); // Convertir a char array
    vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
    vw_wait_tx(); // Esperar envio

    if (!auxboton) {
        cadena = "b";
        cadena.toCharArray(buf,sizeof(buf)); // convertir a char array y añadir b al inicio
        vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
        vw_wait_tx(); // Esperar envio
    }
    boton = auxboton;
}


Código para el receptor:

#include <VirtualWire.h>
 
const int dataPin = 8;  //recepcion datos
const int ena = 5;
const int enb = 6;
const int in1 = 4;
const int in2 = 7;
const int in3 = 12;
const int in4 = 3;

const int velominima = 75;
const int velomaxima = 250;
const int girominimo = 80;
const int giromaximo = 220;
int velocidad = 0;
int velocidada = 0;
int velocidadb = 0;
bool girando = false;
bool derecha = true;
bool marchaalante = true;
int cuantogiro = 0;
int restogiro = 0;

// El 5 y 6 no tienen conflicto con virtualwire que usa el 9 y 10 (timer1)

void setup()  {
    pinMode(ena, OUTPUT);
    pinMode(enb, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    
    vw_setup(2400);
    vw_set_rx_pin(dataPin);
    vw_rx_start();
}
 
void loop() {
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    // Recibir dato
    if (vw_get_message((uint8_t *)buf,&buflen))
    {
        String dataString;
        for (int i = 1; i < buflen; i++)  {
            dataString.concat((char)buf[i]);
        }
        if((char)buf[0]=='x') {
            int dato = dataString.toInt();  // Convertir a int
            if ((dato) > 515) {
                velocidad = map(dato, 516, 1023, velominima, velomaxima);
                palante();
                } else if ((dato) < 512)  {
                    velocidad = map(dato, 511, 0, velominima, velomaxima);
                    patras();
                    } else if ((dato) > 511 & (dato) < 516){
                      parado();
                    }
        } else if((char)buf[0]=='y')  {
            int dato = dataString.toInt();  // Convertir a int
            if ((dato) > 515) {
              cuantogiro = map(dato, 516, 1023, girominimo, giromaximo);
              giraaladerecha();
              } else if ((dato< 485)) {
                  cuantogiro = map(dato, 484, 0, girominimo, giromaximo);
                  giraalaizquierda();
                  } else if ((dato) > 484 & (dato) < 516) {
                      nogirar();
                  }
        } else if((char)buf[0]=='b')  {
              parado();
        }
    }
}

//conducir

void accionar() {
    analogWrite(ena,velocidada );
    analogWrite(enb,velocidadb );
}

void palante()  {
     if (!girando) {
        velocidadb = velocidad;
        velocidada = velocidad;
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
    } else  {
        if (derecha)  {
          giraaladerecha();
        } else  {
          giraalaizquierda();
        }
    }
    accionar();
    marchaalante = true;
}

void patras()  {
    if (!girando) {
        velocidadb = velocidad;
        velocidada = velocidad;
        digitalWrite(in1,LOW);
        digitalWrite(in2,HIGH);
        digitalWrite(in3,LOW);
        digitalWrite(in4,HIGH);
    } else  {
        if (derecha)  {
          giraaladerecha();
        } else  {
          giraalaizquierda();
        }
    }
    accionar();
    marchaalante = false;
}

void parado()  {
    velocidad = 0;
    accionar();
}

void giraaladerecha()  {
    if (velocidad + cuantogiro > velomaxima ) {
        cuantogiro = velomaxima;
        restogiro = velomaxima - (velocidad + cuantogiro);
    } else {
      restogiro = 0;
    }
    if (marchaalante)  {
        velocidada = velocidad - restogiro;
        velocidadb = cuantogiro;
    } else  {
        velocidadb = velocidad - restogiro;
        velocidada = cuantogiro;
    }
    accionar();
    girando = true;
    derecha = true;
}

void giraalaizquierda()  {
    if (velocidad + cuantogiro > velomaxima ) {
        cuantogiro = velomaxima;
        restogiro = velomaxima - (velocidad + cuantogiro);
    } else {
      restogiro = 0;
    }
    if (marchaalante)  {
        velocidadb = velocidad - restogiro;
        velocidada = cuantogiro;
    } else  {
        velocidada = velocidad - restogiro;
        velocidadb = cuantogiro;
    }
    accionar();
    girando = true;
    derecha = false;
}

void nogirar()  {
    velocidadb = velocidad;
    velocidada = velocidad;
    accionar();
    girando = false;
}


Código para descargar: emisor.ino receptor.ino
Libreria VirtualWire utilizada para la comunicación RF: VirtualWire

Componentes utilizados comprados en ebay la mayoría, pongo algunos enlaces de ebay para quien le interese comprarlo:
  • Arduino Nano para el emisor.
  • Arduino Uno para el receptor.
  • Módulo emisor y módulo receptor de RF.
  • Un joystick mini.
  • Módulo L298 para el control de los motores.
  • Un chasis con ruedas y dos motores con reducción.
  • Una protoboard donde está puesto el emisor.
  • Un puñado de cables de conexión.
  • 2 portabaterías de 4 AA y las ocho baterías recargables correspondientes.
  • Una goma elástica para aguantar las baterias del emisor en la protoboard
  • Un trozo de cartón grapado por las puntas para hacer de caja en el vehículo.
  • Imaginación y ganas.

Todos los elementos son muy económicos se pueden comprar por Internet sin gastos de envío.
Para el control de los motores es mejor usar el módulo basado en TB6612FNG, enlade de ebay,en lugar del L298 que se muestra en este proyecto, ya que es más pequeño y eficiente para motores que no necesitan gran potencia, generará menos ruido a la transmisión RF.
Es conveniente conectar un condensador electrolítico de 2200 µF entre el positivo y negativo de la alimentación para evitar interferencias y tener buen alcance.
Si compramos los módulos RF con la antena incorporada mucho mejor, su alcance puede ser de muchos metros, como estos que se pueden comprar en ebay: los X882

El hecho de utilizar el Nano o el Uno para emisor o receptor es indiferente, cualquier arduino se puede usar, el Nano es el más barato y práctico por su tamaño. Yo en su día compré un Arduino Uno, enlace de ebay, y lo he usado en este proyecto, así no he necesitado una protoboard para pincharlo. 

Si quieres, puedes contribuir a hacer crecer el blog:



Comentarios

Escríbeme, comenta o pregúntame lo que quieras:

Nombre

Correo electrónico *

Mensaje *

Entradas populares