Función map de Arduino en Scratch 2.0.

El entorno de programación Arduino tiene una función muy útil llamada map, aunque a buen seguro la primera vez que te topes con ella te preguntarás que para qué diblos sirve. Lo descubriremos en seguida:

Imagináos que conectamos a nuestra placa Arduino una fotoresistencia (LDR para los amigos) a una de sus entradas analógicas, las que nos sirven habitualmente para conectar sensores. E imaginemos que tenemos una lámpara LED en alguna salida digital de las que permiten regular potencia con el denominado modo PWM. Perfecto. Nuestro reto consistirá en programar el LED para que luzca con una intensidad inversamente proporcional a la iluminación ambiental. Es decir, cuanto más luz haya en la sala, menos lucirá el LED, y al contrario, cuanta menos luz tenga la habitación, con más potencia lucirá el LED. ¿Podíamos haberlo hecho más fácil?, posiblemente, pero así será más divertido. Además, ¿quién dijo miedo?.

Ya tenemos el reto y el montaje. Solo nos falta programarlo y aquí es donde aparece un problema interesante de resolver: Mientras que los sensores en Arduino pueden diferenciar 1024 niveles o valores distintos (en este caso, intensidades de luz ambiental), los pines PWM digitales pueden graduarse entre 0 y 255 (la intensidad con que queramos que luzca el LED). ¿Cómo hacemos para respetar la proporcionalidad entre el dato de entrada y la potencia que corresponde aplicar?. Aquí es, colegas, donde la función map nos rescata de sudar tinta. Tan solo necesitamos introducir en la función los valores máximo y mínimo entre los que puede variar la entrada (LDR) así como el máximo y mínimo del rango de salida (LED). Para cada valor medido en cada momento por el sensor (LDR), map nos devuelve el valor proporcional de salida (PWM a aplicar al LED).

Pasamos ahora a la parte matemática que hay detrás. En la página oficial de Arduino, ésta es la información de referencia. En la notación utilizaremos Valor para la lectura de entrada del sensor que queremos map-ear. Ent_m y Ent_M son los valores mínimo y máximo del rango en el que se mueve Valor. Del mismo modo, Sal_m y Sal_M son, respectivamente, los valores mínimo y máximo del rango de salida. Las operaciones que efectúa son las siguientes:

map = ( (Valor – Ent_min) * (Sal_M – Sal_m) / (Ent_M – Ent_m) ) + Sal_m

Pongamos un ejemplo: si en la habitación hubiese poca luz, la LDR puede darnos un valor (recordad, entre 0 y 1024), por ejemplo de 120. Introduciendo ese valor en la función map, obtendremos 225. Si nos fuésemos a los extremos, en una habitación a oscuras, la LDR nos daría una lectura de 0 (o casi 0), y la función map nos devolvería 255 (o casi casi), es decir, la luz a tope de potencia. Al contrario, en una sala con mucha luz, el valor de la LDR se acercaría a 1024 y la operación map devolvería prácticamente 0, que correspondería con el LED apagado (o muy flojito).

Hay que reconocer que la operación es fea, pero en un plis-plas la dejamos mucho más bonita en Scratch. Como habréis descubierto, Scratch 2.0 ha traído muchas novedades, entre ellas una muy esperada: crear nuestros propios bloques de código. Ésta es la pinta que tiene la función map que he preparado…

map_Arduino_def

Esta función almacena en una variable que previamente he definido como map_valor, el resultado de la función map de Arduino. Veréis que al frente de la parte matemática (en verde) se encuentra la operación round. Esto es debido a que la función map debe devolver valores enteros y round nos redondea los decimales. En nuestro montaje de la LDR y el LED, utilizaría el bloque recién creado de esta forma. Los bloques negros son los que la extensión s2a_fm incorpora para el control de Arduino:

map_Arduino_LDRLED

Os lo explico un poco. He conectado la LDR al pin analógico 1 y el LED al pin digital 9. El bloque map toma como dato de entrada el valor de la LDR y lo almacena en map_valor, que a su vez se utiliza como salida PWM en el pin 9. Observad que he puesto el rango de lectura de la LDR de mayor a menor. Con ese truco consigo que cuanta menos luz se detecte, más potencia se suministra al LED y viceversa.

 

 Bonus:

En nuestra anterior entrada desarrollamos un juego en el que dos LDR nos servían como joystick virtual para controlar a Scratch. En principio no utilicé la función map, pero ya que la hemos estudiado, he redefinido los bloques que controlaban el movimiento y éste es el resultado:

map_Arduino_joystick

Las LDR están conectadas a los pines analógicos 0 y 1. La posición de Scratch la marca la diferencia de lecturas de las resistencias. Por eso definimos los rangos de entrada desde -1024 (una marca 0 y la otra 1024) hasta 1024 (situación contraria). El rango de salida lo define la anchura del escenario, que puede ir desde -240 píxeles hasta 240. Como hábiles observadoes que sois, ya os habréis dado cuenta de que la función map admite valores negativos (e incluso fuera de rango, pero eso ya lo veremos en otra ocasión).

Espero no haberos aburrido. La función map es muy útil en Arduino y ahora que la hemos convertido en un bloque de Scratch 2.0, estoy convencido de que la usaremos mucho. Pasadlo bien construyendo y programando.

Saludos.

Deja un comentario

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