¿Qué es la función map?
En la referencia encontramos la siguiente definición
re-mapea un numero desde un rango a otro, esto es, un valor de fromLow se asignaría a un valor toLow, un valor fromHigh a toHigh, valores intermedio a valores intermedios, etc.
Es una traducción, al estilo de google asi que resulta incomprensible. map sirve para "mapear" un valor que va dentro de un rango, a otro valor que está en otro rango, siempre y cuando el rango sea lineal.
Por ejemplo, es un caso real expuesto en el foro de un transductor de presión cuya salida es un voltaje donde 0.5 voltios que corresponde a una presión de 0 bares y 4.5 voltios a 12 bares.
Asi realizando la operación
presion=map(tension, 0.5, 4.5, 0, 12)
Obtendriamos la presión que le corresponde a un valor de tensión determinado.
El ejemplo anterior no es exactamente funcional, pero lo explicaré mas tarde.
¿Qué hace la función map?
map se define como:
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Y obviamente, mirandolo asi, no se sabe ni lo que es. Vamos a empezar a recordar un poco de la escuela.
Casi todos deberiamos saber que una recta se define por dos puntos y sus coordenadas. Para un punto determinado tendremos coordenadas (x,y). En la siguiente imagen tenemos el punto A de coordenadas (x1,y1) y el punto B (x2, y2):

Y sabiendo esos puntos podemos obtener la ecuación de la recta.
Lo primero que necesitamos es saber la pendiente de la recta, que nos dice como está inclinada con respecto del eje. Conociendo los puntos A, B anteriores tenemos que la pendiente es:
M = (y2-y1)/(x2-x1)
Y para un punto cualquiera (X,Y) se debe cumplir la siguiente ecuación:
Y-y1 = M * ( X - x2 )
Sustituyendo M por su valor y cambiando y1 al otro lado tendremos:
Y = (X-x2)*(y2-y1)/(x2, x1) + y1
Uhmmmm, ¿a qué es curioso? ¿por que me suena? Por que lo has leido unas cuantas lineas arriba. Efectivamente, map es solo la aplicación de la ecuación de la recta donde el punto A es el valor (in_min, out_min) y el punto B es (in_max, out_max)
¿Por qué dijiste que el ejemplo de la presión no es funcional?
No es que no funcione, pero debeis tener en cuenta en la forma en que está declarada la función usando enteros largos (long). Si utilizais valores que no sean enteros, por ejemplo float, el compilador convertirá esos valores float a enteros y los trunca de mala manera, por lo que los resultados no son los esperados.
Por eso, es conveniente adaptar la función map a valores float, basta tan solo con cambiar el tipo:
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Pero también es conveniente recordaros que Arduino no trabaja con números en coma flotante, y lo que se hace es una implementación software, por lo que tampoco va a ser muy exacta del todo, aunque lo suficiente para la mayoria de las aplicaciones.
Espero os haya gustado el tutorial.
