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); }