lunes, 16 de noviembre de 2015

COCHE ROBOT CON ARDUINO VERSION 2.0



Después de unos días experimentando con nuestro coche, llega la primera actualización o ampliación, una curda de luz. Nos explicamos, un sigue luz para que nos siga utilizando una linterna, utilizamos dos resistencias LDR para tal efecto.

También aprovechamos para poner unos LEDs para simular las luces del coche fantástico.

Aprovechando los restos del contrachapado cortamos dos trozos uno de 11 cm de largo por 2 cm de alto y el otro de 11 cm por 1,5 cm. Al primero le practicamos 15 agujeros de 5 mm,  que es el diámetro de los LEDs y las resistencias LDR, sepamos los agujeros unos 2 mm entre sí.


Una vez hechos los agujeros clavamos o pegamos el otro trozo en la parte inferior de esta para luego hacerle un agujero central para colocarle el brazo del servo y así poderlo atornillar al servo, el cual esta vez solo hará de soporte.


Colocamos en los agujeros de los externos las resistencias LDR, nosotros las hemos pegado por la parte trasera. También se colocaron los LEDs en el resto de los agujeros, estos tienen polaridad y procuramos que las patillas negativas las orientamos hacia abajo.


Cuando todo este fijado, comenzamos a soldar. Recortamos las patillas de los LEDs y las LDRs dejando lo suficiente para soldarle cables. Se suelda un cable uniendo todos los negativos de los LEDs, dejando suficiente cable para llegar al pin GND del Arduino, también soldamos una resistencia de 10 KΩ del cable negativo a una patilla de cada LDR, de estas patillas sacamos cables para conectar a la placa, el de la LDR izquierda al pin A8 y el de la LDR derecha al pin A7, la otra patilla de ambas LDR se conectaran entre si y a su vez al pin de 5 V del Arduino. Ahora soldamos un cable a cada positivo y a su vez a una resistencia de 150  para no fundir el LED (hay que tener en cuenta el voltaje e intensidad de funcionamiento de los LEDs para calcular las resistencias a utilizar) y las conéctanos a los pines impares del 29 al 53 inclusive de izquierda a derecha.




Y aquí está el nuevo código, como tiene que hacer barias cosas al mismo tiempo se tuvieron que sustituir los delays por los millis. Al utilizar el delay, nuestro Arduino solo atiende al tiempo del delay y no presta atención al resto del código ni a los sensores, por eso hay que utilizar los millis.

#include <Servo.h> //incluimos al librería del servo para su control
 
Servo motord;      //nombramos el servo derecho
Servo motori;      //nombramos el servo izquierdo
 
int ldresquerda = A8; //nombramos LDR izquierdo y asignamos el pin
int ldrdereita = A7;  //nombramos LDR derecho y asignamos el pin
 
int paradelantero = 11; //nombramos y asignamos pin al parachoques
                        //delantero
int paratrasero = 12; //nombramos y asignamos pin al parachoques 
                      //trasero
 
byte ledPin[] = {29,31,33,35,37,39,41,43,45,47,49,51,53}; //pines de
                      // los leds
 
long tempoled = 0; //variable de tiempo para los leds
int tempoencendido = 40;  //velocidad de encendido de los leds
int numeroLED = 0;  //variable del número de led
int dir = 1;         //variable de la dirección de los leds
 
int esquerda = 0;  //variable del valor del LDR izquierdo
int dereita = 0;   //variable del valor del LDR derecho
 
int estado = 0;  // variable de en qué estado está el robot
 
 
long tempoaudio; //variable de tiempo para pitidos de choque 
                //delantero
long temposenal; //variable de tiempo para pitidos de choque trasero
 
boolean pdelantero = HIGH; //variable del parachoques delantero y
                           //definimos su estado
boolean ptrasero = HIGH; //variable parachoques trasero y definimos
                         //su estado
 
unsigned long tiempo; //variable de tiempo para el choque delantero
unsigned long tempo; // variable de tiempo para el choque trasero
 
void setup(){
  motord.attach(9); //conectamos servo derecho y definimos pin
  motori.attach(10); //conectamos servo izquierda y definimos pin
  pinMode(paradelantero, INPUT_PULLUP); //activa el pin como entrada
                                   //y activa la resistencia interna
  pinMode(paratrasero, INPUT_PULLUP); //activa el pin como entrada
                                   //y activa la resistencia interna
 
for (int i=0; i<13; i++) {        //activa los pines de los leds 
      pinMode(ledPin[i], OUTPUT); //como salidas
    } 
   tempoled = millis();  //iguala la variable del tiempo de los 
                            //leds a millis que es el contador del
}                           //tiempo de la placa Arduino
 
void loop() { 
 
  bocina(); //se llama a la subrutina bocina
  senal(); //se lama a la subrutina senal
 
  pdelantero = digitalRead (paradelantero); //lee el estado del 
                //parachoques delantero y lo escribe en su variable 
  ptrasero = digitalRead (paratrasero); //lee el estado del 
                   //parachoques trasero y lo escribe en su variable
  esquerda = analogRead(ldresquerda); //lee el estado de la LDR 
                            //izquierdo y lo escribe en su variable
  dereita = analogRead(ldrdereita);  //lee el estado de la LDR 
                            //derecha y lo escribe en su variable
 
if (esquerda == dereita && estado == 0){ //se le indica que si 
//recibe la misma luz en ambas LDR y si el estado es cero escriba
  motord.write (0); // 0° en el servo derecho
  motori.write (180); //y 180° en el servo izquierdo
}
  
if (esquerda > dereita && estado == 0){ //se le indica que si recibe
//más luz en la LDR izquierda que en la derecha y el estado es cero 
  motord.write(0); // escriba 0° en el servo derecho
  motori.write(100); // y 100° en el servo izquierdo
}
 
if (dereita > esquerda && estado == 0){ //se le indica que si recibe
//menos luz en LDR izquierda que en la derecha y el estado es cero
  motord.write(80); //escribe 80° en el servo derecho
  motori.write(180); //y 180° en el servo izquierdo
 
}
  
if(pdelantero == LOW){ //si choco por delante
  tiempo = millis(); //escribe el tiempo de millis en la variable
                     // tiempo
  tempo =1201; //se escribe 1201 en la variable tempo para que no 
               //interfiera con esta rutina
 atras(); //va hacia atrás 0,01 segundo
 }
 if (millis()- tiempo ==10){ //compara el tiempo capturado con el 
                        //tiempo real y si es igual a 0.01 segundo
  parar(); //para y pita cuatro veces
}
if (millis()- tiempo == 1000){ //vuelve a comparar el tiempo y si 
                               //es igual a 1 segundo
atras(); // va hacia atras
}
 
if (millis()- tiempo == 2000){ //si la diferencia de tiempo es 2 
                               //segundos
derecha(); //gira a la derecha
}
if (millis()- tiempo == 2500){ //si la diferencia es 2,5 segundos
  estado = 0; //para de girar y se pone en estado 0
}
if (ptrasero == LOW){ //si choca por atras
  tempo = millis(); //captura el tiempo en la variable tempo
  tiempo = 2501; //se escribe 2501 en la variable tempo para que no 
               //interfiera con esta rutina
  adelante(); //va hacia adelante
 }
 if (millis() - tempo == 10){ //si la diferencia de tiempo es igual
                              // 0,01 segundo
  parar();                    //para
 }
 if (millis() - tempo == 1000){ //si la diferencia es de 1 segundo
  izquierda();                  //gira a la izquierda
 }
 if (millis() - tempo == 1200){ //si la diferencia es de 1,2 
  estado = 0; //segundos deja de ir a la izquierda y devuelve el 
 }            //estado 0
 
  if ((millis() - tempoled) > tempoencendido) { //si la diferencia
                       //de tiempo es mayor al tiempo de encendido
      for (int i=0; i<13; i++) { //va cambiando el led de 1 en 1
        digitalWrite(ledPin[i], LOW); //apaga los leds
      }   
      digitalWrite(ledPin[numeroLED], HIGH); //enciende los leds
      numeroLED = numeroLED + dir;      
      if (numeroLED ==12) { //si led 13 esta encendido
        dir=-1; //cambia dirección de derecha a izquierda
      }
      if(numeroLED ==0){ //si led 1 esta encendido
        dir=1; //cambia dirección de izquierda a derecha
      }
      tempoled = millis(); //iguala la variable al tiempo real para
    }                      //volver empezar el ciclo de los led
}  
 
void adelante(){      //subrutina adelante
  motord.write(0);    //escribe 0° en el servo derecho
  motori.write(180);  //escribe 180° en el servo izquierdo
  estado = 1;   //escribe valor 1 en la variable
}
 
void atras(){        //subrutina atras
  motord.write(180); //escribe 180° en el servo derecho
  motori.write(0);   //escribe 0° en el servo izquierdo
  estado = 2;        //escribe valor 2 en la variable estado
}
 
void derecha(){       //subrutina derecha
   motord.write(90);  //escribe 90° en el servo derecho
   motori.write(180); //escribe 180° en el servo izquierdo
   estado = 3;        //escribe valor 3 en la variable estado
}
 
void izquierda(){     //subrutina izquierda
   motord.write(0);   //escribe 0° en el servo derecho
   motori.write(90);  //escribe 90° en el servo izquierdo
   estado = 4;        //escribe valor 4 en la variable estado
}
 
void parar(){         //subrutina parar
  motord.write(90);   //escribe 90° en ambos servos
  motori.write(90);
  estado = 5;         //escribe valor 5 en la variable estado 
}
 
void bocina(){               //subrutina bocina
 if (pdelantero == LOW){ //si choco por delante
    tempoaudio=millis(); //iguala la variable al tiempo real
 }
 if (millis() - tempoaudio ==50){ //si la diferencia es igual 0,05
                                  //segundos
    tone(8,10);  //suena en el pin 8 el tono 10 durante 0,1 segundo
 }
 if (millis() - tempoaudio ==150){ //si la diferencia es igual 0,15
                                  //segundos
  noTone(8);                    //deja de sonar 0,1 segundos
 }
 if (millis() - tempoaudio ==250){ //si la diferencia es igual 0,25
                                  //segundos
    tone(8,10); //suena en el pin 8 el tono 10 durante 0,1 segundo
 }
 if (millis() - tempoaudio ==350){ //si la diferencia es igual 0,35
                                  //segundos
  noTone(8);                     //deja de sonar 0,1 segundos
  }
  if (millis() - tempoaudio ==450){ //si la diferencia es igual 0,45
                                  //segundos
    tone(8,10); //suena en el pin 8 el tono 10 durante 0,1 segundo
 }
 if (millis() - tempoaudio ==550){ //si la diferencia es igual 0,55
                                  //segundos
  noTone(8);                      //deja de sonar 0,1 segundos
 }
  if (millis() - tempoaudio ==650){ //si la diferencia es igual 0,65
                                  //segundos
    tone(8,10); //suena en el pin 8 el tono 10 durante 0,1 segundo
 }
 if (millis() - tempoaudio ==750){ //si la diferencia es igual 0,75
                                  //segundos
  noTone(8);                      //deja de sonar 
 }
  
}
 
void senal (){           //subrutina senal
  if(ptrasero == LOW){   //si choco por atras
    temposenal = millis();
  }
  if(millis() - temposenal == 50){ //si la diferencia es igual 0,05
                                  //segundos
    tone (8,10); //suena en el pin 8 el tono 10 durante 0,05 segundo
  }
  if(millis() - temposenal ==100){ //si la diferencia es igual 0,1
                                  //segundos
    noTone(8);                    //deja de sonar 0,05 segundos
  }
  if(millis() - temposenal == 150){ //si la diferencia es igual 0,15
                                  //segundos
    tone (8,10); //suena en el pin 8 el tono 10 durante 0,05 segundo
  }
  if(millis() - temposenal ==200){ //si la diferencia es igual 0,2
                                  //segundos
    noTone(8);                    //deja de sonar 0,05 segundos
  }
  if(millis() - temposenal == 250){ //si la diferencia es igual 0,25
                                  //segundos
    tone (8,10); //suena en el pin 8 el tono 10 durante 0,05 segundo
  }
  if (millis() - temposenal ==300){ //si la diferencia es igual 0,3
                                  //segundos
    noTone(8);                     //deja de sonar 0,05 segundos
  }
  if(millis() - temposenal == 350){ //si la diferencia es igual 0,35
                                  //segundos
    tone (8,10); //suena en el pin 8 el tono 10 durante 0,05 segundo
  }
  if(millis() - temposenal ==400){ //si la diferencia es igual 0,4
                                  //segundos
    noTone(8);                     //deja de sonar 0,05 segundos
  }
  if(millis() - temposenal == 450){ //si la diferencia es igual 0,45
                                  //segundos
    tone (8,10); //suena en el pin 8 el tono 10 durante 0,05 segundo
  }
  if(millis() - temposenal ==500){ //si la diferencia es igual 0,5
                                  //segundos
    noTone(8);                     //deja de sonar 0,05 segundos
  }
  if(millis() - temposenal == 550){ //si la diferencia es igual 0,55
                                  //segundos
    tone (8,10); //suena en el pin 8 el tono 10 durante 0,05 segundo
  }
  if(millis() - temposenal == 600){ //si la diferencia es igual 0,6
                                  //segundos
    noTone(8);                      //deja de sonar
  }
}
 
 
 








Versión anterior y posterior de coche robot.

Versión 1: 
http://imoslonxe.blogspot.com.es/2015/11/coche-robot-con-arduino.html
Versión 3:
http://imoslonxe.blogspot.com.es/2015/12/coche-robot-con-arduino-version-30.html


Autores: Jose Manuel Parafita Lamas, Juan Manuel Verdeal Garcia y Raquel Cobas Mata alumnos del curso Montaje y Reparación de Sistemas Microinformáticos IFCT 0309

No hay comentarios: