martes, 18 de enero de 2011

4. Programa para el Robot Seguidor de Linea.

El programa hecho para este robot es muy básico y puede ser modificado para mejorar el control del robot, se puede agregar auto ajuste de sensibilidad a la luz de los sensores, medidor de nivel de batería, algún sonido o cualquier otra cosa útil en el desempeño del robot.

int Sen1 = 0; //Extremo izquierdo
int Sen2 = 1; //Izquierdo
int Sen3 = 2; //Centro
int Sen4 = 3; //Derecho
int Sen5 = 4; //Extremo Derecho

int Val1 = 0; // Valor de los sensores
int Val2 = 0;
int Val3 = 0;
int Val4 = 0;
int Val5 = 0;
//Control de los motores
int Azul = 6;
int Gris = 9;
int Cafe = 10;
int Negr = 11;

int x = 650; //Diferencia entre negro y blanco (Valor > x = Negro).

int Vel0 = 100;
int Vel1 = 155; // Especificar velocidad de
int Vel2 = 190; // motores en el giro.
int Vel3 = 230;
int Vel = 255;

void setup()
{
pinMode(Azul, OUTPUT);
pinMode(Gris, OUTPUT);
pinMode(Cafe, OUTPUT);
pinMode(Negr, OUTPUT);
Serial.begin(9600);
}
void loop()
{
//Lectura y registro de los valores de los sensores
Val1 = analogRead(Sen1);
Val2 = analogRead(Sen2);
Val3 = analogRead(Sen3);
Val4 = analogRead(Sen4);
Val5 = analogRead(Sen5);
//Direccionamiento del robot
if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel);
analogWrite(Negr, Vel);
}
else if ((Val1 < x)&&(Val2 > x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel1);
analogWrite(Negr, 0);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 > x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel1);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 > x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel2);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 > x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel3);
}
//*********!!!!!!!!!
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 < x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel);
}
else if ((Val1 < x)&&(Val2 > x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
}
else if ((Val1 > x)&&(Val2 > x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel3);
analogWrite(Negr, 0);
}
else if ((Val1 > x)&&(Val2 < x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel);
analogWrite(Negr, 0);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 > x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, Vel);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel2);
delay(250);
}
else if ((Val1 > x)&&(Val2 > x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
delay(250);
}
else if ((Val1 > x)&&(Val2 < x)&&(Val3 > x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
delay(250);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 > x)&&(Val4 < x)&&(Val5 > x))
{
analogWrite(Azul, 0);
analogWrite(Gris, Vel);
analogWrite(Cafe, 0);
analogWrite(Negr, Vel2);
delay(250);
}
else if ((Val1 > x)&&(Val2 > x)&&(Val3 > x)&&(Val4 > x)&&(Val5 > x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel2);
analogWrite(Negr, 0);
delay(250);
}
else if ((Val1 < x)&&(Val2 < x)&&(Val3 < x)&&(Val4 < x)&&(Val5 < x))
{
analogWrite(Azul, Vel);
analogWrite(Gris, Vel);
analogWrite(Cafe, 0);
analogWrite(Negr, 0);
delay(200);
analogWrite(Azul, 0);
analogWrite(Gris, 0);
analogWrite(Cafe, Vel);
analogWrite(Negr, Vel);
}
}

68 comentarios:

  1. antes que nada hola, estudio mecatronica, tengo algunas dudas si pudieras responder estaria maravilloso, para empezar que significa "<>", por que pones dos parentesis y no cierras, ej.
    "else if ((Val1 <>". por la atencion gracias

    ResponderEliminar
    Respuestas
    1. significa <> menor o mayor que por ejemplo: 5>4 o 5<6 entonces diria: else if (sino cumple la condicion anterior) (Val1 <311) elVal1 es menor que 311 nose que sea val1 no eh leido el articulo y ese 311 es un ejemplo pero asi seria ;)

      Eliminar
  2. Hola creo que tuve un problema cuando copie el codigo espero que ya haya quedado claro, gracias por tu comentario :)

    ResponderEliminar
  3. hola miguel, primero que nada decirte que es un gran proyecto y felicitarte por ello. Estoy intento recrearlo pero estoy teniendo algunas dudas, como por ejemplo este problema de la programación que no me a quedado claro y tampoco el diagrama de conexiones al arduino.
    Que podrías corregir la programación y hacer un dibujo croquis del diagrama de conexiones?
    Gracias y mucha suerte

    ResponderEliminar
  4. Hola GuillenNXT primero que nada gracias por interesarte por el proyecto.
    Podrias ser un poco mas especifico acerca de tu duda en la programacion del robot?
    Respecto al diagrama de conexiones el conector J1 ira conectado a las salidas del arduino 8, 9, 10 y 11; el conector J2 es donde va conectada la bateria para alimentar tanto al arduino como al circuito del control del motor el positivo va a la terminal 1 y el negatovo a la 2 de este conector; el conector J3 es una salida de 5 volts regulada util si necesitas utilizar algun otro circuito digital y por ultimo el conector J4 es la salida del driver de los motores 1 y 2 son de un motor, 3 y 4 son del otro motor.
    Espero haber aclarado tu duda de la conexion con el arduino, si no ha quedado claro no dudes en escribir :)

    ResponderEliminar
  5. amigo que hace X porque le das valor de 800?
    estoy untilizando un sensor de linea el cny70,
    no c mucho del tema ;)

    ResponderEliminar
  6. Hola el 800 es el valor que va a compar la entrada analogica dada por el sensor (de 0 255)si esta es mayor a x es negro si es menor es blanco, x se puede variar para ajustar la sensibilidad y los CNY70 son iguales a los que ocupe en este proyecto saludos

    ResponderEliminar
  7. disculpa me podrias decir cuales son los materiales que utilizastes y los sensores es que vemos hacer un seguidor de linea

    ResponderEliminar
  8. Hola si ves en el punto numero uno del blog se describe la lista de materiales y tambien estan los diagramas esquematicos del proyecto saludos

    ResponderEliminar
  9. Mario Humberto G.V.30 de junio de 2011, 18:30

    Hola amigo!!!, Soy nuevo en esta area y tengo como proyecto muy sencillo desarrollar un robot seguidor de linea y las características que nos piden son muy similares a tu desarrollo, solo que con solo dos sensores infrarrojos CNY70, dos servo motores de 360 grados y un arduino UNO. Mi pregunta es ¿debo utilizar forsozamente el Circuito Integrado L293B para poder manipular los sensores?

    Te agradesco de antemano tu pronta respuesta.

    Te dejo mi corre electronico por alguna aclaracion sobre la pregunta.

    spider_121mh@hotmail.com

    ResponderEliminar
  10. Hola Mario.

    Te comento que el L293B no es para manejar los sensores sino que es un par de puentes H para poder controlar dos motores en ambas direcciones con un par de bits, por otro lado el CNY70 es igual al sensor que use en el robot solo checa si los pines son iguales, los sensores van conectados a las entradas analogias del arduino como se puede ver en el circuito. Te recomiento que para manejar tus servomotores utilices un transistor para aumentar la corriente ya que si los conetas al arduino directamente es probable que no funcionen correctamente te recomiento un bc337 o similar.
    Saludos

    ResponderEliminar
  11. oe parcero yo lo quiero hacer pero no se por donde enpesar

    ResponderEliminar
  12. Hola te recomiendo que empieces por el principio jajaja. Hablando en serio te recomiendo que vayas al punto numero uno del blog y revises los materiales utilizados y la construcción de la parte mecánica del robot; posteriormente podrías trabajar con el diseño electrónico, hacer pruebas del robot sin programarlo aun (yo lo hice cargando pequeñas rutinas para que el robot caminara adelante atrás y diera vueltas) una vez probado todo esto empezar con la parte de programación y adaptar el programa que propongo para tus necesidades y por que no hasta perfeccionarlo :).

    Cualquier duda comentala aquí o mandame un mail. Saludos

    ResponderEliminar
  13. hola buenas tardes primero que nada te agradesco por el aporte y en quisiera saber si me puedes ayudar con el programa para el arduino por que ya estuve cambiando algunas cosas como lo que menciona un chavo anteriormente acerca de los dobles parentesis y lo <> ya hize de todo y me sigue marcando error el compilador de arduino al querer verificaro compilar por tu atencion gracias te dejo mi correo para ver si me ayudas un poco, vaquero4545_mn@yahoo.com.mx

    ResponderEliminar
  14. Espero que haya quedado corregido definitivamente el programa GRACIAS a todos por sus comentarios

    ResponderEliminar
  15. HOLA. ME PARECE MUY BUEN PROYECTO; PERO EL CODIGO NO ME FUNCIONA YA QUE NO SE PUEDE COMPILAR Y ARROJA UN ERROR

    ResponderEliminar
  16. Hola,acabo de compilar el programa y no me arroja ningún error, cual es el error que te marca a ti?

    ResponderEliminar
  17. Que tal miguel, estoy llevando a cabo una replica de tu proyecto, quisera saber si tienes a la mano algunos codigos para motor que avance al frente y detras, por cierto, como ensamblaste las ruedas a los motores, los que tengo tienen en el centro del eje por asi decirlo muy corto el metal donde se le ensambla las ruedas, Gracias , si tuvieras mas codigos con los que hiciste las pruebas me serian de mucha ayuda

    ResponderEliminar
  18. Hola pandemic te comento que azul, gris, café y negro son los cables de los motores azul y gris para uno y café y negro para otro, si quieres un código para que solo avance hacia adelante elimina toda la parte de las condiciones if y la lectura de los sensores y únicamente escribe.

    analogWrite(Azul, Velx);
    analogWrite(Gris, 0);
    analogWrite(Cafe, Velx);
    analogWrite(Negr, 0);

    y a x hay que asignarle valor 1 0 2 para ir lento o despacio y haca atrás de forma contraria

    analogWrite(Azul, 0);
    analogWrite(Gris, Velx);
    analogWrite(Cafe, 0);
    analogWrite(Negr, Velx);

    Las ruedas las acople a los motores con un pegamento cola loca y carbonado y de esta manera quedan muy bien pegadas puedes acoplarlas también mediante bandas y poleas o algun otro tipo de engranajes hay muchas formas, te recomiendo visites http://www.robodacta.mx/ que es una tienda donde venden algunas cosas de interés para robótica y electrónica y http://www.sparkfun.com/ en donde puedes encontrar inmensa cantidad de artículos electrónicos de tecnología actual saludos!!!

    ResponderEliminar
  19. Oye tengo una duda ya tengo mi circuito armkado pero mi circuito integrado se calienta muchisimo a la hora que lo conecto a una fuente de poder , jala mucho amperaje y esto me preocupa, ya que aunqe lo vaya regulando no funcionan los servomoteres hasta llegar a los 6 v , en cambio si lo conecto con un eliminador directo como de celular no se calienta... que me reocmiendas que haga, le coloque un disipador de calor, o simplemente cheke de nuevo el circuito o tal vez ste danado el puente H?

    ResponderEliminar
  20. buen proyecto. podrias colocar el diagrama (croquis) de conexión al arduino, pues no tengo claro como debe ser la manera correcta. Te agradecería si lo hicieras

    ResponderEliminar
  21. hola... dices que las salidas pwm son 8, 9, 10, 11 pero en el codigo está 6, 9, 10, 11

    ResponderEliminar
  22. Tienes toda la razón, un pequeño error de redacción

    ResponderEliminar
  23. disculpa los motores tienen que funcionar cuando pasas sobre los sensores una superficie blanca o negra???, en mi caso use lo cny70 y cuando paso sobre estos una hoja blanca se encienden los motores, pero supongo que se tienen que encender con una superficie de color negro, espero me entendieses y me pudieras aclarar mi duda :D

    ResponderEliminar
  24. Lo motores funcionan de acuerdo a la secuencia que fue determinada en el programa por ejemplo si ven todo blanco siguen hacia adelante y si siguen detectando blanco retroceden solo es cuestión de que te fijes en la programación del robot.

    Saludos

    ResponderEliminar
  25. ola chavos tego una dadu sobre un programa en ensamblador estoy usando el pic 16f628a
    que tienes comparadores y no se como especificar que sean salidas digitales

    ResponderEliminar
  26. Hola cesarjoaquin, este proyecto no tiene nada que ver con PIC y esta programado completamente en C, te recomiendo que busques alguna foro sobre ensamblador

    ResponderEliminar
  27. Hola miguel, oye disculpa si quisiera que el programa lea en vez de una linea negra con fondo blanco quiero que sea al revez que lea una linea blanca con fondo negro como lo puedo hacer? modificando al revez todos los if? o como ?

    ResponderEliminar
  28. Hola:

    Así es, tendrías que modificar las condiciones if para invertirlas y tal vez ajustar la variable x que es la correspondiente a la sensibilidad de los sensores.

    Saludos

    ResponderEliminar
  29. hola antes que nada quisiera sabes el pq usas 5 sensores si creeria que con 2 es sufuciente para que el carro siga linea negra....por cierto uso sensores cny70

    ResponderEliminar
  30. Son 5 sensores por que no solo se trata de seguir la linea negra sino de detectar intersecciones, saber si una curva es muy pronunciada o suave y de esta manera determinar si el robot puede tomar la curva con cierta velocidad o debe frenar un poco; con 2 sensores es suficiente si la pista que recorrerá el robot es sencilla y aun así llega a tener fallas y puede salirse. Aunque el numero de sensores es a criterio propio de cada diseñador y el CNY70 es de características muy similares al QRD1114

    Saludos.

    ResponderEliminar
  31. qe buen proyecto.. felicidades.... estoy intentando hacerlo.. cualquier inquietud la comentaré...espero tu ayuda... gracias

    ResponderEliminar
  32. Gracias a y claro cualquier duda aqui estamos para ayudar :)

    ResponderEliminar
  33. Que onda .. mira estoy buscando info pero para un seguidor de pared... creo que se puede hacer con un solo sensor .. el detalle es que hay que aplicarle control PID , pero en la mayoria de ejemplos que he visto tienen que hacer una adquision de datos y trabajan con software como simulink o labview ... tienes alguna idea de como realizar esto ... de hecho creo que con tu codigo se puede solo hay que modificar algunas cosas ... Pero por lo que veo no estaria haciendo control o si ??

    ResponderEliminar
  34. q tal Miguel muy buen proyecto felicitaciones!! retomando una pregunta q ya t hicieron me puedes ayudar dandome un ejemplo d como cambiaria la programacion para q siga una linea blanca con fondo negro t lo agradeceria y nuevamente felicitaciones :D

    ResponderEliminar
  35. Buen proyecto. Una pregunta, no tendrás un código para que el robot avance en zig zag? Gracias :D

    ResponderEliminar
  36. de antemano lo quiero felicitar por el proyecto,
    pues a mi me surgió una inquietud y es en donde se conectan los cny70 si en el arduino y si se le ponen resistencias o no
    muchas gracias

    ResponderEliminar
  37. Se conectan tal y como se muestra en el diagrama mostrado en esta sección del blog.
    http://seguidorlineaarduino.blogspot.com/2011/01/4-sensore-para-la-deteccion-de-la-linea.html

    ResponderEliminar
  38. un favor me podrias ayudar con el diagrama funcional con detalles tanto electronico como de programacion quiero y me urge hacer uno

    ResponderEliminar
  39. hola una pregunta para que utilizas el serial.begin(9600)

    ResponderEliminar
    Respuestas
    1. El serial.begin es el comando que indica que quieres ver la información de entradas en el puerto serial del arduino y (9600) es la velocidad de transmisión de datos del arduino a la PC. Yo lo utilice para poder ver que valor me arrojan los sensores cuando estan en color negro o en blanco

      Saludos

      Eliminar
  40. oyes miguel kiero aser ese carrito segidor de linea no me podrias mandar todo el crokis como va conectado al arduino uno espara presentarlo en un examen o mandame un link de descarga directa te lo agradeseria

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Este comentario ha sido eliminado por un administrador del blog.

      Eliminar
  41. DISCULPA MIGUEL, QUE USASTE PARA ALIMENTAR A LA ARDUINO???

    ResponderEliminar
    Respuestas
    1. El voltaje de la batería sirve para alimentar el arduino, recordemos que el arduino tiene su propio regulador de voltaje.

      Eliminar
  42. LA Neta Muy Chido00 Carnal Muy Poca Gente Se Ofrece A Dar Sus Trabajos....y oie una pregunta Que distancia dejaste del Piso0 A tu Sensores

    ResponderEliminar
    Respuestas
    1. Hola Eduardo.

      Los sensores fueron colocados a una distancia aproximadamente entre 5mm y 1cm del piso.

      Saludos

      Eliminar
  43. hola buenas tardes esta bueno el proyecto pero tengo una duda, en que pines del arduino van conectados los sensores y en cuales son las salidas gracias.

    ResponderEliminar
  44. Los sensores van conectados a las entradas analógicas A0...A4 y las salidas son las 6 y 9 para un motor y 10 y 11 para el otro por ser salidas con PWM en el programa en la parte de declaración de variables esta especificado.

    Saludos.

    ResponderEliminar
  45. Dónde puedo ver el desarrollo de tu proyecto paso a paso? Gracias y felicidades!

    ResponderEliminar
  46. El seguimiento del proyecto esta publicado en todo el blog con algunas mejoras. Ve a la pag principal del blog http://seguidorlineaarduino.blogspot.mx/ y dale clic en entradas antiguas

    Saludos

    ResponderEliminar
  47. No sabes programar!!!!

    ResponderEliminar
  48. hola que tal necesito tu ayuda porfabor estoy a 4 dias de presentar mi seguidor de linea tengo el arduino uno y un driver L292 y estoy utilizando sensores digitales porfabor como modificaria el programa para adaptarlo ami seguidor agradederia tu respuesta

    ResponderEliminar
  49. me parece muy bien pero me podrian pasar el diagrama de conexines.

    ResponderEliminar
  50. ya tengo todas mis conexiones pero cuando cargo el programa a mi arduino y lo echo andar solo detecta cosas blancas.. el programa que publicaste esta vien? gracias...

    ResponderEliminar
  51. disculpa tendrás algún correo o facebook esque tengo algunas dudas con la construcción de mi seguidor de líneas básicamente son detalles mínimos

    ResponderEliminar
  52. tengo una duda quiero hacer un seguidor de linea blanca entonces debo cambiar la if como quedaria la programacion? es que es la primera vez que uso arduino

    ResponderEliminar
  53. Hola Miguel, una pregunta, este código hace que sólo se mueva hacia adelante y haga los giros y disminuciones/aumentos de velocidad o también que retroceda?

    ResponderEliminar
  54. Disculpa amigo excelente aportacion si funciona pero que deberia cambiar o añadir en la programacion para que supere una pista con las lineas entrecortadas

    ResponderEliminar
  55. bueno gracias por este aporte,,,,yo tambien habia realizado casi el mismo tipo de programacion para el seguidor, pero es muy tedioso porque se tiene que declarar casi todas las obciones,,,,,, mi pregunta seria si alguien sabe como puedo utilizar un algoritmo para reducir la programacion

    ResponderEliminar
  56. hola buesnas tardes amigo disculpa la molestia pero quiero hacer una replica de tu proyecto solo que tengo una duda de las conecciones sobre el area electronica no se como conectarlo.
    porfabor me podias facilitar el diagrama de conecciones ??

    ResponderEliminar
  57. OYE DISCUPA Y COMO SE LE ARIA PARA UN PROGRAMA CON SOLO 2 SNY70

    ResponderEliminar
  58. disculpa cual seria el código correcto para que pase por lineas entrecortadas

    ResponderEliminar
  59. YO TENGO SENSORRES DIGITALES COMO PUEDO HACERLO

    :(

    ResponderEliminar