7 Entradas de Echidna con mapeo (avanzado) Mapeo (avanzado) ¿Qué es eso de "mapeo"? En la jerga robótica, dicho pronto y mal pero para que se entienda, mapear significa hacer un cambio de escala ¿Cuándo se dan esas situaciones? SITUACION A : Queremos leer un valor de entrada analógica en un Arduino, por lo tanto va de 0-1023 y queremos que se copie en una salida digital PWM de Arduino que va de 0-255 SITUACION B : Queremos leer un valor de entrada analógica en un Arduino, por lo tanto va de 0-1023 e interpretarlo en sus valores de voltios. Si suponemos que la placa se alimenta a 5V la variable de salida irá desde 0 a 5V SITUACION C : Queremos leer el valor de un LDR, que tapándolo nos da 917 e iluminándolo al máximo es 1023, lo queremos copiar en una salida digital PWM, o sea que la salida va desde 0 a 255 Nota: El mínimo de 917 (puede ser otro número, es un valor experimental) es debido a que los LDR van montados en un divisor de tensión como el de la figura, y la resistencia de abajo, siempre se queda algo de tensión SITUACION D : Queremos según el valor de un joystick conectado a las entradas analógicas de un Arduino (esto pasa en Echidna) se representen en la pantalla de Scratch 2*220 por 2*180, es decir   - Eje X : el potenciómetro (vamos a llamarlo potx ) va de 0 a 1023 y la salida ( ejex ) va de -220 a 220   - Eje Y : el potenciómetro (vamos a llamarlo poty ) va de 0 a 1023 y la salida ( ejey ) va de -180 a 180 SITUACION E: Ídem pero no con el potenciómetro, sino con el acelerómetro (vamos a llamarlo acel ) que va 250 a 500 SITUACION F : Queremos leer un valor de entrada analógica en un Arduino, por lo tanto va de 0-1023 y queremos que se copie en una salida de un servo, por lo tanto lo que necesita es un ángulo que va de 0-180 SITUACION G : Idem que F pero una raspberry por lo tanto GPI va de 0-65.535 ¿Cómo se consigue mapear? Si programas con código ArduinoIDE, tienes la instrucción map Si no tienes map, por ejemplo, programas con bloques gráficos tipo Scratch, lo tienes que hacer a mano ¿Cómo? Con la ecuación de una recta Para entendernos : X  será el valor de entrada que tiene unos valores límites X 1 e X 2 Y es la variable de salida que queremos y que tiene otros valores límites Y 1  e Y 2 Luego y tiene esta ecuación : donde m es  Gráficamente  ¿Una hoja de cálculo para poder hacer esos cálculos? Sí, claro, en este enlace https://docs.google.com/spreadsheets/d/1qNbaZ2c_H1UCNhtvp2LimfWSbaGvZLVl5gJr9Wu0ifU/edit?usp=sharing dale a descargar Rellena las casillas amarillas, y en las naranjas tienes el resultado de m y n ¿Me lo puedes hacer para cada situación anterior? Si claro: SITUACION A : Queremos leer un valor de entrada analógica en un Arduino, por lo tanto va de 0-1023 y queremos que se copie en una salida digital PWM de Arduino que va de 0-255 Límites de las variables : X de 0-1023 Y de 0-255 Con la instrucción map : Y = map( X, 0, 1023, 0, 255); Sin la instrucción map Y = 025 * X  pues 255/1023 = 0.25 también podemos escribir Y = X/4 SITUACION B : Queremos leer un valor de entrada analógica en un Arduino, por lo tanto va de 0-1023 e interpretarlo en sus valores de voltios. Si suponemos que la placa se alimenta a 5V la variable de salida irá desde 0 a 5V Límites de las variables : X de 0-1023 Y de 0-5 Con la instrucción map : Y = map( X, 0, 1023, 0, 5); Sin la instrucción map Y = 0.0048 * X  pues 5/1023 = 0.0048 o también podemos escribir Y = X/204 que queda mejor pues 1023/5=204 aprox. SITUACION C : Queremos leer el valor de un LDR, que tapándolo nos da 917 e iluminándolo al máximo es 1023, lo queremos copiar en una salida digital PWM, o sea que la salida va desde 0 a 255 Límites de las variables : X de 917-1023 Y de 0-255 Con la instrucción map : Y = map( X, 917, 1023, 0, 255); Sin la instrucción map Y = 2.4 * X  pues 255/(1023-917) = 2.4 SITUACION D : Queremos según el valor de un joystick conectado a las entradas analógicas de un Arduino (esto pasa en Echidna) se representen en la pantalla de Scratch 2*220 por 2*180, es decir   - Eje X : el potenciómetro (vamos a llamarlo potx ) va de 0 a 1023 y la salida ( ejex ) va de -220 a 220   - Eje Y : el potenciómetro (vamos a llamarlo poty ) va de 0 a 1023 y la salida ( ejey ) va de -180 a 180 EJEX Límites de las variables : potx de 0-1023 ejex de -220 a +220 Con la instrucción map : ejex = map( potx, 0, 1023, -220, 220); Sin la instrucción map ejex =-220 + 0.43*potx pues (220-(-220))/1023=0.43 EJEY Límites de las variables : poty de 0-1023 ejey de -180 a +180 Con la instrucción map : ejey = map( poty, 0, 1023, -180, 180); Sin la instrucción map ejey =-180 + 0.35*poty pues (180-(-180))/1023=0.35 SITUACION E: Ídem pero no con el potenciómetro, sino con el acelerómetro (vamos a llamarlo acel ) que va 250 a 500 EJEX Límites de las variables : acelerómetro acel de 250-500 ejex de -220 a +220 Con la instrucción map : ejex = map( acel, 250, 500, -220, 220); Sin la instrucción map ejex =-220 + 1.76*(acel-250) pues (220-(-220))/(500-250)=1.76 EJEY Límites de las variables : acelerómetro acel de 250-500 ejey de -180 a +180 Con la instrucción map : ejey = map( acel, 250 500, -180, 180); Sin la instrucción map ejey =-180 + 1.44*(acel-250) pues (180-(-180))/(500-250)=1.44 SITUACION F : Queremos leer un valor de entrada analógica en un Arduino, por lo tanto va de 0-1023 y queremos que se copie en una salida de un servo, por lo tanto lo que necesita es un ángulo que va de 0-180 Límites de las variables : X de 0-1023 Y de 0-180 Con la instrucción map : Y = map( X, 0, 1023, 0, 180); Sin la instrucción map Y = 0.17* X  pues 180/1023 = 0.17 también podemos escribir Y = X/5.7 pues 1023/180=5.7 SITUACION G : Idem que F pero una raspberry por lo tanto GPI va de 0-65.535 Límites de las variables : X de 0-65535 Y de 0-180 Con la instrucción map : Y = map( X, 0, 65535, 0, 180); Sin la instrucción map Y = 0.00274* X  pues 180/65535 = 0.00274 pero es más cómodo al revés Y = X/364 pues 65535/180=364 MONTAJE 8 Comebichos No podemos dejar el Joystick sin hacer un videojuego !! El siguiente RETO es: Mover un Sprite “Bat” con el Joystick para atrapar un Beetle Bat se tiene que mover con el joystick por toda la pantalla. Beetle se mueve horizontalmente desde el borde derecho hasta el borde izquierdo, y cuando llega al izquierdo, vuelve a aparecer en el derecho (y aleatoriamente desde cualquier altura) Solución con EchidnaScratch Añadimos los Sprite Beetle y Bat y borramos el gato Al sprite BEETLE vamos a moverlo aleatoriamente con este script El sprite BAT se moverá según la posición del JOYSTICK pero  mapeadas es la SITUACION D de la página que has visto mapeo  algo retocadas. y le añadimos el siguiente código al BAT para que cuente los bichos comidos. Previamente crear una variable COMIDOS Todos los programas de este curso se encuentran en este repositorio:  https://github.com/JavierQuintana/Echidna Solución con mBlock El bicho Bettle lo haremos mover bastante rápido y al azar en el eje Y para que lo tenga difícil Bat: Y bat tiene que moverse con el joystick, que le pasaremos las variables A0 y A1. Por lo tanto el Arduino tiene este programa: Además hemos añadido la puntuación y el cambio de disfraz para que parezca que aletea: Por lo tanto el programa del objeto murciélago es El programa completo lo puedes descargar aquí https://planet.mblock.cc/project/projectshare/3230393 El resultado es: Lo sé …. soy bastante malo !! MONTAJE 9 SPRITEVOLADOR ¿Qué es un acelerómetro? El acelerómetro tiene el mismo efecto que el Joystick, nos da valores en el eje X o eje Y, en el caso del Joystick lo daba la inclinación de la palanca, en este caso lo da la inclinación del mismo Echidna. Está conectado a los pines analógicos: A2 nos da la inclinación en el eje X A3 nos da la inclinación en el eje Y Los valores van desde 250 hasta 500 MONTAJE 9 SPRITEVOLADOR Vamos a realizar un sencillo videojuego: Mover un sprite volador , el movimiento de un sprite con el acelerómetro y esquivando edificios que se mueven de derecha a izquierda dando la sensación de que el sprite vuela. El reto te lo complicamos con dos premisas: Modificar disfraces del sprite Reutilizar sprites externos desde  Scratch Este programa tienes tres pasos Sprite volador moviéndose según acelerómetro Le añadimos un disfraz de explosión reutilizando de otro Sprite "sun" Movimiento según acelerómetro Sprite edificios Exportación de sprites externos de otro autor Importación a nuestro proyecto Muerte del sprite volador si toca edificio. Aquí es el código propio del juego A SOLUCIÓN CON ECHIDNASCRATCH A1 Sprite PARROT moviéndose según acelerómetro A1.1 Añadir un disfraz al PARROT de explosión.  Quitamos el sprite del gato y añadimos el sprite SUN Entramos en edición del sprite Lo tuneamos un poco para que parezca una explosión (simplemente pintar de rojo el centro) Lo exportamos Guardamos con explosion.svg Ahora añadimos el Sprite PARROT y al sprite PARROT le ponemos el disfraz de explosión: Añadimos el sprite PARROT Borramos el anterior SUN ya no lo necesitamos Entramos en Edición del sprite Menú del disfraz (costume) Upload costume elegimos el fichero creado anteriormente "explosion.svg" Abrimos Ya tenemos un disfraz añadido al Parrot. Clica en el primer disfraz pues cuando vuelvas a la ventana de código verás el de explosión si no lo haces. Otra manera más fácil sería simplemente añadir un disfraz de los sprite por defecto y en paz A1.2 Movimiento del sprite PARROT  Vamos a hacer que el pájaro se mueva según el acelerómetro: MAPEO : Queremos según el valor del acelerómetro, se representen en la pantalla de Scratch 2*220 por 2*180, es decir   - Eje X : el potenciómetro (vamos a llamarlo  potx ) va de 0 a 1023 y la salida ( ejex ) va de -220 a 220   - Eje Y : el potenciómetro (vamos a llamarlo  poty ) va de 0 a 1023 y la salida ( ejey ) va de -180 a 180 Si vamos a la hoja de cálculo , podemos sacar los valores de mapeo anteriores A2 Sprite EDIFICIO moviéndose de derecha a izquierda Dará sensación al sprite pájaro que está volando. A21 Exportación de Sprites externos Vamos a ser vagos: Nos vamos a copiar de alguien externo:  Entramos en este proyecto FLY de scratch  https://scratch.mit.edu/projects/113582791/ entramos en su código y exportamos los edificios, nubes, etc... Una vez dentro del editor EXPORTAMOS ESTOS SPRITES Simplemente botón derecho y EXPORTAR Y guardamos esos ficheros generados Buildings2.sprite3 Clouds.sprite3 Cloud.sprite3 Buildings.sprite3 A22 Importación de los Sprites externos Entramos en Añadir Sprite Upload Elegimos los ficheros exportados anteriormente en A21 INCREIBLE nos importa el Sprite  CON SU CÓDIGO INCLUIDO  si le das a la Bandera verás que el efecto sin apenas realizar trabajo A3 Muerte del PARROT Ya lo tenemos casi, añadimos al bucle de PARROT un condicional: Si PARROT toca BUILDINGS o BUILDINGS2 entonces Cambia de disfraz EXPLOSION Envía mensaje komunikat1 que es el que utiliza el autor de los edificios para parar su movimiento, (debe de ser ruso su autor) MEJORAS Ya sé que colocando el helicóptero siempre arriba, siempre ganas!! HAZ QUE SOLO SI TOCA BUILTING1 MUERE, PERO SI TOCA A BULDING2 QUE GANE UN PUNTO de esta manera ya no se gana poniendo el helicóptero arriba del todo Todos los programas de este curso se encuentran en este repositorio:  https://github.com/JavierQuintana/Echidna B SOLUCIÓN CON mBlock B1 Sprite helicóptero moviéndose según acelerómetro B11 Añadir un disfraz al helicóptero de explosión.  Vamos a añadir un objetos: helicóptero de la biblioteca- Le vamos a añadir un disfraz explosión 1.- Añade un objeto sun, y borra el dibujo interior, y así parece una explosión 2.- Exporta el fichero imagen svg 3.- Añade al helicóptero el disfraz  4.- Eligiendo el fichero svg exportado en el paso 3 B12 Movimiento helicóptero Vamos a hacer que helicóptero que se mueva según el acelerómetro: (Ver al final DETALLES MAPEO) En el arduino le asignamos las coordinadas a las variables globales A2 y A3 B2 Solución edificio, cómo se reutiliza un sprite B21 Exportación de un Sprites externos Esta parte es igual que A21 luego no lo repetimos B22 Importación de Sprites externos Vamos a mblock e IMPORTAMOS el fichero que hemos exportado Nos importa con sus disfraces Y SU CÓDIGO Nos queda pues esta colección de objetos B3 Solución a la muerte del helicóptero Vamos a poner que si toca un edificio, “explota” (o sea, cambia el disfraz a explosión), además envía el mensaje “komunikat1” que vemos que el script del edificio lo necesita para esconderse una vez terminado el juego (debe de ser ruso el mensaje es del autor del objeto edificio) : El programa lo tienes aquí https://planet.mblock.cc/project/3230430 MEJORAS Ya sé que colocando el helicóptero siempre arriba, siempre ganas!! HAZ QUE SOLO SI TOCA BUILTING1 MUERE, PERO SI TOCA A BULDING2 QUE GANE UN PUNTO de esta manera ya no se gana poniendo el helicóptero arriba del todo Detalles MAPEO verlo en la situación E de mapeo: https://libros.catedu.es/books/echidna/page/mapeo PUEDES CAMBIAR ESTOS VALORES TESTEANDO LOS MOVIMIENTOS DEL SPRITE MONTAJE 10 MATA-ALIENS con Joystick. Hackeando código y mapeando 1.- IMPORTANDO PROYECTO EXTERNO SCRATCH A EchidnaScratch o mBlock Entramos en SCRATCH https://scratch.mit.edu/   y buscamos ALIENS INVASION, concretamente este : https://scratch.mit.edu/projects/593781518/ Entramos en SEE INSIDE Lo grabamos en nuestro ordenador Nos vamos al programa ECHIDNA ML y cargamos el programa descargado 2.- Hackear el código para que funcione la nave con el joystick Vamos a fijarnos en el código de la nave, si nos fijamos se mueve si se pulsan las teclas ⬅️➡️ Vamos a cambiar el código para que se mueva según el Joystick Como el joystick está conectado a las entradas analógicas del Arduino, su valor va desde 0 a 1024 siendo aproximadamente 512 cuando esta en reposo o en posición del medio. Vamos a poner unas condicionales para que se mueva hacia la izquierda o hacia la derecha según estos valores, siendo 400 y 600 unos valores arbitrarios pero menores y mayores que 512 : 3.-Un poco más, disparar con D2 SR También vamos a cambiar el disparador “espacio” : En el sprite de la nave vamos a cambiar "Al presionar la tecla espacio" Lo vamos a cambiar por  Igualmente en el sprite Button2 que es el "láser" hay que cambiar Por MEJORALO !!! - es un poco solo ¿le añades un sonido cada vez que se dispara? - se pueden hacer trampas, dejando apretado el botón hace una ráfaga continua. ¿Puedes limitar a un disparo láser cada vez que se aprieta?