Encender LED con un pulsador en Arduino

Encender un LED con un pulsador puede parecer una tarea trivial, y de hecho lo es, pero para algunas aplicaciones específicas, puede tomar un poco más de trabajo de lo que se pensaría al principio. Aquí se expone un ejemplo en donde se desea encender un LED a diferentes intensidades usando un sólo pulsador.

Descripción del problema:

Encender un LED a 4 niveles diferentes de intensidad: 25%, 50%, 75% y 100% usando un sólo pulsador de manera que al oprimirlo cada vez, pase al siguiente nivel. Después de llegar al nivel 100%, el LED debe apagarse si se oprime el pulsado una vez más. Además, si el pulsador se deja oprimido durante 2[s], el LED encenderá al 100% hasta que deje de oprimirse.

Solución:
Vamos primero al hardware. Se necesita un LED convencional, un pulsador, y una resistencia de 10[kOhm]. Es importante tener en cuenta que el pulsador se puede conectar a uno de los puertos del  microcontrolador usando dos configuraciones diferentes: Pull-up y Pull-down.

Figura tomada de http://www.zonamaker.com/
http://www.zonamaker.com/electronica/intro-electronica/teoria/resistencias-de-pull-up-y-pull-down

La diferencia está en el valor que tomará la entrada cuando el pulsador esté presionado. En la configuración pull-up, cuando el pulsador no se presiona, la entrada del microcontrolador tomará un "bajo", y cuando esté sin presionar tomará un valor "alto", en cambio en la configuración pull-down la entrada tomará un valor "alto" cuando se presiona y un valor "bajo" cuando no se presiona. Si en cada una de las dos configuraciones se omite la resistencia, entre la fuente de tensión de 5[v] y la entrada del microcontrolador, puede pasar una corriente lo suficientemente grande como para calentar algunos componentes, o en el peor de los escenarios, dañarlos. El criterio de escoger qué valor de resistencia usar no se ocupará acá, pero se recomienda al lector que lo haga en otras fuentes. 

Dependiendo de la aplicación, se puede escoger una o la otra, para este caso se tomará la configuración pull-down, de manera que el montaje queda como sigue.



Al analizar el probelma, se observa que si el LED debe pasar por cuatro niveles de intensidad, o estados, debe estar conectado a un puerto del micro que pueda otorgar diferentes estados aparte de "bajo" y "alto". En Arduino están marcadas sobre la placa las entradas que permiten esto, con el símbolo "~". Más precisamente estos puertos permiten la salida de 256 estados o niveles de tensión diferentes (desde 0 a 255). Realmente arroja una señal del pulsos que permite 256 variaciones de su ciclo útil (PWM). Es así como se conecta el LED al puerto D11.

El pulsador sólo puede estar en dos estados: presionado o sin presionar, "alto" o "bajo" según la configuración pull-down. Así que este irá conectado al puerto D3. También puede estar conectado a cualquier otro sin importar que esté marcado con "~".

El LED

Comúnmente no se hace una inspección minuciosa de los LED's cuando se montan en aplicaciones homemade, pero para este caso se entrará un poco más en detalles respecto a las características de este componente.

Para comenzar, se debe tener en cuenta la tensión y la corriente que consume en condiciones típicas, además un LED es también un diodo (como su nombre lo indica) y por esta razón, tiene una tensión umbral a partir de la cual empieza a conducir, es decir que al aplicarle una tensión menor a la umbral no provocará que el LED encienda. ¿Cómo saber cuál es la tensión umbral y el resto de características del LED que se está usando? La respuesta es: Observar el datasheet del componente.

Al realizar una aplicación profesional, es importante saber de qué fabricante es el componente, ya que cada fabricante produce sus dispositivos con características diferentes, aunque al tratarse de LED's, estas son similares. En este caso no se sabe de qué fabricante es el LED que se usará, así que se recurre a un datasheet de cualquier otro ya que como se mencionó antes, sus características deberían ser similares. Sin emabrgo, estos datos ya se encuentran fácilmente en la web.
Esta imagen fue tomada de:
http://electronics.stackexchange.com/questions/115229/i-used-led-calculator-and-it-gave-me-a-different-solutions-in-one-of-the-soluti


 La tensión umbral estaría en unos 1.5[v] aproximadamente. Los LED presentan tensiones umbral diferentes de acuerdo a los materiales con los que se han fabricado, usualmente el color del LED está asociado a estos materiales. No se profundizará mucho sobre estas características, así que sólo vale mencionar que lo ideal es que se respeten los rangos de funcionamiento de los componentes.

Evidentemente la curva no es lineal y es importante considerarlo a la hora de programar el microcontrolador  si se desea obtener las intensidades esperadas. Aun así, para efectos del experimento, se lleva el LED al límite aplicando como máximo una tensión de 5[v] (Se reitera que no es recomendable sobre exigir a los componentes).

Ahora sí, el código!

Para obtener diferentes intensidades, se crea un vector llamado power, que almacena 5 valores correspondientes a las intensidades:

power[] = {0, 4, 20, 80, 255};

¿Por qué estos valores? A prueba y error son valores que producen tensiones a la salida, que a su vez producen intensidades que se diferencian unas de otras. Cabe resalta que es importante inspeccionar si el rango 0-255 presenta una relación lineal con respecto al rango 0[v]-5[v], se supondría que sí, entonces se pueden calcular las tensiones correspondientes a  esos valores discretos. Con esos valores, el LED enciende (menos el 0 obviamente), entonces no tiene sentido según los datos que están en la gráfica. Es decir, 4  correspondería a una tensión de 0.078[v], así que ¿Qué sucede allí?, por qué el LED enciende con una tensión muy inferior a su umbral? ¿Podría ser que este LED de 3mm tenga características diferentes? Bueno, hay que averiguarlo :D