miércoles, 5 de marzo de 2014

AutomatCar: coche controlado con arduino

Mi proyecto sera un coche que tenga la posibilidad de ser controlado tanto de manera manual como automática, controlado con un micro-controlador arduino, que tenga la posibilidad de esquivar obstáculos y avanzar de manera automática y que también se pueda controlar desde una aplicación en android.



OBJETIVOS
Un objetivo a realizar es conseguir que de manera automática se mueva y evite obstáculos.
Para ello usare dos sensores de ultrasonidos que midan la distancia para evitar que choque y un puente en H para que pueda ir hacia adelante y hacia atrás y también servirá para poder girar.
Otro objetivo es poder controlarlo de manera manual, pudiendo regularle la velocidad e indicarle la dirección, esto lo llevare a cabo mediante una aplicación en android usando el app inventor y un modulo de bluetooth (HC-06), que le pasara la información del dispositivo android a la arduino.
Usando también el puente en H para cambiar el sentido y la dirección.
ESQUEMA Y PCB DEL PUENTE EN H
Lo primero ha sido realizar el esquema y la simulacion del puente en H en ISSIS en el que he usado los componentes:
-2 Transistores BD135 .
-2 Transistores BD136.
-2 Transistores 2N2222.
-4 Diodos 1N4007.
- 4Resistencias de 0,6W (2 de 22 Ohmios y 2 de 470 Ohmios).
-3 Conectores de 2 pines. 

Tras comprobar en la simulación su correcto funcionamiento se puede pasar a la construcción de la pcb, sacar la placa y montarla.



Puente en H finalizado

Tras realizar el montaje completo de los puentes en H he comprobado su funcionamiento, con buen resultado. Desde arduino se le da la señal al puente para que vaya el motor en una dirección o en otra. El motor se alimenta con 12V que pasan a través del driver y con una señal de PWM al driver se controla su velocidad.

Aplicacion en Android
Con una aplicacion en android se va a poder controlar el movimiento del coche y decirle que se comporte tanto de manera automática como manual, y poder controlar la velocidad y direccion cuando se encuentre en modo manual.

La aplicacion la he realizado a traves del MIT App Inventor 2 y se comunicara con arduino a traves de un modulo de bluetooth HC-06. La comunicacion se hara a traves de cadenas con el app Inventor, al pulsar un boton se le enviara una cadena por el puerto serie al Arduino Mega y este actuará en consecuencia.

Por ejemplo, si se quiere que el coche avance mas rapido se le pulsara al boton mas, este le enviara al arduino por serie la palabra "mas" y hara que la velocidad se incremente 40.

Así quedara la pantalla de la aplicación:

Para que la aplicación funcione la programación se hace a través de bloques. Así es como quedan los bloques tras programar toda la aplicación:




Comunicación de Arduino Mega con Arduino Uno
En el arduino Uno irán conectados los dos ultrasonidos y llevará el programa que hace que cuando un ultrasonido detecte un obstáculo a menos de 30 centímetros activa una salida y cuando sea el otro ultrasonido pondrá otra diferente. El arduino Mega estará conectado a esas dos patillas leyendo en que estado se encuentran, los datos los guarda en dos variables y actúa en consecuencia con ellas.

Programa Arduino Uno

#define PIN_TRIGD 9
#define PIN_ECHOD 5
#define PIN_TRIGT 6 
#define PIN_ECHOT 3


void setup() {
  Serial.begin(9600); 
  pinMode(PIN_TRIGD, OUTPUT);
  pinMode(PIN_ECHOD, INPUT);
  pinMode(PIN_TRIGT, OUTPUT);
  pinMode(PIN_ECHOT, INPUT);
  pinMode(13,OUTPUT); 
  pinMode(12,OUTPUT); 
}
void loop()
{
  long distanciaD,distanciaT;
    distanciaD = medir(PIN_TRIGD,PIN_ECHOD);
    Serial.print("Delantero :");
    Serial.println(distanciaD); 
    distanciaT = medir(PIN_TRIGT,PIN_ECHOT);
    Serial.print("Trasero :");
    Serial.println(distanciaT);
    delay(100);
    
  if(distanciaD<=30){
    digitalWrite(13,HIGH);
  }
  else{
    digitalWrite(13,LOW);
  }
  if(distanciaT<=30){
    digitalWrite(12,HIGH);
  }
  else{
    digitalWrite(12,LOW);
  }
}

  long medir(int PIN_TRIG,int PIN_ECHO)
   { 
  long tiempo, distancia;
  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(PIN_TRIG, HIGH);
  digitalWrite(PIN_TRIG, LOW);  
  tiempo = pulseIn(PIN_ECHO, HIGH);
  distancia = (tiempo/2) / 29;
  
  return distancia;
  }

Programa Arduino Mega
#define adelante1 30
#define atras1 32
#define motor1 5
#define adelante2 31
#define atras2 33
#define motor2 6
#define inter 40

String readString;

int der,izq;
int velocidad1=0,velocidad2=0,acel1=51,acel2=acel1/4;
int valadelante1,valatras1;
int valadelante2,valatras2;
int valinter;
int i=0,j=0,a=0,m=0;

void setup(){
 Serial.begin(9600);
 Serial.println("todo va bien ... de momento");
 pinMode(22,INPUT);
 pinMode(24,INPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(inter,INPUT);
 pinMode(atras1,OUTPUT);
 pinMode(motor1,OUTPUT);
 pinMode(adelante1,OUTPUT);
 pinMode(atras2,OUTPUT);
 pinMode(motor2,OUTPUT);
 pinMode(adelante2,OUTPUT);
 digitalWrite(adelante1,HIGH);
 digitalWrite(adelante2,HIGH);
 digitalWrite(12,LOW);
 digitalWrite(11,LOW);
}

void loop(){
  valadelante1 = digitalRead(adelante1);
  valatras1 = digitalRead(atras1);
  valadelante2 = digitalRead(adelante2);
  valatras2 = digitalRead(atras2);
  valinter = digitalRead(inter);
  der = digitalRead(22); //sensor derecho
  izq = digitalRead(24); //sensor izquierdo
  analogWrite(motor1,velocidad1);
  analogWrite(motor2,velocidad2);
  while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     if(readString == "3on"){ //adelante
       Serial.println("adelante");
       digitalWrite(atras1,LOW);
       digitalWrite(atras2,LOW);
       digitalWrite(adelante1,HIGH);
       digitalWrite(adelante2,HIGH);
       digitalWrite(8,LOW);
       digitalWrite(9,LOW);
       velocidad1=velocidad2;
       delay(400);
     }
     if(readString == "2on"){ //atras
       Serial.println("atras");
       digitalWrite(adelante1,LOW);
       digitalWrite(adelante2,LOW);
       digitalWrite(atras1,HIGH);
       digitalWrite(atras2,HIGH);
       digitalWrite(8,HIGH);
       digitalWrite(9,HIGH);
       velocidad1=velocidad2;
       delay(400);
     }
     if(readString == "mas"){ //+velocidad
       Serial.println("+");
       velocidad1=velocidad1+acel1;
       velocidad2=velocidad2+acel1;
       if(velocidad1>=255){
         velocidad1=255;
       }
       if(velocidad2>=255){
         velocidad2=255;
       }
     }
     if(readString == "menos"){
       Serial.println("-");
       velocidad1=velocidad1-acel1;
       velocidad2=velocidad2-acel1;
       if(velocidad1<=0){
         velocidad1=0;
       }
       if(velocidad2<=0){
         velocidad2=0;
       }
     }
     if(readString == "izq"){
       Serial.println("izquierda");
       velocidad2=velocidad1/4;
     }
     if(readString == "der"){
       Serial.println("derecha");
       velocidad1=velocidad2/4;
     }
     readString="";
   }
  //*************************//
  if(valinter==HIGH){
    //Modo interruptor en on
  if(a==1){
    valadelante1 = digitalRead(adelante1);
    valatras1 = digitalRead(atras1);
    valadelante2 = digitalRead(adelante2);
    valatras2 = digitalRead(atras2);
    valinter = digitalRead(inter);
    der = digitalRead(22); //sensor derecho
    izq = digitalRead(24); //sensor izquierdo
    analogWrite(motor1,velocidad1);
    analogWrite(motor2,velocidad2);
    //Entra en modo automatico
    Serial.println("Automatico");
      while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     readString="";
   }
  //Sensor delantero choca o izquierdo
  if((((der==HIGH)&&(izq==HIGH))||((der==LOW)&&(izq==HIGH)))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){                
    Serial.println("obstaculo grande, o izquierdo");
    velocidad1 = velocidad1 - acel1;
    velocidad2 = velocidad2 - acel1;
    if((velocidad1<=0)&&(velocidad2<=0)){
      velocidad1=0,velocidad2=0;
      digitalWrite(adelante1,LOW);
      digitalWrite(adelante2,LOW);
      delay(700);
      digitalWrite(atras1,HIGH);
      digitalWrite(atras2,HIGH);
      i =  1;
    }
  }
  //atras y giro
  if(((i>=1)&&(i<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
    Serial.println("vamos patras");
    velocidad1 = velocidad1 + acel2;
    velocidad2 = velocidad2 + acel1;
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    if(velocidad2>=255){
      velocidad2=255;
    }
    if(velocidad1>=51){
      velocidad1=51;
    }
    i++;
  }
  //parada y marcha alante
  if(i>8){
    Serial.println("fin de la marcha atras");
    velocidad1=0;
    velocidad2=0;
    digitalWrite(atras1,LOW);
    digitalWrite(atras2,LOW);
    delay(700);
    digitalWrite(adelante1,HIGH);
    digitalWrite(adelante2,HIGH);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    i=0;
  }
  //Sin obstaculos
  if(((der==LOW)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
    Serial.println("No obstaculos");  
    velocidad1 = velocidad1 + acel1;
    velocidad2 = velocidad2 + acel1;
    if(velocidad1>=255){
      velocidad1=255;
    }
    if(velocidad2>=255){
      velocidad2=255;
    }
  }
  //sensor derecho
  if(((der==HIGH)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
    Serial.println("obstaculo a la derecha");
    velocidad1 = velocidad1 - acel1;
    velocidad2 = velocidad2 - acel1;
    if((velocidad1<=0)&&(velocidad2<=0)){
      velocidad1=0,velocidad2=0;
      digitalWrite(adelante1,LOW);
      digitalWrite(adelante2,LOW);
      delay(700);
      digitalWrite(atras1,HIGH);
      digitalWrite(atras2,HIGH);
      j = 1;
    }
  }
  //atras y giro a derecha
  if(((j>=1)&&(j<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
    Serial.println("vamos patras otra vez");
    velocidad1 = velocidad1 + acel1;
    velocidad2 = velocidad2 + acel2;
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    if(velocidad2>=51){
      velocidad2=51;
    }
    if(velocidad1>=255){
      velocidad1=255;
    }
    j++;
  }
  //parada y marcha alante
  if(j>8){
    Serial.println("y paramos");
    velocidad1=0;
    velocidad2=0;
    digitalWrite(atras1,LOW);
    digitalWrite(atras2,LOW);
    delay(700);
    digitalWrite(adelante1,HIGH);
    digitalWrite(adelante2,HIGH);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    j=0;
  }
  delay(500);
  }
  if(m==1){
    valadelante1 = digitalRead(adelante1);
    valatras1 = digitalRead(atras1);
    valadelante2 = digitalRead(adelante2);
    valatras2 = digitalRead(atras2);
    valinter = digitalRead(inter);
    der = digitalRead(22); //sensor derecho
    izq = digitalRead(24); //sensor izquierdo
    analogWrite(motor1,velocidad1);
    analogWrite(motor2,velocidad2);
    Serial.println(velocidad1);
    Serial.println("*******");
    Serial.println(velocidad2);
    //Entra en modo manual para control en app
    Serial.println("MANUAL");
    while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     if(readString == "3on"){ //adelante
       Serial.println("adelante");
       digitalWrite(atras1,LOW);
       digitalWrite(atras2,LOW);
       digitalWrite(adelante1,HIGH);
       digitalWrite(adelante2,HIGH);
       delay(400);
     }
     if(readString == "2on"){ //atras
       Serial.println("atras");
       digitalWrite(adelante1,LOW);
       digitalWrite(adelante2,LOW);
       digitalWrite(atras1,HIGH);
       digitalWrite(atras2,HIGH);
       delay(400);
     }
     if(readString == "mas"){ //+velocidad
       Serial.println("+");
       velocidad1=velocidad1+acel1;
       velocidad2=velocidad2+acel1;
       if(velocidad1>=255){
         velocidad1=255;
       }
       if(velocidad2>=255){
         velocidad2=255;
       }
     }
     if(readString == "menos"){
       Serial.println("-");
       velocidad1=velocidad1-acel1;
       velocidad2=velocidad2-acel1;
       if(velocidad1<=0){
         velocidad1=0;
       }
       if(velocidad2<=0){
         velocidad2=0;
       }
     }
   
     readString="";
   }
   delay(500);
  }
  }
  if(valinter==LOW){
    //Modo off ni caso
    Serial.println("OFF");
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    velocidad1=0;
    velocidad2=velocidad1;
      while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     readString="";
   }
  }

}

Eficiencia energética
El apartado de eficiencia energética lo he tenido en cuenta en mi proyecto en:
         -El uso de fuentes conmutadas en vez de fuentes lineales, con alta eficiencia del 88%.
         -El uso de diodos leds, que tienen mínimo consumo.
         -La incorparación de un interruptor con el que poder apagar el coche cuando no se este usando.

Diagrama de bloques
Este es el diagrama de bloques donde se muestran todos los pasos por los que puede pasar el proyecto y su funcionamiento


Gantt Proyect
Este es el Gantt proyect con la planificacion de todas las semanas de proyecto y el contenido a realizar en esas semanas.



1 comentario:

  1. ¿Qué tipo de acciones automáticas podrá realizar? ¿Y el control manual desde un portátil o un móvil?

    ResponderEliminar