Mostrando entradas con la etiqueta coche robot. Mostrar todas las entradas
Mostrando entradas con la etiqueta coche robot. Mostrar todas las entradas

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

lunes, 9 de noviembre de 2015

COCHE ROBOT CON ARDUINO


       El objetivo de este proyecto es realizar un sencillo robot controlado por Arduino de una forma fácil y económica.

   El chasis está realizado en madera contrachapada, material rígido y de fácil manipulación. Las ruedas delanteras están hechas con dos tapas de botes de conservas, para la rueda trasera hemos utilizado una rueda loca y los motores son dos micro servos trucados para que puedan girar más de 180º.

    Empezaremos por el chasis, el cual dimensionaremos bien para que nos coja toda electrónica encima, nosotros hemos optado por el siguiente diseño que nos ayudara, en ambos extremos, con los sensores. A continuación podéis ver las medidas.

       Una vez hecho el chasis, continuamos con la preparación de las ruedas delanteras.

     Al utilizar servomotores trucados, que explicamos más adelante como hacerlo, tienen en su interior un sistema de engranajes de reducen la velocidad, por lo tanto utilizamos unas ruedas de diámetro amplio para ganar velocidad.

     Nosotros hemos utilizado dos tapas de unos botes de conserva de 6,5 cm de diámetro, a estas hay que buscarles el centro y hacer un pequeño agujero para que coja el tornillo que la sujetara al servo. 

     También es conveniente ponerle en su perímetro, según donde se vaya usar el robot, una goma, una junta torica u otro material antideslizante, nosotros hemos utilizado dos tiras de una cámara de una rueda de bicicleta que estaba rota.

     En cuanto a la rueda trasera hemos optado por utilizar rueda loca sencilla que se compró.
     Como sistema motriz se utiliza dos micro servos, uno para la rueda derecha y el 


otro para la rueda izquierda, estos hay que trucarlos porque de fábrica solo giran 180 grados. 

    Los micro servos están divididos en dos parte, una la parte mecánica donde están los engranajes y la otra en la que se encuentra la parte eléctrica.

  



     Para trucarlos hay que sacarle los tornillos de la parte de abajo para poder abrirlos. Una vez que se le sacaron los tornillos el servo se separa en tres partes, al sacar la carcasa superior se tiene acceso a la parte mecánica. Aquí hay que tener cuidado y recordar el orden de las ruedas dentadas.




     Se tira suavemente de la primera y saldrá con el eje.







Ahora se separa el eje del engranaje.








     Una vez separado se agranda el agujero de la rueda dentada lo suficiente para que gire libremente sobre el eje con un destornillador fino o una broca fina y se puede también alisar la punta del eje, esto se hace por que este eje está conectado a un potenciómetro y es el que indica los grados a los que está el servo y hay que fijarlo a 90 grados.

     Al engranaje también hay que sacarle el tope que tiene por debajo para que gire, se puede hacer con un cúter o una lima. En la siguiente imagen se puede ver lo que se saca y como tiene que quedar.

     Para definir el punto central del potenciómetro del servo, puedes cargar el siguiente código en placa Arduino con el software de Arduino.
#include <Servo.h>

int servo = 9;
Servo motor;
void setup() {
  motor.attach (servo);
}

void loop() {
  motor.write (90);

}


    Una vez cargado en el Arduino, y conectado el cable de señal al pin 9, el de alimentación a 5v y el de masa a GND y puesto el eje en su sitio, debes girar el eje del potenciómetro hasta que el motor se pare, en ese estado puedes fijar el potenciómetro con pegamento. Hecho todo esto ya se puede montar el servo.

    Ahora nos pondremos con los sensores de choque ya que todo robot que se precie necesita unos sensores que le indiquen que se ha chocado.

    Estos sensores se pueden hacer colocando un par de micro interruptores en la parte delantera del robot, pero como estamos haciendo un robot económico ¿Por qué no nos lo hacemos nosotros mismos?

    La idea es mantener separadas dos superficies conductoras, de forma que cuando se  produzca un impacto estas dos superficies entren en contacto y por lo tanto cierren el circuito. 

    Necesitaremos papel de aluminio del que se utiliza en cocina que pegaremos sobre el chasis.

     Primeramente cortamos una tira de unos 15mm de anchura y la pegamos centrada en la parte curva del chasis.

    Comprueba que el papel de aluminio no llegue a los extremos laterales del chasis para que no generen falsos contactos cuando incorporemos la otra parte del parachoques.

    Con una broca haces un agujero cerca del papel de aluminio. Por ese agujero pasamos un cable y lo empalmamos, hacemos la unión más o menos estable.

   Ahora tendremos que hacer los guardabarros, necesitaremos dos trozos de cartulina (nosotros hemos utilizado un plástico utilizado como portada de encuadernación de fotocopias), dos tiras de unos 1,5 cm de ancho por 20 cm de largo,  que recubriremos de papel de aluminio. Cerca de un extremo fijamos un cable.

   Llegados a este punto nos ponemos con el montaje, haremos en el chasis los agujeros para atornillar todo.

     Atornillamos las ruedas a los servos trucados.

     A continuación atornillamos la rueda trasera y fijamos las dos delanteras con dos soportes que hicimos con chapa para poder asegurar los servos al chasis.

      Y también colocamos el interruptor y los tornillos para soportar la placa Arduino.

    Continuamos poniendo el servo delantero, el altavoz, el porta pilas con velcro y fijamos los cables al chasis por la parte de abajo.

     Como no es muy conveniente alimentar los servos directamente del Arduino, ya que calentamos innecesariamente el regulador de la placa. Utilizaremos dos alimentaciones, una para alimentar Arduino y sensores con 9v, y otra de 6v para alimentar los servos realizada con 4 pilas de 1,5v sobre un porta pilas.

   Los positivos (color rojo) de los servos están conectados a las pilas por medio de un interruptor, los negativos (color marrón de los servos y negro del porta pilas y el cables para conectar a la placa) están soldados todos al negativo del porta pilas y aparte sale otro para conectar al GND de la placa de Arduino, la señal (color amarillo) pasan individualmente a la cara de arriba para conectar al pin 9 el servo de la rueda derecha, y al pin 10 el servo de la rueda izquierda.

   Y también fijaremos los para choques al chasis, nosotros hemos utilizado una grapadora y luego se reforzó con pegamento.

    El altavoz lo colocamos en medio de los tornillos de la rueda trasera.

    Ahora colocamos la placa de Arduino, las pilas y comenzamos a conectar todo, también se hizo un conector para ampliar las conexiones negativa, este lo conectamos a los dos GND de la placa.

     Conectamos la señal de servo derecho al pin 9, la señal del servo izquierdo al pin 10, la señal del parachoques delantero al pin 11, la señal del parachoques trasero al pin 12, el positivo del altavoz al pin 8 y ahora los negativos de los parachoques delantero y trasero, el negativo del altavoz y el negativo general de la parte de abajo al anterior conector. También colocamos la pila de 9 V sujeta también con velcro.

     Lo conectamos al ordenador por USB, le cargamos el siguiente código por medio del software de Arduino y a experimentar y disfrutar.

#include <Servo.h>  // incluimos librería del servo
Servo motord;       // nombramos el servo derecho
Servo motori;       // nombramos el servo izquierdo

int paradelantero = 11; // pin al que está conectado el parachoques
                        // delantero
int paratrasero = 12;   // pin al que está conectado el parachoques
                        // trasero
int bocinapin = 8;      // pin al que está conectado el altavoz
boolean pdelantero = HIGH// definimos el estado del parachoques
                            // delantero
boolean ptrasero = HIGH;   // definimos el estado del parachoques
                           // trasero
void setup(){
  motord.attach(9);  // conectamos el servo derecho y definimos pin
  motori.attach(10);  // conectamos el servo derecho y definimos pin
  pinMode(paradelantero, INPUT_PULLUP); // pone pin como entrada y
                                        // activa la resistencia
                                        // interna
  pinMode(paratrasero, INPUT_PULLUP);  // pone pin como entrada y
                                       // activa la resistencia
                                       // interna
}

void loop() {
  pdelantero = digitalRead (paradelantero); // comprueba si ha
                                            // chocado por delante
  ptrasero = digitalRead (paratrasero); // comprueba si ha chocado
                                        //por delante

  if (pdelantero == LOW){   // si choco por delante
   parar();                 // para
   delay(500);              // espera 0,5 segundos
   bocina(100);             // pita cuatro veces
   bocina(100);
   bocina(100);
   bocina(100);
   atras();                 // va hacia atrás
   delay(1000);             // 1 segundo
   derecha();               // va hacia delante a la derecha
   delay(500);              // durante 0,5 segundos
}
  else {                    // si no
   adelante();              // va hacia adelante
}
if (ptrasero == LOW){       // si choco por detrás
  parar();                  // para
  delay(500);               // espera 0,5 segundos
bocina(50);                 // pita seis veces
bocina(50);
bocina(50);
bocina(50);
bocina(50);
bocina(50);
izquierda();                 // gira a la izquierda
delay(200);                  // durante 0,2 segundos
adelante();                  // Y sigue adelante
}
}   

void adelante(){             // subrutina adelante
  motord.write(0);           // servo derecho gira hacia 0°
  motori.write(180);         // servo izquierdo gira hacia 180°
}

void atras(){                // subrutina atras
  motord.write(180);         // servo derecho gira hacia 180
  motori.write(0);           // servo izquierdo gira hacia 0
}

void derecha(){              // subrutina derecha
   motord.write(90);         // servo derecho para
   motori.write(180);        // servo izquierdo gira hacia 180
}

void izquierda(){            // subrutina izquierda
   motord.write(0);          // servo derecho gira hacia 0
   motori.write(90);         // servo izquierdo para
}

void parar(){              // subrutina parar
  motord.write(90);        // servo derecho para
  motori.write(90);        // servo izquierdo para
}

void bocina(int tempo){    // subrutina bocina y variable tempo
  {
    tone(bocinapin,10);    // genera un tono
    delay(tempo);          // duración
  }
  noTone(bocinapin);       // para el tono
  delay(tempo);            // duración del paro por si se repite
}




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