lunes, 30 de noviembre de 2009

Comparar dos sensores LDR con PIC 16F628A

Muy buenas a todos y todas!!!

Después de hacer algunas pruebas con el microcontrolador 16f628A y los LDR, he llegado a la conclusión de que la mejor manera de hacer una comparación entre dos LDR o al menos la que me ha funcionado a mi es la siguiente configuración con la que solo añadiendo unos condensadores cerámicos extra que hacen que señal no tenga tanto "ruido":

Eston condensadores son de tipo ceramico, los que tienen forma de lenteja, con un valor 0.1uF.


Programa PBP para comparar dos fotoresistencias LDR

Para probar este circuito con los sensores podemos hacer un programa en PBP con el que encender y apagar LED conectado en el Portb.0 con 2 sensores LDR conectados en los puertos Portb.1 y Portb.2.


La instrucción POT

Esta instrucción es específica del lenguaje PBP y se usa para leer valores analógicos de un pin del microcontrolador.

Una de las particularidades de POT es que solo necesita un pin digital para que funcione. No importa si es un pin de tipo analógico o no.


🔍 Desglose de la instrucción POT
POT ldr1, 255, b0
Parte Valor Explicación
Comando POT Instrucción de PIC Basic Pro para leer un valor analógico (potenciómetro, LDR, etc.).
Pin ldr1 Variable que define el pin RB1 del microcontrolador PIC. Es donde está conectado el sensor LDR.
Escala máxima 255 Valor máximo de la escala. El resultado estará entre 0 y 255 (8 bits). Es el valor máximo de un BYTE.
Destino b0 Variable BYTE donde se guarda el valor convertido. Puede ser de 0 (mínimo) a 255 (máximo).
💡 ¿Cómo funciona? El comando POT lee el voltaje analógico del pin ldr1, lo convierte a un número de 0 a 1023 (ADC de 10 bits) y luego lo reescala proporcionalmente al rango 0-255, guardándolo en b0.

Declaración de pines y variables:

  • Asignamos el pin RB0 para controlar un LED.
  • Asignamos los pines RB1 y RB2 para leer los dos sensores de luz (LDR).
  • Creamos tres variables (b0, b1, b2) para almacenar números.

Bucle principal Inicio:

  • Lee el valor del primer LDR y lo guarda en b0 (rango 0-255).
  • Lee el valor del segundo LDR y lo guarda en b1 (rango 0-255).

Primera comparación:

  • Si b0 es igual a b1 → el LED se enciende (ledon).
  • Si b0 es diferente a b1 → se va a la subrutina apaga.

Subrutina apaga:

Calcula la diferencia absoluta entre b0 y b1, guardándola en b2.

  • Si esa diferencia es mayor que 15 → apaga el LED (ledoff).
  • Si la diferencia es menor o igual a 15 → enciende el LED (ledon).

Subrutina ledon:

  • Pone el pin del LED a nivel ALTO (enciende el LED).
  • Vuelve al bucle principal para seguir leyendo los sensores.

Subrutina ledoff:

  • Pone el pin del LED a nivel BAJO (apaga el LED).
  • Vuelve al bucle principal para seguir leyendo los sensores.

Y ahora el programa completo en PBP:


led    var  Portb.0 ; // Llamamos led  al puerto B0
ldr1   var  Portb.1  ; // Llamamos ldr1 al puerto B1
ldr2   var  Portb.2  ; // Llamamos ldr2 al puerto B2
b0     var BYTE          
b1     var BYTE
b2     var BYTE

Inicio:

  POT ldr1, 255, b0            
  POT ldr2, 255, b1

  if b0 = b1 then ledon ; // Si b0 es = a b1 ir a ledon
  if b0 > b1 then apaga ; // Si b0 es mayor que b1 ir a apaga
  if b1 > b0 then apaga ; // Si b1 es mayor que b0 ir a apaga

ledon:                     
  high led ;Enciende el led
  goto inicio ; // Vuelve al inicio

apaga:
  if b0 > b1 then        ; Si b0 es mayor
    b2 = b0 - b1
  else                   ; Si b1 es mayor o igual
    b2 = b1 - b0
  endif

  if b2 > 15 then ledoff
  goto ledon

ledoff:
  low led ; // Apaga el puerto B2 (led apagado)
  goto inicio ; // Vuelve al inicio

end ; // Fin del programa

Bueno espero que a la gente como yo, un recién llegado a esto de los microcontroladores, esta información les pueda hacer un poco más sencilla la implementación de sensores LDR con los microcontroladores PIC!

Saludos a todos y todas!!!

Los siguientes enlaces sobre microcontroladores te pueden interesar:

No hay comentarios :