Coche Autonomo
- Validación
- Desarrollo
- Presentación
proyecto. Se busca, se crea y se codifica. Y en la última fase se defiende el proyecto delante
de todos.
El coche autónomo:
- Es un coche que es capaz de mover y girar autónomamente.
- Tiene una fuente de energía externa.
- Puede evitar los obstáculos en tiempo real.
- Energía externa: como una fuente de tensión o pilas.
- Sensores para detectar obstáculos, por ejemplo un sensor ultrasónico.
- Servo para girar el sensor para buscar camino óptimo.
- Motores y controladores para el movimiento del coche.
- Ruedas
- Chassis
Arduino Mega 2560 R3 |
Puede costar unos 5 euros o más. La original es muy cara. Las copias viene baratas y sirven para poder realizar proyectos. Están incluidas en los kits generales. |
14€ |
Protoboard |
Suele estar incluido en los kits generales de arduino. |
2€ |
Cable USB |
Suele venir junto con la placa de arduino. Cuesta unos 6 euros o más con la placa de arduino. |
|
Cables |
Son baratas. Están incluidos en los kits generales y básicos. |
|
Kit de coche |
Viene con las ruedas, los motores, el chasis y el fuente de alimentación de pilas. |
20€ |
Bateria / Pilas |
Están incluidos en algunos kits de arduino, no en el nuestro. |
12€ |
Cargador |
Suelen estar incluidos en los kits generales. Venia incluido. |
|
Controlador de motores |
Normalmente no están incluidos. En algunos vienen junto con el motor (1 unidad). |
9,9€ |
Servo |
Están incluidos en casi todos los kits generales. Los servos comunes pueden girar hasta 180 grados. |
12€ |
Sensor ultrasonico HC-SR04 |
Están incluidos en la mayoría de los kits generales. Son capaces de transmitir señales ultrasónicos y recibirlos durante un periodo. |
5€ |
Soporte |
Se utiliza como soporte para fijar el ultrasonido y el servo. Se puede comprar o fabricar. |
4,40 |
Kit comprado |
Kit comprado por los alumnos, que contiene cableado, transformador de corriente, ultrasonidos, servo, placa arduino, etc. El kit completo esta valorado en 50€. Los kits para estudiantes y/o generales están valorados entre 20-40 €. |
|
TOTAL |
~100€ |
- Arduino
- Componentes básicos
Cables macho-macho |
Cables macho-hembra |
- Controlador de motores
-
- 2 puertos PWM (ENA, ENB): controlan la potencia que de los motores A y B respectivamente.
- 4 puertos digitales (IN1, IN2, IN3, IN4): controlan las direcciones que giran cada motor:
- Motor A: IN1 y IN2
- Motor B: IN3 y IN4
- 2 salidas que alimentan cada motor:
- Motor A: OUT1 y OUT2
- Motor B: OUT3 y OUT4
- 2 entradas de alimentación: 12V y 5V
- GND: tierra
- Radar o detector de obstáculos
Ultrasonido: HC-SR04 |
Servo: Tower PRO SG-90 |
- Radar
- Controlador de Motores
- Funcionamiento
- Posibles mejoras
-
- Añadir otro sensor para que el coche pueda detectar obstáculos por detrás.
- Utilizar sensor de luz aparte de la de ultrasonido para mejorar la detección de los
obstáculos.
- Mejorar la detección de obstáculos. Actualmente el radar detecta obstáculos en línea
recta y hay algunos obstáculos que no es capaz de detectar.
- Añadir una cámara y un procesador de imágenes para que pueda recorrer por un
circuito y sea capaz de interpretar las señales de tráfico.
- Añadir marchas y cambio de velocidad para que pueda seguir mejor las normas de
tráfico y/o conducir de forma más segura.
- Conectar un módulo wifi o bluetooth para poder dar avisos en caso de accidentes y
robos.
- Añadir sistema para poder llamar a una grúa.
- Añadir un detector de huellas para evitar los robos.
- Utilizar de pilas recargables y añadir placas solares para poder recargar las pilas y
aumentar el tiempo de funcionamiento del coche.
- Añadir un botón de inicio y de parada.
- Añadir reconocimiento de voz para poner el coche en marcha o detenerlo.
- Añadir un gps.
- Mejorar el coche para que pueda aparcar por sí solo.
- etc
- Incorporación en el mundo real
#include <Servo.h> //servo1 library
Servo servo;
/*Echo/Trig del ultrasonido */
int Echo = A6;
int Trig = A5;
/*almacena distancia leida por ultrasonido*/
int dist;
/*MOTORES*/
/*define pins para controlar los motores*/
int in1=2;
int in2=4;
int in3=7;
int in4=8;
int in5=10;
int in6=11;
int in7=12;
int in8=13;
/*define pins de enable (PWM). Estos controlan la potencia de los motores*/
int ENA1=6;
int ENB1=9;
int ENA2=3;
int ENB2=5;
/*Calcula y devuelve distancia leida por ultrasonido*/
float Distance_test() {
digitalWrite(Trig, LOW);
delayMicroseconds(1);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
float Fdistance = pulseIn(Echo, HIGH);
Fdistance = (Fdistance)/ 58;
Serial.print(“distancia: “);
Serial.println(Fdistance);
return Fdistance;
}
/*Barrido del servo con el ultrasonido. Devuelve entero que corresponde con una direccion*/
int Servo_scan() {
delay(500);
servo.write(180);
delay(500);
dist = Distance_test();
if (dist > 25) {
servo.write(80);
delay(1000);
Serial.println(‘1’);
return 1;
} else {
servo.write(135);
delay(500);
dist = Distance_test();
delay(1000);
if (dist > 25) {
servo.write(80);
delay(1000);
Serial.println(‘2’);
return 2;
} else {
servo.write(80);
delay(500);
dist = Distance_test();
delay(1000);
if (dist > 25) {
servo.write(80);
delay(1000);
Serial.println(‘3’);
return 3;
} else {
servo.write(40);
delay(500);
dist = Distance_test();
delay(1000);
if (dist > 25) {
servo.write(80);
delay(1000);
Serial.println(‘4’);
return 4;
} else {
servo.write(0);
delay(500);
dist = Distance_test();
delay(1000);
if (dist > 25) {
servo.write(80);
delay(1000);
Serial.println(‘5’);
return 5;
} else {
servo.write(80);
delay(1000);
Serial.println(‘6’);
return 6;
}
}
}
}
}
}
/*MOTORES*/
/*retroceso NO EN USO*/
void _mback()
{
analogWrite(ENA1,255);
analogWrite(ENB1,255);
analogWrite(ENA2,255);
analogWrite(ENB2,255);
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW); //Right front wheel backward
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH); //Left front wheel backward
digitalWrite(in5,LOW);
digitalWrite(in6,HIGH); //Right back wheel backward
digitalWrite(in7,HIGH);
digitalWrite(in8,LOW); //Left back wheel backward
Serial.println(“back”);
}
/*avanzar*/
void _mforward()
{
analogWrite(ENA1,200);
analogWrite(ENB1,200);
analogWrite(ENA2,200);
analogWrite(ENB2,200);
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH); //Right Front wheel forward
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW); //Left Front wheel forward
digitalWrite(in5,HIGH);
digitalWrite(in6,LOW); //Right back wheel forward
digitalWrite(in7,LOW);
digitalWrite(in8,HIGH); //Left back wheel forward
Serial.println(“forward”);
}
/*funcion para girar a la izquierda*/
void _mleft()
{
analogWrite(ENA1,255);
analogWrite(ENB1,255);
analogWrite(ENA2,255);
analogWrite(ENB2,255);
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
digitalWrite(in5,LOW);
digitalWrite(in6,HIGH);
digitalWrite(in7,LOW);
digitalWrite(in8,HIGH);
Serial.println(“left”);
}
/*funcion para girar a la derecha*/
void _mright()
{
analogWrite(ENA1,255);
analogWrite(ENB1,255);
analogWrite(ENA2,255);
analogWrite(ENB2,255);
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
digitalWrite(in5,HIGH);
digitalWrite(in6,LOW);
digitalWrite(in7,HIGH);
digitalWrite(in8,LOW);
Serial.println(“right”);
}
void _stop()
{
digitalWrite(ENA1,LOW);
digitalWrite(ENB1,LOW);
digitalWrite(ENA2,LOW);
digitalWrite(ENB2,LOW);
Serial.println(“Stop”);
}
/*decide el movimiento autonomo del coche*/
void movimientosAuto() {
dist = Distance_test(); //Lee distancia de frente
if (dist <= 30) {
_stop();
gira(Servo_scan()); //Gira en direccion devuelta por el servo scan
_stop();
} else {
gira(3);
}
}
/*recibe un entero desde el Servo_scan() que dice en que direccion debe girar el coche*/
void gira(int dir) {
switch(dir) {
case 1:
_mleft(); //gira izq este
delay(500); //90 grados
break;
case 2:
_mleft(); //gira izq noreste
delay(234); //45 grados
break;
case 3:
_mforward(); //recto
break;
case 4:
_mright(); //gira der noroeste
delay(250); //45 grados
break;
case 5:
_mright(); //gira der oeste
delay(500); //90 grados
break;
case 6:
_mright(); //gira 180
delay(935);
}
}
void setup()
{
/*Conectamos Servo al pin 30*/
servo.attach(30);
/*Declaro el Echo como input y el Trig como output*/
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
/*MOTOR A1*/
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(ENA1,OUTPUT);
/*Motor B1*/
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(ENB1,OUTPUT);
/*Motor A2*/
pinMode(in5,OUTPUT);
pinMode(in6,OUTPUT);
pinMode(ENA2,OUTPUT);
/*Motor B2*/
pinMode(in7,OUTPUT);
pinMode(in8,OUTPUT);
pinMode(ENB2,OUTPUT);
Serial.begin(9600);
}
void loop() {
movimientosAuto();
delay(250);
}