El Coche fantástico V4.1
Control por bluetooth y Android de un vehículo construido con Arduino.
Ver video Se pueden descargar todos los códigos y archivos desde aquí.
Materiales
- Arduino Mega (Compatible, 6€)
- Camión de plástico (Mercadillo 2€)
- 4 Motores DC
- 4 Ruedas (Encajan en los motores)
- Stepper Motor Drive Controlador L298N Dual H Puente (2€)
- 5 leds rojos
- Motor paso a paso 4 fases + Driver ULN2003 28BYJ-48 (3€)
- Bluetooth HC-05 arduino (4€)
- HC-SR04 modulo sensor distancia ultrasonido (2€)
- Portapilas 9V con interruptor y conector (3€)
- Portapilas 8x AA (2€)
- Protoboard 830 puntos MB102 + Fuente de Alimentación 3,3V-5V A0003 (4€)
- Botón interruptor
- Cables macho-macho y macho-hembra
- Taladro y dremel para adaptar el vehículo
Codigo del Arduino
/*
PROYECTO «El Koche Fantatiko»
Código de Arduino UNO para manejar 4 motores DC, 1 motor paso a paso, luces y sensor de ultrasonidos a través del modulo bluetooth HC-05
La APP fue creada con appInventor
Los acentos de las explicaciones se han omitido deliberadamente 😉
El skech ha sido confeccionado adaptando codigos de otros autores por JanoCreaciois
*/
#include <SoftwareSerial.h> //CONEXION BLUETOOTH
#include <AFMotor.h> //Sensor de ultrasonidos para el modo AUTO
//declaración de las variables para los pines del motor pasoapaso
int motorPin1 = 2;
int motorPin2 = 3;
int motorPin3 = 4;
int motorPin4 = 5;
int motorSpeed = 1200; //variable para fijar la velocidad del motor (el retraso entre cada secuencia)
int count = 0; // cuenta de los pasos dados
int countsperrev = 512; // número de pasos por vuelta completa
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
SoftwareSerial BT(0, 1); //Conexiones del Modulo Bluetooth HC-05 al Arduino. TX al 0 y RX al 1)
// Sensor de ultrasonidos para el modo AUTO
#define Trigger 12
#define Echo 13
// Motores
char val;
int velocidad = 150; // Velocidad de comienzo
int enA = 10; // Motores derechos (Cable gris)
int in1 = 9; // Motores derechos hacia adelante
int in2 = 8; // Motores derechos hacia atras
int enB = 11; // Motores izquierdos
int in3 = 7; // Motores izquierdos hacia atrás
int in4 = 6; // Motores izquierdos hacia adelante
// LUCES COCHE FANTASTICO
int timer = 100; // Cuanto mayor sea el numero, mas lenta la sincronización de los leds.
void setup() {
BT.begin (9600);
Serial.begin(9600); // Velocidad de comunicación Bluetooth
//declare the motor pasoapaso pins as outputs
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
// CODIGO ULTRASONIDOS
pinMode(Trigger, OUTPUT); // Ponemos el trigger (envia las ondas sonoras)como salida
pinMode(Echo, INPUT); // Ponemos el Echo (recibe las ondas sonoras)como entrada
//CODIGO LUCES COCHE FANTASTICO
//for (int thisPin = 2; thisPin < 8; thisPin++) { // Utilizo for para iniciar un bucle de los pines de salida de los leds
for (int thisPin = 33; thisPin < 42; thisPin++) { // Utilizo for para iniciar un bucle de los pines de salida de los leds
pinMode(thisPin, OUTPUT);
}
// CODIGO MOTORES. Terminales de salida en el Arduino
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
analogWrite(enA, velocidad);
analogWrite(enB, velocidad);
}// CIERRO SETUP
void loop() {
if ( Serial.available() )
val = Serial.read(); // CODIGO MOTORES
if ( val == ‘r’ ) //Modo camara
{
//if(count < countsperrev )
clockwise(); //sentido agujas del reloj
//else if (count == countsperrev * 2)
// count = 0;
//else
// anticlockwise(); //sentido antihorario
//count++;
}
if ( val == ‘q’ ) //Modo camara
{
anticlockwise(); //sentido antihorario
}
if ( val == ‘s’ ) //Modo camara
{
count = 0;
}
//CODIGO ULTRASONIDOS (Para que se active unicamente en modo AUTO)
if ( val == ‘m’ ) //Modo Auto
{
long duration, distance; // Creamos 2 variables de tamano extendido para almacenar numeros
digitalWrite(Trigger, LOW); // Desactivamos Trigger
delayMicroseconds(2); // Esperamos a que se complete la operación
digitalWrite(Trigger, HIGH); // Activamos el Trigger
delayMicroseconds(10); // Mantenemos activado el Trigger por 10 us
digitalWrite(Trigger, LOW); // Desactivamos el Trigger
duration = pulseIn(Echo, HIGH); // Calculamos la duracion del Pulso
distance = (duration / 2) / 29.1; // Convertimos la distancia en centimetros (velocidad Sonido 340m/s o 29.1 us x cm)
if (distance < 10) { // Si la distancia al objeto es menor a 10 cm hacemos que gire a la izquierda.
digitalWrite(in1, HIGH); // Gira el motor A Derecho en sentido anti horario
digitalWrite(in2, LOW);
digitalWrite(in3, LOW); // Gira el motor B Izquierdo en sentido horario
digitalWrite(in4, HIGH);
delay(800);
}
else {
delay (15); // Esperamos a que los motores estén listos
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
}
//CODIGO DE LOS MOTORES (Se puede variar el sentido de giro desde aqui sin tocar los cables)
if ( val == ‘l’ ) //Adelante
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
if ( val == ‘t’ ) //Atras
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
}
if ( val == ‘i’ ) //Izquierda
{
digitalWrite(in1, LOW); // Gira el motor A Derecho en sentido horario
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH); // Gira el motor B Izquierdo en sentido anti horario
digitalWrite(in4, LOW);
}
if ( val == ‘d’ ) //Derecha
{
digitalWrite(in1, HIGH); // Gira el motor A Derecho en sentido anti horario
digitalWrite(in2, LOW);
digitalWrite(in3, LOW); // Gira el motor B Izquierdo en sentido horario
digitalWrite(in4, HIGH);
}
if ( val == ‘p’ ) //Parar
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
if (val == ‘c’) { //Giro a la derecha
analogWrite(enA, 180); // Velocidad a 180 para que gire despacio
analogWrite(enB, 180);
digitalWrite(in1, HIGH); // Gira el motor A Derecho en sentido anti horario
digitalWrite(in2, LOW);
digitalWrite(in3, LOW); // Gira el motor B Izquierdo en sentido horario
digitalWrite(in4, HIGH);
delay(800);
}
if (val == ‘g’) { // Giro a la izquierda
analogWrite(enA, 180); // Velocidad a 180 para que gire despacio
analogWrite(enB, 180);
digitalWrite(in1, LOW); // Gira el motor A Derecho en sentido horario
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH); // Gira el motor B Izquierdo en sentido anti horario
digitalWrite(in4, LOW);
delay(800);
}
// Velocidades
if ( val == ‘u’ )
{ velocidad = 70;
}
if ( val == ‘v’ )
{ velocidad = 150;
}
if ( val == ‘w’ )
{ velocidad = 250;
}
analogWrite(enA, velocidad);
analogWrite(enB, velocidad);
// CODIGO LUCES COCHE FANTASTICO
if (val == ‘a’) { //Encender luces del pin mas bajo hasta el pin más alto
for (int thisPin = 33; thisPin < 42; thisPin++) {
digitalWrite(thisPin, HIGH); // Enciende el pin
delay(timer);
digitalWrite(thisPin, LOW); // Apaga el pin
}
for (int thisPin = 41; thisPin >= 33; thisPin–) { //Desde el pin mas alto al pin mas bajo
digitalWrite(thisPin, HIGH); // Enciende el pin
delay(timer);
digitalWrite(thisPin, LOW); //Apaga el pin
}
}//cierro if
}// CIERRO LOOP
//creación funciones giro horario y antihorario de la camara
void anticlockwise()
{
for(int i = 0; i < 8; i++)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}
void clockwise()
{
for(int i = 7; i >= 0; i–)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}
void setOutput(int out) //función secuencia giro
{
digitalWrite(motorPin1, bitRead(lookup[out], 0));
digitalWrite(motorPin2, bitRead(lookup[out], 1));
digitalWrite(motorPin3, bitRead(lookup[out], 2));
digitalWrite(motorPin4, bitRead(lookup[out], 3));
}
//FIN CODIGO ARDUINO
La App
Creada a través de la web appInventor
Para que reconozca los comandos de voz en castellano, hay que descargar la siguiente extensión: https://downloads.sourceforge.net/project/puravidaapps/com.puravidaapps.TaifunSpeechRecognizer.aix
El manejo es simple, las flechas verdes y el stop sirven para el control del vehículo, los triángulos blancos para establecer la velocidad.
El micrófono es para dar las órdenes por voz: Adelante, Atrás, Izquierda, Derecha, Parar.
El Modo Auto activa el sensor de detección de obstáculos, girando a la derecha cuando detecta algo a menos de 10cm.
Las cámaras sirven para girar el motor que sujeta la cámara en sentido horario o anti horario, se mueve mientras se tenga pulsado el botón, parando al soltarlo.