Hola, basándose en varios videos que estan colgados en YouTube decidi hacer este pequeño robot, el funcionamiento del robot requiere una aplicación android (que programe en MIT App Inventor 2) la cual envía un carácter a través de un módulo bluetooth al serial de arduino y que activa las condicionales "if"
no es necesario que ustedes programen una aplicación ya que pueden bajar la que yo hice desde Aquí, solo hay que activar el bluethoot en su teléfono y sincronizarla al módulo de arduino, es posible mover el robot hacia cualquier lado y al oprimir "echo" el robot empezará a sensar distancias y elegirá la distancia más larga para seguir avanzando
al ser uno de mis primeros códigos seguramente los que estén más familiarizados con estos temas podrán corregir o mejorar algunas cosas.
Como chasis utilice un viejo CD y moldee unas piezas de vinil espumado de 3mm. el cual es muy fácil de trabajar, los motores, el puente H y el arduino es alimentado por una sola batería de aproximadamente 4500 miliamperes, estas y otras cosillas a considerar se encuentran en los comentarios del código
Esquemas y mas información en la segunda parte
Código del programa:
/*
ARDUINO integrado L293D(Puente H)
pins 5 10
6 15
7 7
8 2
5V 1, 9, 16
GND 4, 5, 12, 13
El motor 1 pines 3 y 6 del Puente H
El motor 2 pines 11 y 14 del Puente H
La fuente de alimentación de los Motores se conecta a tierra y
el positivo al pin 8 del puente H.
Conexión del Modulo Bluetooth HC-06 y el Arduino
ARDUINO Bluetooth HC-06
0 (RX) TX
1 (TX) RX
5V VCC
GND GND
!!Cuidado!! Las conexiones de TX y RX al modulo Bluetooth deben estar desconectadas
en el momento que se realiza la carga del código (Sketch) al Arduino.
Conexion Sensor Ultrasonido HC-SR04
ARDUINO Ultrasonido HC-SR04
2 Echo
3 Trig
5V VCC
GND Gnd
*/
#include <Servo.h> ///// recuerden que al incluir la librería servo se desactivan los PWM de los pins 9 y 10 del arduino uno
Servo servo1;
int AngSerDer = 15; ////angulo para la derecha
int AngSerCen = 90; //////angulo para el centro
int AngSerIzq = 165; /////angulo para la izquierda
int izqA = 5; //// pines 5,6,7 y 8 al puente H
int izqB = 6;
int derA = 7;
int derB = 8;
int vel = 180; // Velocidad de los motores se puede variar (0-255)
int estado = '1'; // inicia en espera
int pecho = 2; // define el pin 2 como (pecho) para el Ultrasonido
int ptrig = 3; // define el pin 3 como (ptrig) para el Ultrasonido
int duracion, distancia; // para Calcular distancia
int DisDer;
int DisIzq;
int DisEcoDer;
int DisEcoIzq;
int DisFrenteEco;
void setup()
{
Serial.begin(9600); // inicia el puerto serial para comunicacion con el Bluetooth
servo1.attach(11); //// servo1 se conecta al pin 11, no usar 9 ni 10
pinMode(derA, OUTPUT);
pinMode(derB, OUTPUT);
pinMode(izqA, OUTPUT);
pinMode(izqB, OUTPUT);
pinMode(pecho, INPUT); // define el pin 2 como entrada (pecho)
pinMode(ptrig,OUTPUT); // define el pin 3 como salida (ptrig)
pinMode(13,OUTPUT);
}
void loop()
{
if(Serial.available()>0){ // lee el bluetooth y almacena en estado
estado = Serial.read();
}
if(estado=='2')
{ // Boton desplazar al Frente
servo1.write(AngSerCen);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
}
if(estado=='3')
{ // Boton IZQ
servo1.write(AngSerIzq);
analogWrite(derB, vel);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, vel);
}
if(estado=='4')
{ // Boton Parar
servo1.write(AngSerCen);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
if(estado=='5')
{ // Boton DER
servo1.write(AngSerDer);
analogWrite(derB, 0);
analogWrite(izqB, vel);
analogWrite(izqA, 0);
analogWrite(derA, vel);
}
if(estado=='6')
{ // Boton Reversa
servo1.write(AngSerCen);
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
}
///////http://elxedelectronics.blogspot.mx/
if (estado =='7'){ // Boton ON, se mueve sensando distancia
digitalWrite(ptrig, HIGH); // genera el pulso de trigger por 10us
delay(0.01);
digitalWrite(ptrig, LOW);
duracion = pulseIn(pecho, HIGH); // Lee el tiempo del Echo
distancia = (duracion/2) / 29; // calcula la distancia en centimetros
delay(10);
if (distancia <= 15 && distancia >=2)
{ // si la distancia es menor de 10cm
digitalWrite(13,HIGH); // Enciende LED
////////////// voltear derecha
servo1.write(AngSerDer);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
delay(700);
digitalWrite(ptrig, HIGH); // genera el pulso de trigger por 10us
delay(0.01);
digitalWrite(ptrig, LOW);
duracion = pulseIn(pecho, HIGH); // Lee el tiempo del Echo
DisEcoDer = (duracion/2) / 29; // calcula la distancia en centimetros
delay(10);
DisDer = DisEcoDer; ///guarda la variable DisEcoDer para luego compararla
delay(500);
//////////////////voltear izquierda
servo1.write(AngSerIzq);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
delay(700);
digitalWrite(ptrig, HIGH); // genera el pulso de trigger por 10us
delay(0.01);
digitalWrite(ptrig, LOW);
duracion = pulseIn(pecho, HIGH); // Lee el tiempo del Echo
DisEcoIzq = (duracion/2) / 29; // calcula la distancia en centimetros
delay(10);
DisIzq = DisEcoIzq; ///guarda la variable DisEcoIzq para luego compararla
delay(500);
if (DisDer > DisIzq) /// se comparan las variables y con ello las distancias
{
servo1.write(AngSerCen); /// se detiene un momento voltea, retrocede un poco
delay(400); /// y elige su nueva dirección
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
delay(300);
analogWrite(derB, 0);
analogWrite(izqB, vel);
analogWrite(izqA, 0);
analogWrite(derA, vel);
delay(500);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
delay(200);
}
if (DisDer < DisIzq)
{
servo1.write(AngSerCen);
delay(400);
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
delay(300);
analogWrite(derB, vel);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, vel);
delay(500);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
delay(200);
}
}
else{ // Si no hay obstaculos se desplaza al frente
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
}
}
if(estado=='1'){ // detiene los motores queda en espera
servo1.write(AngSerCen);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
}
Disculpa no me podrias pasar tu aplicacion pero en el formato de AppInventor? Gracias
ResponderEliminarhola, disculpa no sé porque no vi tu comentario, si aun lo necesitas claro que te lo puedo pasar, vuelve a comentar voy a estar pendiente
ResponderEliminarHola, no tienes el esquema del circuito? Saludos, si es que si me lo puedes pasar a correo: Gasca_bd@live.com
ResponderEliminarhola, el esquema esta en esta publicación: http://elxedelectronics.blogspot.com/2015/11/tutorial-robot-detector-de-obstaculos.html
EliminarHola , Me podrias pasar el esquema al correo: vaca671@gmail.com Gracias.
ResponderEliminarhola, el esquema esta en esta publicación: http://elxedelectronics.blogspot.com/2015/11/tutorial-robot-detector-de-obstaculos.html
EliminarSaludos y antes que todo gracias por tu aportación... ¿Podrías pasarnos la programación de bloques en App Inventor?... ¡Por tu apoyo, gracias!
ResponderEliminarjohanplaymx@gmail.com
hola, gracias por ver mis publicaciones, he subido el archivo en formato .aia (formato para App Inventor 2) para que puedas cargarlo, ver los bloques y modificarlo o mejorarlo, el link esta al final de esta publicacion http://elxedelectronics.blogspot.com/2015/11/tutorial-robot-detector-de-obstaculos.html
Eliminarbuenas, me podrias brindar el apk para poder editarlo en el app inventor mi correo es bpayanodelacruz@gmail.com gracias :)
ResponderEliminarplz specify: out of a and A which represents clockwise and which anti clockwise.
ResponderEliminarY los materiales este sería el tutorial? O sólo es una mejora..
ResponderEliminarSaludos
Y los materiales este sería el tutorial? O sólo es una mejora..
ResponderEliminarSaludos
Hermano, muchisimas gracias por el aporte. en verdad me ayudo demasiado, espero aprender mas y en un futuro compartirle mis propios proyectos, de nuevo gracias.
ResponderEliminarGracias!
Eliminarfalta el digitalWrite(13,LOW);
ResponderEliminarpara apagar el led cuando no detecta obstaculos, adjunto la ultima parte del codigo con la mejora, saludos
if (DisDer < DisIzq)
{
servo1.write(AngSerCen);
delay(400);
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
delay(300);
analogWrite(derB, vel);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, vel);
delay(500);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
delay(200);
}
digitalWrite(13,LOW);
}
else{ // Si no hay obstaculos se desplaza al frente
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
}
}
if(estado=='1'){ // detiene los motores queda en espera
servo1.write(AngSerCen);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
}
el modulo bluethoo es para manejar el robot desde el cel ?, puedo quitar el modulo y que arduino dicte las ordenes y comience a ejecutarlas ?
ResponderEliminaroye buen trabajo podrias mandarme el programa para arduino, por favor , me marca un error, el error es stray /302 in the program. buen trabajo.
ResponderEliminar