sábado, 19 de diciembre de 2015

COCHE ROBOT CON ARDUINO VERSION 3.0


Ahora que por fin llegaron las piezas que nos faltaban vamos a realizar otra actualización o modificación, según se mire, en nuestro robot.

En este caso vamos a reemplazar los diodos y las LDR por un sensor ultrasónico y además le incorporaremos un módulo bluetooth para poder controlarlo con nuestro móvil Android.

Empezaremos retirando los leds y las LDR con su soporte como hemos dicho anteriormente y haremos un nuevo soporte para el sensor ultrasónico, hemos aprovechado restos del mismo contrachapado con el que fabricamos el robot.

Recortamos un trozo de 5 cm por 2,5 cm aproximadamente, luego centramos el sensor y marcamos los agujeros a cortar.


 En la parte inferior le pegamos el brazo para conectarlo al servo.


Continuamos colocando el sensor en su sitio y fijándolo con una goma elástica o hilo y también le conectamos ya los cables.
     
         

Acontinuación ponemos el conjunto del sensor y soporte en el servo en el cual estaban antes los leds las LDR. Este servo el cual le teníamos sin conectar la señal, se la conectamos al pin 7 del Arduino. Después conectamos los cables al Arduino de la siguiente forma, el GND del sensor al GND del Arduino (el negativo), del Vcc del sensor al pin de 5 V del Arduino ( el positivo), del Trig del sensor al pin 6 del Arduino ( el emisor), y el Echo del sensor al pin 5 del Arduino (el receptor).


Ya que estamos con los cables, también conectamos los del bluetooth de la siguiente manera, del Vcc del bluetooth al pin de 5 V del Arduino (positivo), del GND del bluetooth al GND del Arduino (negativo), del TXD del bluetooth al RX3 (pin 15) del Arduino y el RXD del bluetooth al TX3 (pin 14) del Arduino, nosotros hemos utilizado RX3 y TX3, que es el puerto 3 de comunicaciones, porque tenemos un Arduino Mega, si no hay que utilizar el RX0 (pin 0) y el TX0 (pin 1) respetivamente. Al utilizar el RX0 y el TX0 tendremos que desconectarlos cada vez que queramos subir el código al Arduino, ya que también es el utilizado por la comunicación del USB y daría conflictos.
El módulo de bluetooth lo colocamos en donde no nos moleste, nosotros lo colocamos con un poco de velcro detrás del servo delantero.




Y ahora el código, son tres partes para poder elegir el funcionamiento, el primero funciona solo utilizando el ultrasonido, el segundo solo utilizando el bluetooth y el tercero utiliza los dos.

Solo con ultrasonidos.

#include <Servo.h> //incluimos librería del servo

Servo izquierdo; //nombramos servo izquierdo
Servo derecho; //nombramos servo derecho
Servo radar; //nombramos servo del ultrasonido
const int emisor = 6; // pin del emisor de ultrasonido
const int recetor = 5; //pin del recetor de ultrasonido
const int pinizquierdo = 10; //pin del servo izquierdo
const int pinderecho = 9; //pin del servo derecho
const int pinradar = 7; //pin del servo del ultrasonido
const int distancialimite = 40; //distancia máxima a la que se acerca
                                //a un obstáculo
char posicionradar = 'i'; //declaramos variable de la posición del
                          //radar y lo llevamos a i
long tiempo = 0; //declaramos variable de tiempo
long tiempoizquierda = 0; //declaramos variable de tiempo desde
                          //último giro a la izquierda
long tiempoderecha = 0; //declaramos variable de tiempo desde el
                        //último giro a la derecha

void setup(){  
izquierdo.attach(pinizquierdo); //activamos servo izquierdo
derecho.attach(pinderecho); //activamos servo derecho
radar.attach(pinradar); //activamos servo del ultrasonidos
}

void loop(){
int distanciaizquierda = 90; //declaramos variable de distancia por
                             //la izquierda e igualamos a 90
int distanciaderecha = 90; //declaramos variable de distancia por la
                           //derecha e igualamos a 90
int distanciacentro = 90; //declaramos variable de distancia por el
                         //centro e igualamos a 90
adelante(); //iniciamos la marcha
if(millis()>tiempo+300){ //si el tiempo real es mayor que la variable
                          //tiempo más 300
if(posicionradar == 'i'){ //y estamos en i
distanciaizquierda = ping(); //guardamos la distancia en la variable
posicionradar = 'c'; //vamos a la posición c
}
else if(posicionradar == 'c'){//si estamos en la posición c
distanciacentro = ping(); //guardamos la distancia en la variable
posicionradar = 'd'; //vamos a la posición d
}
else{ //si estamos en d
  distanciaderecha = ping(); //guardamos la distancia en la variable
  posicionradar = 'i'; // vamos a la posición i
}
tiempo = millis(); //igualamos la variable tiempo al tiempo real para
                   //volver empezar
}
switch (posicionradar){ //declaramos las posiciones del radar
case 'd': //caso d
radar.write(40); //mandamos al radar a 60º
break; //paramos
case 'c': //caso c
radar.write(80); //mandamos radar a 80º
break; //paramos
case 'i': //caso i
radar.write(140); //mandamos al radar a 120º
break; //paramos


}
if(distanciaizquierda<distancialimite){ //si la distancia por la
                        //izquierda es menor que la distancia limite
if (millis()<tiempoizquierda + 500){ //y si el tiempo real es menor
                                   //que el tiempo izquierda más 500
atras(500); //vamos atras durante 0.5 segundos
derecha(1000); //giramos a la derecha durante 1 segundos
}
else{ //si no
derecha(200); //giramos  a la derecha durante 0.2 segundos
}
tiempoderecha = millis(); //igualamos el tiempo derecha al tiempo
                            //real
}
if(distanciacentro<distancialimite){ //si la distancia por el centro
                                 //es menor que la distancia limite
  if(distanciaderecha>distanciaizquierda){ //y la distancia por la
                              //derecha es mayor que por la izquierda
    atras(500); //vamos atrás durante 0.5 segundos
    derecha(200); //giramos  a la derecha durante 0.2 segundos
   }
  else{ //si no
    atras(500); //vamos atrás durante 0.5 segundos
    izquierda(200); //giramos  a la izquierda durante 0.2 segundos
  }
}
if(distanciaderecha<distancialimite){ //si la distancia por la
                          //derecha es menor que la distancia limite
if(millis()<tiempoderecha + 500){ //y si el tiempo real es menor que
                                 //el tiempo derecha más 500
atras(500); //vamos atrás durante 0.5 segundos
izquierda(1000); //giramos a la izquierda durante 1 segundos
}
else{ // si no
izquierda(200); //giramos levemente a la izquierda durante 0.2
                //segundos
}
tiempoizquierda = millis(); //igualamos el tiempo izquierda al tiempo
                            //real
}
}
int ping(){ //declaramos el ultrasonido
long distancia, cm; //declaramos la variable distancia
pinMode(emisor, OUTPUT); //activamos el pin emisor como salida
digitalWrite(emisor, LOW); //lo apagamos
delayMicroseconds(2); //durante 2 microsegundos
digitalWrite(emisor, HIGH); //emitimos un pulso
delayMicroseconds(5); // durante 5 microsegundos
digitalWrite(emisor, LOW); //lo apagamos
pinMode(recetor, INPUT); //activamos el pin receptor como entrada
distancia = pulseIn(recetor, HIGH); //igualamos la variable a la
                                    //lectura del recetor
cm = microsegundosacm(distancia); //convertimos el tiempo en  
                                  //centímetros
return round(cm); //devolvemos números enteros
}
long microsegundosacm(long microsegundos){
return microsegundos / 29 / 2;
}
void adelante(){ //subrutina adelante
izquierdo.write(150); //mandamos el servo a 150º
derecho.write(30); //mandamos el servo a 30º
}
void izquierda(float t){ //subrutina izquierda
izquierdo.write(30); //mandamos el servo a 30º
derecho.write(30); //mandamos el servo 30º
delay(t); //durante el tiempo seleccionado
}
void derecha(float t){ //subrutina derecha
izquierdo.write(150); //mandamos el servo a 150º
derecho.write(150); //mandamos el servo a 150º
delay(t); //durante el tiempo seleccionado
}

void atras(int t){ //subrutina atrás
izquierdo.write(30); //mandamos el servo a 30º
derecho.write(150); //mandamos el servo a 150º
delay(t); //durante el tiempo seleccionado
}
void parar(){ //subrutina parar
izquierdo.write(90); //mandamos el servo a 90º
derecho.write(90); //mandamos el servo a 90º
}



 Solo bluetooth.

#include <Servo.h> //incluimos librería servo

Servo izquierdo; //nombramos servo izquierdo    
Servo derecho; //nombramos servo derecho
const int pinizquierdo = 10; //pin del servo izquierdo
const int pinderecho = 9; //pin del servo derecho
int estado = '0'; //variable estado iniciamos en S

void setup()  {
  Serial3.begin(9600);    // activamos el puerto serial 3 para
                          //comunicación con el Bluetooth
  izquierdo.attach(pinizquierdo); //activamos servo izquierdo
  derecho.attach(pinderecho);  //activamos servo derecho
 }

void loop()  {
  
  if(Serial3.available()>0){  // lee el bluetooth
      estado = Serial3.read(); //y almacena en estado
  }
  if(estado=='1'){           // si estado es F (botón adelante)
     izquierdo.write(150); //mandamos servo a 150º
     derecho.write(30);     //mandamos servo a 30º
  }
  if(estado=='3'){          //si estado es L (botón izquierda)
      izquierdo.write(110); //mandamos servo a 110º
      derecho.write(0);     //mandamos servo a 0º
  }
  if(estado=='0'){         //si estado es S (botón parar)
      izquierdo.write(91); //mandamos servo a 91º
      derecho.write(92);  //mandamos servo a 92º
  }
  if(estado=='4'){          //si estado es R (botón derecho)
       izquierdo.write(180); //mandamos servo a 180º
       derecho.write(80);  //mandamos servo a 80º
  }
  
  if(estado=='2'){          //si estado es B (botón atrás)
       izquierdo.write(30); //mandamos servo a 30º
       derecho.write(150);  //mandamos servo a 150º   
  }
  
}


         
Para utilizar este código ahí que instalar una aplicación en muestro móvil Android para que se comunique por bluetooth con nuestro Arduino, vale cualquiera que le podamos modificar el nombre al botón o nos muestre el nombre de botón para poder modificar nuestro código, se cambiaría la letra del estado. Nosotros hemos utilizado “Arduino bluetooth controller”.


Una vez cargado el código (recordad de que si utilizáis el RX0 y el TX0 tenéis que desconectar los cables primero, después de cargar el código se conectan otra vez los cables) y encendido el Arduino nos parpadeara el led del módulo bluetooth, activamos el bluetooth del móvil y lo vinculamos, el código del módulo suele ser “1234” o “0000”.

Luego de instalar la aplicación la abrimos y con el Arduino encendido, pinchamos en “proceed”, nos aparece una ventana donde seleccionamos el modulo bluetooth “HC-06”, el led dejara de parpadear, después seleccionamos “controller mode” le damos a opciones y seleccionamos “set commands” e introducimos los estados del código a cada botón.
   
       
Y por último los dos códigos unidos

#include <Servo.h> //incluimos librería del servo

Servo izquierdo; //nombramos servo izquierdo
Servo derecho; //nombramos servo derecho
Servo radar; //nombramos servo del ultrasonido
const int emisor = 6; // pin del emisor de ultrasonido
const int recetor = 5; //pin del recetor de ultrasonido
const int pinizquierdo = 10; //pin del servo izquierdo
const int pinderecho = 9; //pin del servo derecho
const int pinradar = 7; //pin del servo del ultrasonido
const int distancialimite = 40; //distancia máxima a la que se acerca
                                //a un obstáculo
char posicionradar = 'i'; //declaramos variable de la posición del
                           //radar y lo llevamos a i
long tiempo = 0; //declaramos variable de tiempo
long tiempoizquierda = 0; //declaramos variable de tiempo desde último
                           //giro a la izquierda
long tiempoderecha = 0; //declaramos variable de tiempo desde el
                       //último giro a la derecha
int estado = '0';         //variable estado iniciamos en 0


void setup()  {
  Serial3.begin(9600);    // inicia el puerto serial 3 para
                          //comunicación con el Bluetooth
  izquierdo.attach(pinizquierdo); //activamos servo izquierdo
derecho.attach(pinderecho); //activamos servo derecho
radar.attach(pinradar); //activamos servo del ultrasonidos
}


void loop()  {

   if(Serial3.available()>0){   // lee el bluetooth
      estado = Serial3.read(); //y almacena en estado
  }
  if(estado=='1'){           //si estado es 1 (botón adelante)
     izquierdo.write(150); //mandamos servo a 150º
     derecho.write(30);     //mandamos servo a 30º
  }
  if(estado=='3'){          //si estado es 3 (botón izquierda)
      izquierdo.write(110); //mandamos servo a 110º
      derecho.write(0);     //mandamos servo a 0º
  }
  if(estado=='0'){         //si estado es 0 (botón x)
      izquierdo.write(91); //mandamos servo a 91º
      derecho.write(92);  //mandamos servo a 92º
  }
  if(estado=='4'){          //si estado es 4 (botón derecho)
       izquierdo.write(180); //mandamos servo a 180º
       derecho.write(80);  //mandamos servo a 80º
  }
  
  if(estado=='2'){          //si estado es 2 (botón atrás)
       izquierdo.write(30); //mandamos servo a 30º
       derecho.write(150);  //mandamos servo a 150º
  }
  
  if (estado =='6'){          // si estado es 6 (botón triangulo)  
                         //funciona con ultrasonidos
  
int distanciaizquierda = 90; //declaramos variable de distancia por la
                             //izquierda e igualamos a 90
int distanciaderecha = 90; //declaramos variable de distancia por la
                           //derecha e igualamos a 90
int distanciacentro = 90; //declaramos variable de distancia por el
                                 //centro e igualamos a 90
adelante(); //iniciamos la marcha
if(millis()>tiempo+300){ //si el tiempo real es mayor que la variable
                          //tiempo más 300
if(posicionradar == 'i'){ //y estamos en i
distanciaizquierda = ping(); //guardamos la distancia en la variable
posicionradar = 'c'; //vamos a la posición c
}
else if(posicionradar == 'c'){//si estamos en la posición c
distanciacentro = ping(); //guardamos la distancia en la variable
posicionradar = 'd'; //vamos a la posición d
}
else{ //si estamos en d
  distanciaderecha = ping(); //guardamos la distancia en la variable
  posicionradar = 'i'; // vamos a la posición i
}
tiempo = millis(); //igualamos la variable tiempo al tiempo real para
                   //volver empezar
}
switch (posicionradar){ //declaramos las posiciones del radar
case 'd': //caso d
radar.write(40); //mandamos al radar a 60º
break; //paramos
case 'c': //caso c
radar.write(80); //mandamos radar a 80º
break; //paramos
case 'i': //caso i
radar.write(140); //mandamos al radar a 120º
break; //paramos


}
if(distanciaizquierda<distancialimite){ //si la distancia por la  
                        //izquierda es menor que la distancia limite
if (millis()<tiempoizquierda + 500){ //y si el tiempo real es menor
                                 //que el tiempo izquierda más 500
atras(500); //vamos atrás durante 0.5 segundos
derecha(1000); //giramos a la derecha durante 1 segundos
}
else{ //si no
derecha(200); //giramos  a la derecha durante 0.2 segundos
}
tiempoderecha = millis(); //igualamos el tiempo derecha al tiempo real
}
if(distanciacentro<distancialimite){ //si la distancia por el centro  
                                //es menor que la distancia limite
  if(distanciaderecha>distanciaizquierda){ //y la distancia por la
                             //derecha es mayor que por la izquierda
    atras(500); //vamos atrás durante 0.5 segundos
    derecha(200); //giramos  a la derecha durante 0.2 segundos
   }
  else{ //si no
    atras(500); //vamos atrás durante 0.5 segundos
    izquierda(200); //giramos  a la izquierda durante 0.2 segundos
  }
}
if(distanciaderecha<distancialimite){ //si la distancia por la derecha
                                    //es menor que la distancia limite
if(millis()<tiempoderecha + 500){ //y si el tiempo real es menor que
                                    //el tiempo derecha más 500
atras(500); //vamos atrás durante 0.5 segundos
//izquierda(1000); //giramos a la izquierda durante 1 segundos
}
else{ // si no
izquierda(200); //giramos levemente a la izquierda durante 0.2
                 //segundos
}
tiempoizquierda = millis(); //igualamos el tiempo izquierda al tiempo
                            //real
}
  }
  
}
int ping(){ //declaramos el ultrasonido
long distancia, cm; //declaramos la variable distancia
pinMode(emisor, OUTPUT); //activamos el pin emisor como salida
digitalWrite(emisor, LOW); //lo apagamos
delayMicroseconds(2); //durante 2 microsegundos
digitalWrite(emisor, HIGH); //emitimos un pulso
delayMicroseconds(5); // durante 5 microsegundos
digitalWrite(emisor, LOW); //lo apagamos
pinMode(recetor, INPUT); //activamos el pin receptor como entrada
distancia = pulseIn(recetor, HIGH); //igualamos la variable a la
                                     //lectura del recetor
cm = microsegundosacm(distancia); //convertimos el tiempo en
                                  //centímetros
return round(cm); //devolvemos números enteros
}
long microsegundosacm(long microsegundos){
return microsegundos / 29 / 2;
}
void adelante(){ //subrutina adelante
izquierdo.write(150); //mandamos el servo a 150º
derecho.write(30); //mandamos el servo a 30º
}
void izquierda(float t){ //subrutina izquierda
izquierdo.write(30); //mandamos el servo a 30º
derecho.write(30); //mandamos el servo 30º
delay(t); //durante el tiempo seleccionado
}
void derecha(float t){ //subrutina derecha
izquierdo.write(150); //mandamos el servo a 150º
derecho.write(150); //mandamos el servo a 150º
delay(t); //durante el tiempo seleccionado
}

void atras(int t){ //subrutina atrás
izquierdo.write(30); //mandamos el servo a 30º
derecho.write(150); //mandamos el servo a 150º
delay(t); //durante el tiempo seleccionado
}
void parar(){ //subrutina parar
izquierdo.write(90); //mandamos el servo a 90º
derecho.write(90); //mandamos el servo a 90º
}







Versiones anteriores del coche robot.
Version 1:
http://imoslonxe.blogspot.com.es/2015/11/coche-robot-con-arduino.html
Version 2:
http://imoslonxe.blogspot.com.es/2015/11/coche-robot-con-arduino-version-20.html

Autor: Jose Manuel Parafita Lamas