Professional Documents
Culture Documents
INTELIGENTE
Ignacio Olmedo
SEGUIDOR DE LUZ INTELIGENTE
Introducción:
Con el fin de incursionar en el mundo de los microcontrladores PIC, y mas
específicamente en el manejo de motores paso a paso, nos propusimos el
desafío de desarrollar un sistema que reuniera las herramientas del control de
giro por pasos mediante pulsos y las del manejo de señales analógicas.
De manera que así fuimos definiendo lo que sería un seguidor de luz
inteligente, es decir, un sistema compuesto básicamente por una LDR, un PIC
y el motor paso a paso de una impresora, que llevara a cabo la función de
sensar la cantidad de luz en un arco de giro, sobre un solo eje, y luego
“apuntar” o posicionarse hacia el punto de mayor luz sensada.
El sistema, así también, tiene la capacidad de establecer un lazo cerrado de
control, ya que después de posicionarse hacia el punto de mayor iluminación
estará chequeando que el valor de luz no cambie drásticamente, si lo hace,
inicia un nuevo sensado y nuevo posicionamiento.
Hardware:
La electrónica del circuito que gobierna el proceso está compuesto por:
- En primer lugar por el micro controlador de Microchip, el PIC16F873A.
- El 74LS245 que es un buffer octal del tipo tres estados de 8 bits, para
aislar el PIC de la carga que pueda representar las interfaces del motor y
de los LEDs de visualización.
- El ULN2003, (Arreglo de 7 Darlington integrados con diodos de
descarga) que es un driver para el manejo de motores paso a paso con
tensiones TTL, y hasta 50V de tensión de salida y 500mA.
Configuración de
los pines del
ULN2003
- LDR:
El sensado se realiza a partir de un LDR típica.
La variación de la tensión provocada por la
variación de la resistencia (LDR) en la rama
colocada a en la entrada analógica AN0 del PIC, es
transformada a valores digitales y va siendo
comparada con el valor anterior obtenido,
- Final de carrera:
Se le incorporó a la estructura del dispositivo un interruptor construido a mano
que consta de dos contactos metálicos que cumplirán el rol de interruptor final
de carrera, es utilizado para dar límite al giro en un sentido en el
posicionamiento del sensor.
Software:
Entonces, se determinó que lo que llevará a cabo el bloque del programa será:
- luego de posicionarse en el punto de inicio, esto con ayuda del final de
carrera.
- sensar la luz paso por paso, utilizando el ADRESH de la conversión.
- comparar el valor del sensado con el del paso anterior, guardando el mayor
valor, y el número de paso en el que se provocó el mayor valor.
- de manera que al finalizar el recorrido con todos los pasos y los censados
recurra al numero de paso guardado (en el que adquirió el mayor valor de luz)
para posicionarse allí.
- luego, con el dato del mayor valor guardado realizará una comparación,
chequeando continuamente que el valor actual no descienda de un umbral
constante establecido a partir del mayor valor posible, y estableciendo así un
control de lazo cerrado, con la posibilidad de definir la “sensibilidad” del sensor
por software.
- además, hubo que agregar bloques de programa que permitan disminuir el
error en el posicionamiento, es decir un bloque que se encargue de administrar
el energizado de las bobinas a partir del “reconocimiento de pasos” para que
no haya errores en le precisión por “saltos” indeseados.
list p=16f873A
#include <p16f873A.inc>
movlw b'00000000'
movwf medpas
movlw b'00000000'
movwf cambio
movlw b'00000000'
movwf conscan
movlw b'00000000'
movwf indec
call inpto
call ptoinicio
call retardo
call escaneo
call guardo
;call ptoinicio
call retardo
call posfinal
call test
;--------------------------------------------------------------------------------------------------------------
--------------------
inpto
bcf STATUS,RP1
bsf STATUS,RP0
clrf TRISA
bsf TRISA,0
clrf TRISB
clrf TRISC
bsf TRISC,3
movlw b'00001110'
movwf ADCON1
bcf STATUS,RP0
movlw b'01000001'
movwf ADCON0
return
;--------------------------------------------------------------------------------------------------------------
--------------
ptoinicio clrf conscan
clrf posision
bsf PORTC,5
clrw
movwf PORTB
btfss PORTC,3
return
clrw
movwf PORTB
movlw b'00010000'
movwf PORTB
movlw b'00010000'
movwf ultimini
call retardo
clrw
movwf PORTB
btfss PORTC,3
return
movlw b'00100000'
movwf PORTB
movlw b'00100000'
movwf ultimini
call retardo
clrw
movwf PORTB
btfss PORTC,3
return
movlw b'01000000'
movwf PORTB
movlw b'01000000'
movwf ultimini
call retardo
clrw
movwf PORTB
btfss PORTC,3
return
movlw b'10000000'
movwf PORTB
movlw b'10000000'
movwf ultimini
call retardo
clrw
movwf PORTB
btfss PORTC,3
return
goto ptoinicio
;--------------------------------------------------------------------------------------------------------------
--------------------
escaneo
call CONVERCION
bcf PORTC,5
bsf PORTC,6
movlw b'11111111';para que el siguiente paso
sea desde 0
movwf posision
loop clrw
movwf PORTB
clrc
btfsc ultimini,4
goto jump
movf ultimini,0
movwf PORTB
call CONVERCION
clrw
movwf PORTB
call Medpaso
movf medpas,0
movwf PORTB
call CONVERCION
incf conscan,1
movf conscan,0
Sublw .32
btfsc STATUS,CARRY
goto loop
return
btfsc ultimini,6
goto medpaso2
btfsc ultimini,5
goto medpaso3
btfsc ultimini,4
goto medpaso4
movwf medpas
return
jump clrc
rrf ultimini,1
clrc
rrf ultimini,1
clrc
rrf ultimini,1
clrc
rrf ultimini,1
clrc
rrf ultimini,1
goto deljump
;--------------------------------------------------------------------------------------------------------------
-------------------
guardo
movf posisionm,w
movwf indec
return
;--------------------------------------------------------------------------------------------------------------
--------------------
posfinal
movf ultimini,0
movwf paraposfi
movf indec,0
sublw 0x40; son 64 los pasos para el semiciclo completo
movwf reg
delmedio
btfsc paraposfi,7
goto jump2
movf paraposfi,0
movwf PORTB
call retardo
decfszreg,1
;incfszindec,1
goto Medpaso2
return
Medpaso2
btfsc paraposfi,7
goto medpaso42
btfsc paraposfi,6
goto medpaso12
btfsc paraposfi,5
goto medpaso22
btfsc paraposfi,4
goto medpaso32
goto delmedio
medpaso12
movlw b'11000000' ;192
movwf PORTB
call retardo
decfszreg,1
;incfszindec,1
goto delmedio
return
call retardo
decfszreg,1
;incfszindec,1
goto delmedio
return
call retardo
decfszreg,1
; incfsz indec,1
goto delmedio
return
jump2
rlf paraposfi,1
rlf paraposfi,1
rlf paraposfi,1
rlf paraposfi,1
rlf paraposfi,1
goto deljump2
;--------------------------------------------------------------------------------------------------------------
--------------------
CONVERCION incf posision,1
call retardo
call retardo
bsf ADCON0,adgo
espera btfsc ADCON0,adgo
goto espera
movf ADRESH,W
movwf actual
subwf mayor,0 ; mayor-actual
btfss STATUS,CARRY
call gmyp0
clrc
return
;--------------------------------------------------------------------------------------------------------------
--------------------
gmyp0 movf posision,w
movwf posisionm
movf actual,0
movwf mayor
return
;--------------------------------------------------------------------------------------------------------------
--------------------
sinsalto
;--------------------------------------------------------------------------------------------------------------
--------------------
retardo movlw b'01000001'
movwf datoB
delay2 movlw b'11111111'
movwf datoA
delay1 decfszdatoA,1
goto delay1
decfszdatoB,1
goto delay2
return
;--------------------------------------------------------------------------------------------------------------
--------------------
retardo2 movlw b'11111111'
movwf datoB
delay22 movlw b'11111111'
movwf datoA
delay12 decfszdatoA,1
goto delay12
decfszdatoB,1
goto delay22
return
;--------------------------------------------------------------------------------------------------------------
--------------------
test bcf PORTC,6
bsf PORTC,7
movlw b'00000000'
movwf indec
movlw b'00000000'
movwf cambio
movlw b'00000000'
movwf PORTB
call retardo2
clrf posisionm
bsf ADCON0,adgo
espera1 btfsc ADCON0,adgo
goto espera1
movf ADRESH,w
movwf cambio
bcf PORTC,7
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1
incf cambio,1; incremento 30 unidades para una
sensibilidad de 0.3V
movf mayor,w
subwf cambio,0 ; cambio-mayor
btfss STATUS,CARRY;
goto reset
goto test
end
;si el valor nuevo de la
conversión
; es menor que el 10%-
;del ultimo mayor valor
reinicia
; y escanea
Conclusión:
Finalmente, el dispositivo fue ensayado probando seguir la luz de una luminaria
tipo velador con una lámpara incandescente de 75W, pero estamos firmemente
convencidos, de que puede seguir fielmente cualquier fuente de luz, incluso la
solar. Y aunque no se trate de fuentes puntuales de luz, al ser un sistema
inteligente, buscará la posición donde “capte” mayor iluminancia.
También se puede notar el hecho de que al disponer de un sistema de control
automático, el aparato sabrá sortear los errores por saltos y vibraciones,