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