jueves, 10 de marzo de 2011

Robot seguidor de líneas con PIC 16F628A y sensores CNY70

Muy buenas a todos y todas!!!

Esto es lo ultimo que me ha dado por hacer, un coche seguidor de linea.
Es decir un coche al que le pones una linea negra sobre un fondo blanco y va siguiendo la linea.

La verdad es algo sencillo de hacer y algo más complicado si lo quieres hacer bien, me explico:

Empezando por la base, no es una muy buena base para este tipo de practica, es algo más difícil de controlar.
La base ideal del proyecto serian dos ruedas, cada una con un motor y una rueda loca como rueda de apoyo.


🛠️ Componentes necesarios
PIC16F628A-I/P
PIC16F628A-I/P PIC16F628A-I/P .
Sensor fotoeléctrico CNY70
CNY70 Sensor fotoeléctrico CNY70.
Cables Dupont hembra hembra
Cables Dupont h/h Kit de 40pin 10cm 2,54mm 1pin hembra a hembra .

¿Cómo funciona el sensor CNY70 y para qué sirve?

El principio de funcionamiento del CNY70 es sencillo pero muy efectivo. Podemos imaginarlo como un dispositivo que "pregunta" y "escucha" usando luz invisible:

  • Emite:
    Un diodo LED en su interior emite un haz de luz infrarroja (con una longitud de onda de 950 nm, que no podemos ver)
  • Refleja:
    Esta luz viaja hacia el exterior. Cuando se encuentra con una superficie cercana, una parte de esa luz rebota o se refleja
  • Recibe:
    La luz reflejada es captada por un fototransistor que está dentro del mismo encapsulado, justo al lado del emisor

La cantidad de luz que recibe determina la corriente o voltaje de salida del sensor

Por este motivo, el CNY70 puede distinguir entre colores o superficies: las superficies claras reflejan más luz infrarroja que las oscuras.
Esta característica, junto con su reducido rango de detección óptimo (de 0 a 5 mm) , lo convierte en el sensor ideal para un sinfín de aplicaciones.



Esta es la parte inferior donde están puestos los tres CNY70. Esta fué la primera prueba que hice poniéndolos a mucha distancia y montándolos un poco de "aquella manera" sobre el mismo chasis del vehículo...

No funciono... bueno lo que es el circuito si funcionaba bien el problema era que al estar fijos no podía regular los sensores y hacia lo que quería.



Aquí ya están mejor, la colocación de los sensores es MUY IMPORTANTE, hay que alinearlo bien sobre todo en altura, si no no detectara la linea.

Hay por ahí algún esquema donde ponen los sensores CNY70 con unos potenciómetros, no los he llegado ha probar, pero supongo que con esto podremos hacer un reglaje más "fino".

Si podemos quitarle vibraciones mejor también.



Esta es la parte inferior, donde se ven los sensores CNY70, como se ve están encendidos.
Por el tipo de luz infraroja solo pueden verse con el móvil y no se si con las cámaras de fotos también pasara (Esto también es útil para saber si el mando de la tele tiene pilas jejeje)

La idea ya la tenia en mente desde hacía un tiempo y tenía ganas de comprobar como funcionan este tipo de vehículos.
Parte de la información la he sacado de la web de Glafebre que hizo el Hyperion donde tendréis más información y el programa original, el mio tiene algunas variaciones, pero fue el que me inspiro.

Código en PBP:


@ DEVICE PIC16F628A, WDT_OFF ' Watchdog Timer desconectado
@ DEVICE PIC16F628A, PWRT_OFF ' Power-On Timer conectado
@ DEVICE PIC16F628A, BOD_OFF ' Brown-Out Detect conectado
@ DEVICE PIC16F628A, MCLR_OFF ' Master Clear Externo desconectado
@ DEVICE PIC16F628A, LVP_OFF ' Low-Voltage Programming desconectado
@ DEVICE PIC16F628A, CPD_OFF ' Data Memory Code Protect desconectado


DEFINE OSC 4

'-----CONFIGURACION DE LOS PUERTOS--------
PORTB=%11110000
TRISB=%11110000

'------------PROGRAMA PRINCIPAL------------
pause 3000
loop:

  IF (PORTB.5=0) AND (portb.6=1) AND (portb.7=1) THEN GOSUB AVANCE

  IF (PORTB.7=0) AND (portb.5=1) AND (portb.6=1) THEN GOSUB IZQUIERDA

  IF (PORTB.6=0) AND (portb.5=1) AND (portb.7=1) THEN GOSUB DERECHA

  IF (PORTB.5=0) AND (portb.6=0) AND (portb.7=0) THEN GOSUB PARO

  IF (PORTB.5=1) AND (portb.6=1) AND (portb.7=1) THEN GOSUB PARO

  GOTO loop

END

'--------------SUBRRUTINAS-----------------

AVANCE:

  PORTB.0 = 1
  PORTB.1 = 0
  PORTB.2 = 0
  PORTB.3 = 0

  return

ATRAS:
  PORTB.0 = 0 
  PORTB.1 = 0 
  PORTB.2 = 0
  PORTB.3 = 0

  RETURN

DERECHA:
  PORTB.0 = 1
  PORTB.1 = 0
  PORTB.2 = 1 
  PORTB.3 = 0

  RETURN

IZQUIERDA:

  PORTB.0 = 1
  PORTB.1 = 0
  PORTB.2 = 0: 
  PORTB.3 = 1

  RETURN

PARO:

  PORTB.0 = 0 
  PORTB.1 = 0
  PORTB.2 = 0
  PORTB.3 = 0

  RETURN

Este código solo tiene en cuenta 3 sensores, pero añadiendo más tendremos más precisión.
De igual manera si usamos PWM para controlar el motores de velocidad y un servo para la dirección tendremos más suabidad en los movimientos.

Este es el resultado, como se puede comprobar los movimientos son bastante bruscos



Otros enlaces sobre información o proyectos con microcontroladores PIC:


Saludos!!

4 comentarios :

patricko dijo...

en que software simulaste tu codigo?? y eso de las subrutinas que? va dentro del codigo o en una ventana aparte??? muy buen aporte =)

Peyutron dijo...

Hola Patriko, las subrutinas van en el mismo programa. Este programa no lo he llegado a simular porque cuando lo hice creo que aun no conocía Proteus. Si copias el texto en Microcode Studio, veras que " '---SUBRUTINAS---" lo colorea en color azul, y eso quiere decir que es un comentario, es decir una aclaración que hace el autor para que el código se pueda entender mucho mejor, sobre todo en programas largos. Normalmente empiezan con " ' " o con " ; ". Todo lo que escribas delante de esos caracteres es un comentario y cuando se compila el archivo no queda incluido en el HEX. Espero que haya resuelto tu duda. Si tienes más, aquí estamos!!

stalin z dijo...

voy a probar tu código te informare como va , muy buen aporte

Wilmer dijo...

Que mas amigo disculpa el diagrama electrico ??