Hola a todos. Estamos desatados. Las últimas semanas han sido muy prolíficas y es hora de mostraros todo lo que vamos terminando. Hoy dejaremos descansar al profesór Don Básico para traeros una reproducción de uno de los juguetes más famosos de la historia. Originalmente se denominó Ech A Sketch, aunque a España llegó como Telesketch.
Es realmente difícil encontrar a alguien nacido enter los años 70 y 80 que no haya tenido, jugado o siquiera visto este artefacto. El funcionamiento era muy sencillo, pero dominar los mandos, un auténtio desafío. La pantalla estaba recubierta por unas sales que le daban el aspecto verdoso oscuro típico. Una aguja iba limpiando la pantalla allí por donde pasaba, apartando las sales y dejando una marca más oscura. Los mandos giratorios movían la aguja mediante unas poleas, uno de ellos en el eje X mientras que el otro se encargaba del Y. Hacer garabatos era sencillísimo, pero conseguir que lo dibujado se pareciese a algo real, una odisea. Para borrar el dibujo tan solo había que poner boca abajo la pantalla y agitarla para que las sales volviesen a distribuirse por la superficie.
En expeduca hemos querido rendier un homenaje a este simpático juguete que siempre nos pareció mágico, reeditando una versión electrónica: el Expeduc A Sketch. Pero antes de dar paso al proyecto, necesitamos comprender una función muy utilizada en el Mundo Arduino que nos facilitará de un modo increible los cálculos. Se trata de la función map. En una entrada anterior ya dedicamos un artículo a esta función, pero queremos renovarla utilizando el imprescindible s2aio, el puente de comunicación entre Arduino y Scratch 2.0. Os pondré un ejemplo:
Imaginad un montaje con un potenciómetro y un LED conectados a una placa Arduino. Ya sabéis que las entradas analógicas de Arduino pueden tomar valores entre 0 y 1023, mientras que las salidas PWM que permiten regular la intensidad del LED oscilan entre 0 y 255. E imaginemos que queremos que cuanto mayor sea el valor del potenciómetro, mayor sea la intensidad de la luz emitida por el LED. Entonces, el LED estará apagado con el valor 0 del potenciómetro y deberá lucir al máximo cuando el potenciómetro llegue al 1023. También es fácil de entender que en el entorno de 512, el LED deba lucir a medias (valor 128 más o menos), pero para muchos otros valores se requieren varias operaciones para calcular su correspondencia. Aquí es donde la función map llega al rescate. Se trata de una operación que asigna de manera proporcional los valores de un rango a los de otro. Debemos introducir en la función los valores máximo y mínimo tanto de entrada como de salida. A partir de estos 4 valores, cada vez que le preguntemos por un valor del conjunto de entrada, nos responderá con el valor correspondiente en el conjunto de salida.
Revisemos 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 potenciómetro que queremos map-ear. ent_m y ent_M son los valores mínimo y máximo del rango de entrada en el que se encuentra Valor. Del mismo modo, sal_m y sal_M son los valores mínimo y máximo del rango de salida. Las operaciones a efectúar son las siguientes:
map = ( (Valor – ent_min) * (sal_M – Sal_m) / (ent_M – ent_m) ) + sal_m
Que traducido a nuestros bloques de colores favoritos quedaría así:
Utilizamos la categoría morada Más Bloques para replicar la fórmula de map. Como salida, la función guarda el valor en la variable map_salida. Por si queréis utilizar esta función en alguno de vuestros montajes, os dejamos en este enlace un proyecto de Scratch 2.0 con los bloques de s2aio y la función map ya incluidos. Recordad que también tenéis a vuestra disposición un estupendo artículo para instalar s2aio.
Y ahora ya estamos en disposición de tomar las riendas de nuestro Expeduc A Sketch. Ante todo el video para que comprobéis el funcionamiento, disculpándonos por anticipado por el efecto Moiré que aparece en la parte izquierda de la pantalla.:
El programa consta de 3 módulos. Uno de ellos ya lo conocéis, es la propia definición de la función map. El siguiente es el módulo principal del programa, el que controla el movimiento del puntero. Como véis, comienza por la típica definición y activación de entradas/salidas de la placa Arduino que vamos a utilizar. En este caso, los potenciómetros están conectados a las entradas analógicas 0 y 2 y el panel táctil capacitivo a la 5 (hablaremos de él más adelante). Para eliminar cualquier rastro de anteriores dibujos, los siguientes bloques se encargarán de limpiar la pantalla y dejar el puntero con el color y la apariencia adecuada. Finalmente damos paso a un bloque Por Siempre con la función map. Como veréis, el rango de entrada es el de los valores posibles del potenciómetro (0-1023) mientras que el de salida puede ir, en el caso horizontal, desde -240 a 240 (las coordenadas de la pantalla en el eje X) y desde -180 a 180 (coordenadas del eje Y) para el eje vertical. Introducimos en la función map el valor de cada potenciómetro y obtendremos como salida un valor correspondiente para cada eje. Solo queda decirle al puntero que se posicione en la coordenada resultante. Fácil, ¿verdad?.
El tercer módulo es el encargado de controlar las pulsaciones sobre la plaquita táctil capacitiva. Conectada a una entrada analógica, entrega un valor de 0 en estado normal, subiendo a unos 650 cuando la tocamos con el dedo, resultando treméndamente sencillo su manejo. En este proyecto nos servirá como interruptor on/off del puntero, de modo que una pulsación activa la escritura y la siguiente la desactiva. Para ello, comprobaremos continuamente el valor medido en la entrada a la que está conectada la plaquita táctil. Si es mayor de 500 significará que la hemos pulsado y en ese caso se ejecutará el contenido del condicional. En su interior utilizamos la variable Lapiz para almacenar los valores 0 ó 1. Si es 0, el puntero no pintará, mientras que si es 1, sí. Para cambiar de modo de funcionamiento utilizamos una ingeniosa fórmula que calcula el valor absouto (abs) del estado de la variable Lapiz a la que le restamos 1 en cada ejecución. Podréis comprobar que si la variable vale 0 inicialmente, en la siguiente pulsación cambiará a 1 y en la siguente a 0 y así sucesivamente. Para terminar, utilizamos un retardo de 0.8 segundos para evitar dobles pulsaciones y no saturar la placa Arduino.
No podemos despedirnos sin mostraros el sencillo montaje de los componentes en su placa. Así mismo, tenéis disponible el archivo para Scratch en este enlace. Divertíos y experimentad.