Páginas

miércoles, 19 de marzo de 2014

Leyendo Entradas Digitales con las Raspberry. Calibrado de Temporizador para Insoladora

Durante todo estos últimos días me he dedicado a realizar una insoladora. Sí, una insoladora. ¿Y para qué quiero yo una insoladora? Pues muy sencillo. He desarrollado una tarjeta de expansión con Kicad y quería fabricarme una tarjeta con el diseño implementado. Empecé con el método de la transferencia térmica desde papel a placa de cobre, utilizando papel de todo tipo e impresoras láser y también de inyección de tinta...y no lo conseguí. Utilicé, para diseños muy sencillos, rotuladores indelebles (me compré una colección de marcas y tipos) consiguiendo unos resultados más que aceptables: 1) un circuito impreso temporizador para la insoladora; y 2) un circuito impreso para un array de leds ultravioletas, también para la insoladora. Prometo escribir sobre la fabricación de una insoladora más adelante. Pongo un anticipo de lo que he llegado a realizar, con la fotografía del artefacto funcionando:
En la imagen, con el array de Leds UV activo, podemos ver la disposición hexagonal de los leds (60) en primer plano y, detrás, el temporizador, pudiendo observar los dos condensadores (izda), el circuito integrado 555 (centro) y el relé (dcha) que conecta la tensión de 12Vcc.
Pero con un rotulador indeleble no puedes ambicionar fabricarte circuitos impresos de precisión y con acabado profesional. A lo mucho que puedes aspirar es a diseñar unas placas como las que hice para la insoladora en donde los componentes están suficientemente espaciados y las pistas pueden ser de un grosor aceptable y espaciadas suficientemente.
El temporizador lo he diseñado con dos escalas de tiempo y con ciertas posibilidades de calibración. Las dos escalas de tiempo permitían unos rangos de temporización teóricos de a) 1 a 5 minutos y de b) 2 a 20 minutos, más o menos. Pero ¿cómo podía saber con exactitud los rangos reales y calibrarlos a valores próximos a los teóricos? Pues, muy sencillo: utilizando las posibilidades de la Raspberry, que me permite leer el estado de unas entradas digitales, la de ciertos pines del conector de expansión de 2x13 pines. Y eso es lo que hice.

Consideraciones

El array de leds está alimentado a 12Vcc, voltaje que es proporcionado por el cierre de una salida del relé del temporizador. Teniendo en cuenta esto, haremos un montaje teórico con Fritzing, sustituyendo la salida del relé por un pulsador. En el montaje real, utilizaremos la salida del relé.

Descripción del circuito

Vamos a utilizar dos pines del Raspberry:
- el pin 18 (GPIO24) como entrada.
- el pin 22 (GPIO25) como salida.
La tensión que le llega a la entrada GPIO24 la vamos a reducir mediante un divisor de tensión. Hemos de tener en cuenta que lo que queremos comprobar es la presencia, o no, de una tensión de 12Vcc, y los pines del conector del Raspberry trabajan a 3,3Vcc. No es conveniente, por tanto, que superemos esta tensión. Por tanto, el divisor de tensión estará formado por dos resistencias en serie. Por un extremo conectaremos 12Vcc (el pulsador), el otro extremos lo pondremos a tierra; y el punto de unión de las dos resistencias será la que conectaremos al pin 18 (GPIO24) de la Raspberry.
      +12Vcc <=====> 10k ohms <=== pin 18 RaspPi ===>; 2k2 ohms <=====> GND
Además, también mostraremos la presencia de los 12Vcc encendiendo un led serializado con una resistencia de 1k ohms. Los cálculos se han hecho teniendo en cuenta que la tensión de caída a través del led es de 2Vcc, y que la máxima corriente a través del Led es de 20mA. Por tanto: (12Vcc-2Vcc)/20mA = 500 ohms, pero pongo una de 1k ohms al no tener ni los 500 ohms que me resulta en el cálculo ni el valor comercial de 560 ohms. He puesto la más próxima que tenía con un valor por encima de los 560. No puedo poner un valor menor, pues superaríamos los 20mA máximos que admite el diodo y nos lo fundiríamos.
¡¡¡¡ATENCIÓN!!! A la hora de montar el divisor de tensión habrá que extremar las precauciones. Yo me he cargado una entrada del Raspberry Pi.  Afortunadamente cuento con otras para probar el montaje.
Hasta aquí el diseño de entrada. Vamos a repetir la entrada del pin 18 replicando su valor en la salida del pin 22, también mediante un Led, serializado con una resistencia, que irá replicando el estado del otro Led, como resultado de la lectura que se haga con un programa. El cálculo de la resistencia a serializar es similar a los cálculos anteriores, cambiando la tensión que actuará sobre el Led+resistencia: (3,3Vcc-2Vcc)/20mA = 65 ohms, valor no comercial, pero pondremos el valor superior más próximo a este valor, resultando ser 75 ohms. En el esquema teórico aparece 220 ohms que también es válido, aunque el Led lucirá menos, pero se encenderá.

Programa de comprobación

Podemos hacer una comprobación del funcionamiento de los dos pines mediante la utilidad gpio. En Controlando un relé con una salida del conector GPIO del Raspberry Pi se muestra el modo de instalar esta utilidad, utilidad que viene incluida en la libreria WiringPi.
Lo primero que haremos será definir los dos pines, por lo que ejecutaremos:
gpio -g mode 25 out
gpio -g mode 24 in
Seguidamente, activaremos el Led de salida, y lo apagaremos, mediante las siguientes órdenes:
gpio -g write 25 1
gpio -g write 25 0
Podemos observar que estamos utilizando, en lugar del número físico del pin, el número lógico de la etiqueta GPIO. Podemos hacerlo así a lutilizar el parámetro -g. Si no queremos utilizar este parámetro, podemos hacer lo mismo ejecutando lo siguiente:
gpio mode 22 out
gpio mode 18 in
gpio write 22 1
gpio write 22 0
Y para la señal de entrada podemos invocar gpio con los parámetros oportunos:
gpio -g read 24
gpio read 18
Una vez que hemos comprobado el correcto funcionamiento del pin de entrada y del de salida, vamos a calcular los tiempos de funcionamiento del temporizador que controlará el encendido de los Leds UV de la insoladora. El programa nos va a permitir mostrar el tiempo en que está activo el relé de salida del temporizador, y por tanto el Led indicador encendido, lo hemos realizado en python.
from datetime import datetime
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(18, GPIO.IN)
GPIO.setup(22, GPIO.OUT)

state = 0
st = datetime.now()
while True:

 # state toggle button is pressed
        if ( GPIO.input(18) == True ):
  if (state == 0):
   st = datetime.now()
   state = 1
   GPIO.output(22, GPIO.HIGH)
   print "START: ", st.strftime("%H:%M:%S")
 if ( GPIO.input(18) == False):
  if (state == 1):
   state = 0
   GPIO.output(22, GPIO.LOW)
   st2 = datetime.now()
   print "STOP:  ",st2.strftime("%H:%M:%S"), (st2-st)
Lo que hace el programa es, en primer lugar, configurar los dos pines utilizados para seguidamente entrar en un bucle sin fin, en donde comprueba los cambios de estado del pin de entrada, replicándolos en el pin de salida. Si el estado pasa a '1', se muestra y se guarda la hora de inicio. Cuando el estado pasa a '0', se muestra la hora de finalización y el tiempo que ha transcurrido desde que se inició el temporizador.
En la siguiente imagen podemos observar el programa funcionando, mostrando los tiempos de inicio y final del temporizador, en las dos escalas implementadas.
Con este programa podemos ir ajustando un potenciómetro interior, y así ir calibrando el tiempo mínimo de una de las escalas con las que cuenta el temporizador. Para ajustar exactamente los tiempos de las dos escalas, mínimo y máximo, tendría que modificar el diseño e incluir más potenciómetros. Pero así me es suficiente para insolar una placa fotosensible, ya que estamos hablando de tiempos de insolación de alrededor de 3 minutos, valor que está dentro del rango de la escala pequeña.
 En la siguiente imagen podemos ver el montaje funcionando.
Y eso es todo. Como ya he dicho, en cuanto pueda publicaré un par de artículos sobre la insoladora y sobre el temporizador, incluyendo los resultados de las pruebas realizadas.

Enlaces

- WiringPi
- raspberry-gpio-python
- Librería RPi.GPIO 0.5.4
- LED calculator for single LEDs
- timertest.py
- Controlando un relé con una salida del conector GPIO del Raspberry Pi