Arduino.cl – Compra tu Arduino en Línea

Escalamiento y función map

Cuando tenemos una lectura analógica raramente la utilizamos entre los valores digitalizados de 0 a 1023, equivalentes de 0 a 5 v analógicos. Este valor siempre es el rango de valores del conversor analógico digital, que desde ahora llamaremos ADC. Este caso es exclusivo para tarjetas con un ADC de 10 bit, ya que las combinaciones posibles entre 0 y 1 para la digitalización serán de  (1024 valores).  Mas técnicamente podríamos decir que el valor de 0 volt corresponde en forma digital a B0000000000 y el valor de 5 volt en forma digital a B1111111111, donde B especifica que el número es binario, de base 2 (1 y 0). Al número de bit del ADC también se le llama resolución, a mayor resolución menor es el valor analógico por cada valor digitalizado aumentando la cantidad disponible en el rango de valores. Por ejemplo, el Arduino Uno tiene un valor de  para cada bit, por ello tendrá 4,883x  mV por valor digital, sin embargo, Arduino Due tiene un ADC de 12 bit, entonces para la digitalización será  (4096 valores), por ello tendrá un valor de  por valor digital, eso es 1,22x  mV por valor digital, una resolución mucho mayor.

Recordemos que nuestra tarjeta favorita tiene 6 entradas analógicas, en el extremo opuesto de las digitales. 6 entradas que van de A0 hasta A5. En ellas entra un valor de entre 0 y 5 volt y se digitaliza de 0 a 1023 de acuerdo al ADC del Arduino Uno

Ahora bien. Que utilidad tiene saber todo esto. Haremos un experimento sencillo y después lo aplicaremos a un enfoque real. Además, vincularemos áreas de electrónica y matemáticas para aumentar la funcionalidad de los sistemas tecnológicos.

Tomaremos el valor de un potenciómetro directo de la lectura analógica y lo convertiremos al valor de voltaje que representa, pero antes debemos determinar la fórmula que aplicará nuestra tarjeta para determinar el valor del voltaje, para ello asumiremos que el comportamiento será lineal y proporcional, así que ocuparemos la archiconocida ecuación de la línea recta. Conocemos los extremos, tanto del conversor ADC como del valor de voltaje por ello podemos calcular la pendiente. Recordemos que esta ecuación es del tipo Y = mX + C, donde .

Reemplacemos con valores, C para este caso será 0, ya que la recta parte del origen. La pendiente será  = 0.004887 mV. Este valor es prácticamente el mismo antes mencionado, a diferencia de que consideramos el cero como un valor más, por esto se usaron 1024 valores. Entonces la ecuación seria Y = 0,004887*(valor digital). Haremos 8 divisiones para obtener valores representativos y los graficaremos.

La tabla de valores y el grafico lo pueden ver a continuación.

Este es el mismo sistema utilizado para determinar el valor de un sensor a partir de los valores digitales y se llama Escalamiento. Es aquí donde se buscan los sensores más lineales posibles para poder cumplir con la precisión en la conversión de los valores, esta linealidad permite la utilización adecuada y fidedigna de la ecuación de la línea recta

int pot;                                                //etiqueta para lectura analógica

float y;                                                 //etiqueta para formula con decimales

 

void setup() {

Serial.begin(9600);                         //iniciación de comunicación serial a 9600 baudios

}

void loop() {

pot=analogRead(A0);                   //lectura analógica

y=0.004883*pot;                             //formula calculada, ecuación de la línea recta

Serial.print(pot);                              //primera variable a mostrar

Serial.print(“\t”);                            //genera un tab, con el separamos la impresión

Serial.println(y);                               //segunda variable a mostrar y nueva línea

delay(250);                                        //delay para evitar lecturas erróneas

}

Siempre se buscará trabajar con sistema lineales dada su simpleza y su mejor aproximación a los valores reales, de hecho, cuando algún proceso es no lineal, se aplican procedimientos de linealización que no trataremos en esta sección, ya que utilizan herramientas de cálculo más avanzado, como son series.

 

Dentro de las funciones que incorpora Arduino, existe una función que, en el fondo, hace el escalamiento de manera instantánea, y esta es la función MAP. La sintaxis es:

map(valor, mínimo original, máximo original, mínimo a escalar, máximo a escalar)

Apliquémosla al ejemplo anterior

int pot;                                                //etiqueta para lectura analógica

float y;                                                 //etiqueta para formula con decimales

 

void setup() {

Serial.begin(9600);                         //iniciación de comunicación serial a 9600 baudios

}

void loop() {

pot=analogRead(A0);                   //lectura analógica

y=map(pot,0,1023,0,500);           //función map para escalamiento

y=y/100;                            //arreglo para generar decimales

Serial.print(pot);                             //primera variable a mostrar

Serial.print(“\t”);                            //genera un tab, con el separamos el print

Serial.println(y);                              //segunda variable a mostrar y nueva línea

delay(250);                                        //delay para evitar lecturas erróneas

}

La función map siempre devuelve un entero (sin decimales), por ello se escala a un valor amplificado, ya que, al dividir luego por el mismo valor de amplificación, 100 y al ser la variable (y en este caso) de tipo flotante generara los decimales igual que el caso anterior, de hecho, pueden contrastar los valores y son exactamente los mismo, solo que en este caso no debimos calcular la ecuación que represente mejor el comportamiento del sistema.

Un pequeño truco cuando se emplea esta función para escalar números decimales y no perderlos, ya que como se mencionó la función map devolverá enteros, es convertirlos a números más grandes. Se transforman los decimales a enteros multiplicando por 100 (xx,xx a xxxx), se aplica la función map con estos valores grandes y después se dividen nuevamente por 100 (yyyy a yy,yy) para obtener los decimales otra vez.

Usaremos un modulo para medir la presencia de luz, una fotocelda que incorpora un LDR y lo conectaremos directamente a nuestro Arduino a la lectura analógica. El modulo tiene una salida de 0 a 5 volt, por lo tanto, será leído entre valores 0 a 1023. El modulo tiene un comportamiento lineal por ende podemos utilizar la misma metodología de antes.

El módulo es un arreglo que funciona de la misma forma que un divisor de tensión, con ello el conexionado será de la forma:

En el programa haremos una lectura analógica y aplicaremos la ecuación de la línea recta para determinar cualquier valor del porcentaje de luz respecto al valor digital donde 

float luz;                                                             //declaración de tipo de dato y variable

void setup() {

  Serial.begin(9600);                                       //inicio de comunicación serial

}

void loop() {

 luz = analogRead(A0);                                 //lectura analógica

 luz = ((luz*100)/1023);                                //y = x*(100/1023)

Serial.println(luz);                                          //visualización en monitor serial

 delay(250);                                                       //delay para evitar ruido excesivo

}

Los valores obtenidos y mostrados en el monitor serial son:

El programa utilizando con la función map y el “truco” para mantener los decimales es el siguiente

float luz;                                                             //declaración de tipo de dato y variable

void setup() {

  Serial.begin(9600);                                       //inicio de comunicación serial

}

void loop() {

 luz = analogRead(A0);                                 //lectura analógica

luz = map(luz,0,1023,0,10000);                  //amplificación por 100 para mantener decimales

 luz= luz/100;                                                    //división para valores de trabajo

 Serial.println(luz);                                         //ultima variable a graficar

 delay(250);                                                       //delay para evitar ruido excesivo

}

Podrán comprobar que los valores son básicamente los mismos y ver así que la función map es un grupo de funciones que permiten calcular valores mediante el uso de la ecuación de la línea recta, óptima para sistemas lineales.

Este procedimiento es el mismo que se utiliza en otros sistemas que ocupan otros estándares de comunicación como el famoso 4-20 mA o 0-10v, o valores digitalizados para rangos de temperatura, presión, nivel, o cualquier variable deseada, utilizado por controladores como PLC, los cuales utilizan un bloque que funciona de la misma forma que nuestra funcion map.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Te informaremos cuando el producto esté en stock nuevamente. Por favor, deje su dirección de correo electrónico válida.

No fields found, please go to settings & save/reset fields