Función map para el control de un LED RGB

La funcion map() permite re-mapear valores de un rango de entrada, a valores de un rango de salida

En post pasados hablamos de las lecturas análogas y se mencionó que los valores esperados estarán entre 0 y 1023, que representan los 10 bits que maneja la función analogRead(). En muchos casos es necesario re escalar dichos valores a un rango con mayor utilidad, sea el control de temperatura de un sistema de domótica, la velocidad de un motor o en nuestro caso, la intensidad de un LED.

Esta experiencia tratara sobre el uso de la función map para el control de un led rgb con Arduino, usando analogWrite()  a partir de lecturas análogas de tres (3) potenciómetros.

El primer problema que encontraremos es que la función analogRead() maneja 10 bits (0 a 1023), mientras que la función analogWrite() maneja 8 bits (0 a 255).  Una opción para este problema es re-escalar los valores de lectura mediante el uso de una ecuación lineal, como lo hizo el compañero Edwin De Leon, en su post: “Ventilador con Encendido Automático Ajustable”. Este método puede volverse algo complicado cuando se deben trabajar con rangos distintos simultaneamente ya que se debe plantear una ecuación para cada rango.

Para esta experiencia utilizaremos:

  • Placa Arduino UNO (Rev3)
  • Breadboard o protoboard
  • 3 resistencias de 1 kΩ
  • 3 resistencias de 220 Ω
  • 3 potenciometros de cualquier valor
  • 1 led RGB

Para empezar veamos la función map(). La sintaxis de esta función es la siguiente :

map(X, inMin,inMax,outMin,outMax), siendo:

  • X: valor a re-mapear (re-escalar)
  • inMax: valor máximo del rango de entrada
  • inMin: valor mínimo del rango de entrada
  • outMax: valor máximo del rango de salida
  • outMin: valor mínimo del rango de salida

Esta función realiza la siguente operación matemática:

math

Para realizar una pequeña prueba para familiarizarnos con la función utilizaremos la siguiente configuración:

Untitled Sketch_bb
Configuración de Prueba

Cargamos el siguiente código en ArduinoIDE:

El código medirá el valor del potenciómetro y devolverá el valor re escalado usando la función map y la operación matemática mostrada anteriormente.

*Nota: Se utilizan variables long en la operación matemática ya que poseen una mayor capacidad de almacenamiento de números (32 bits), lo que las hace más aptas para cualquier proceso matemático.

 

Como habrán notado, los valores que devuelve la función map y la operación matemático son muy parecidos, solo variando en algunos valores intermedios mas no en los mínimos y máximos

El rango de salida debe ajustarse a su necesidad, en mi caso requería que el valores mínimos y máximos de lectura análoga se ajustaran a los valores mínimos y máximos de escritura análoga.

Ahora procederemos a controlar un LED RGB re-mapeando los valores de lectura de potenciómetros para ser usados en la función analogWrite() mediante PWM. Utilizaremos la siguiente configuración:

Configuración para RGB
Configuración para RGB

El código a utilizar es el siguiente:

Como vemos cada potenciómetro está ligado, a través de la función map, al control de cada uno de los ánodos correspondiente a los tres colores (rojo, verde y azul). Este código deberá realizar mediciones cada 0.5 segundos y actualizar el color del led dependiendo de los valores de lectura con analogRead().

A continuación un video donde se muestra el funcionamiento del codigo:

Nota: Al utilizar la modulación por ancho de pulso (PWM) se debe recordar utilizar los pines habilitados para dicha funcion que se distinguen por tener este simbolo: “~” .

Espero que la información suministrada sea de utilidad para todos.

Saludos.

¿Te gustó? ¡Comparte!Share on LinkedInShare on FacebookTweet about this on TwitterEmail this to someoneShare on RedditShare on TumblrShare on Google+Pin on PinterestBuffer this page