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
Publicar un comentario