Tabla de contenido:

Mini juego de memoria Lego: 5 pasos (con imágenes)
Mini juego de memoria Lego: 5 pasos (con imágenes)

Video: Mini juego de memoria Lego: 5 pasos (con imágenes)

Video: Mini juego de memoria Lego: 5 pasos (con imágenes)
Video: No sabía que los LEGO se comían 😧 #shorts 2024, Noviembre
Anonim
Image
Image
Mini juego de memoria de Lego
Mini juego de memoria de Lego

Hace aproximadamente un año, escribí un Instructable sobre la instalación de un montón de LED en un Lego Mini Cooper. La innovación, tal como estaba, fue que los LED se podían controlar con un teléfono inteligente (o mediante cualquier navegador web, para el caso).

Como describí laboriosamente en ese Instructable, la mayor parte del esfuerzo en ese entonces se relacionaba con conectar el Mini sin que todo se derrumbara. Para mi sorpresa, el Mini sobrevivió posteriormente a un viaje de Connecticut a Toronto y ha funcionado, más o menos, desde entonces.

"Si no estaba roto, lo arregló hasta que se rompió" será mi epitafio, en el mejor de los casos, así que cuando el Mini regresó a casa por Navidad, llegó el momento de Lego Mini 2.0. Después de todo, si Tesla puede enviar actualizaciones de software a sus automóviles, ¿qué tan difícil podría ser?

Tenía algunas ideas:

  • Mejora la interfaz de usuario bastante torpe
  • ¡Agrega un cuerno!
  • Mejorar la función de "luces automáticas"; y, lo más importante
  • Agregue una función de juego (incluso yo reconocí que la novedad de encender y apagar las luces del Mini con su teléfono iba a empañar tarde o temprano)

La función del juego fue la tarea más importante, sobre todo porque no me resultó obvio de inmediato qué tipo de juego podría ser. El Mini es demasiado frágil para sostener un juego en el que se maneja (excepto posiblemente una variante deprimente de Jenga). Otro obstáculo fue que nunca programé un juego en mi vida.

Después de un año de reflexiones infructuosas, me topé con un proyecto en Hackster, en el que se utiliza un Arduino Uno para emular un juego de memoria de juguete que data de la década de 1970 llamado Simon. En pocas palabras, el dispositivo Simon reproducía una secuencia de luces que el jugador tenía que recordar y reproducir presionando botones. Después de cada ronda exitosa, la secuencia se incrementó en longitud.

A pesar de ser de la época necesaria, nunca había oído hablar de este juego, y debo decir que es increíble lo que pasaba por diversión en su día. Aún más sorprendente es que el juego de Simon todavía está a la venta y está obteniendo críticas muy favorables en Amazon. Claramente, este tenía que ser el principal candidato para adaptarse a mis propósitos. Después de todo, el Mini ya tenía las luces, así que todo lo que tenía que hacer era deshacerme de los botones físicos y que el usuario ingresara a través de un teléfono inteligente. En el lado del software, por lo tanto, parecía que esto sería en gran parte un trabajo de cortar y pegar.

Pero primero, necesitaba hacer algunas modificaciones menores al hardware.

Paso 1: Componentes, herramientas y recursos

Componentes, herramientas y recursos
Componentes, herramientas y recursos

Si está replicando este proyecto con un Lego Mini, necesitará todas las cosas enumeradas en mi Instructable anterior. Lo único adicional que necesitarás es un timbre pasivo, que se usa para la bocina y para hacer un montón de ruidos molestos durante el juego (que se puede desactivar).

Como quedará claro al hablar del software, no hay una necesidad real de usar un Lego Mini para el juego. Podría usar otro kit de Lego, o de hecho, un montón de LED en una placa de pruebas conectada a cualquier placa de desarrollo ESP8266. Con algunos relés, incluso podría usar la iluminación de la habitación de su hogar. Niños, pregúntenles primero a sus padres sobre eso.

Del mismo modo, no se necesitan herramientas o recursos adicionales más allá de los enumerados para el proyecto original.

Si se encuentra entre el puñado de personas que leyeron la descripción original del proyecto, sabrá que el Lego Mini se compró originalmente como un regalo para mi hija mayor, que tiene un Mini "real" casi idéntico, o casi idéntico como se podría decir que es un Nuevo Mini, no un "Clásico". La falta de componentes adicionales significativos hizo que este nuevo proyecto fuera aún más atractivo, ya que me permitiría volver a regalar Lego Mini 2.0 como un nuevo regalo de Navidad sin costar apenas un centavo. ¡Genio!

Paso 2: Modificación de hardware

Modificación de hardware
Modificación de hardware

El proyecto original tenía LED interiores RGB controlables individualmente. Estos consumieron tres pines en el NodeMCU, que estaba usando como placa de desarrollo. Después de una consulta discreta con el propietario de Lego Mini, se determinó que los LED RGB eran una característica infrautilizada. Esta fue una inteligencia importante porque necesitaba liberar un alfiler para el timbre / bocina.

El diagrama de circuito anterior es del proyecto original. El único cambio necesario para este proyecto fue eliminar los LED RGB y usar los tres pines liberados de la siguiente manera:

  • D1 para la señal de control del zumbador (que también está conectada directamente a la fuente de alimentación de 5 V CC)
  • D7 para un LED interior blanco
  • D8 para uno de esos LED de colores intermitentes, que he denominado luz de "discoteca"

El timbre en sí se esconde perfectamente debajo del compartimiento del motor, por lo que llevar los cables de regreso al NodeMCU fue muy fácil.

Paso 3: actualización de la GUI

Actualizar la GUI
Actualizar la GUI
Actualizar la GUI
Actualizar la GUI
Actualizar la GUI
Actualizar la GUI

El primer paso para actualizar la GUI fue crear cuatro páginas web independientes:

  • Una "pantalla de bienvenida" que se inicia a través de un icono personalizado en su teléfono inteligente y enlaces a las otras páginas.
  • La página "Controles" que, bueno, controla las luces (y ahora, por supuesto, la bocina)
  • La página "Juego"
  • Una página de configuración que contiene opciones de configuración como:

    • Encender y apagar el sonido
    • Configuración de la zona horaria (el Mini obtiene la hora de Internet para que pueda encender sus luces en la hora con la hora apropiada)
    • Ajustar cuándo las "luces automáticas" encenderán y apagarán los faros en función del nivel de luz ambiental
    • Restablecimiento de la puntuación más alta y el nombre del anotador más alto (almacenado en EEPROM)

Separar las funciones de esta manera hace que la experiencia sea mucho más parecida a la de una aplicación. Conseguir que NodeMCU sirva varias páginas fue uno de los desafíos para este proyecto. Después de probar un par de enfoques diferentes, encontré el código que ve en las líneas 232 a 236 del boceto principal de Arduino. Esto funciona muy bien: simplemente cree su archivo de índice y luego nombre las páginas siguientes page1, page2, etc. Descubrí que tenía que poner todos los archivos de recursos (CSS e imágenes) en la carpeta de datos raíz, pero esto no es realmente un problema para los sitios de este tamaño.

A continuación, tuve que ponerme a trabajar con CSS y Javascript para hacer algo que parecía pertenecer a un Lego Mini. Como no sé casi nada sobre ninguno de los temas, hubo muchas búsquedas en Google aquí antes de obtener algo con lo que estaba feliz. Comencé copiando descaradamente un ladrillo lego con estilo CSS en CodePen aquí. También quería dejar de etiquetar los botones con texto y terminar usando gráficos simples de Icons8, que eran perfectos para mis propósitos. El resto cayó en su lugar desde allí. Las páginas se reproducen bastante bien en todos los iPhones en los que las he probado. Con suerte, lo mismo es cierto para los teléfonos Android (se ve bien en un navegador Chrome de escritorio).

Paso 4: el código del juego

El código del juego
El código del juego

La comunicación entre el servidor NodeMCU y el navegador del teléfono inteligente se realiza a través de Websockets. Después de que el usuario presiona un botón, el navegador envía un carácter de texto al NodeMCU que corresponde a una o más de las luces del Mini. Se envían personajes adicionales para controlar el flujo del juego. El código Arduino luego toma acción en función del carácter recibido. La comunicación de Websocket solo puede manejar caracteres binarios y de texto, por lo que se necesita alguna conversión para los números enteros (por ejemplo, la zona horaria).

Como mencioné, originalmente había anticipado usar el código del proyecto Hackster vinculado para las funciones principales del juego. Lo que anticipé que sucedería es que, después de que un jugador presionara un botón, el LED correspondiente se encendería y el código haría una lectura digital en todos los LED para ver si el correcto estaba encendido (el proyecto Hackster verifica las entradas físicas del botón pero es la misma idea). Esto funcionó, en cierto modo, pero por razones que aún no me quedan claras, no perfectamente. Aproximadamente el 10% de las veces, el Mini diría que se presionó un botón incorrecto cuando, de hecho, se presionó el correcto. Todo parecía estar bien según lo que pude ver en el monitor en serie y en la consola del navegador, así que no tengo idea de por qué no funcionó.

Después de muchos errores al intentar introducir alguna verificación de errores, abandoné la idea de leer los estados del LED y creé una matriz de "respuesta" que verifica si el texto de Websocket recibido corresponde al pin correcto almacenado en la matriz de "secuencia" que reproduce la secuencia de luces para recordar. Esto parece ser 100% confiable incluso si la forma en que lo implementé es un poco laboriosa. Después de idear este método, me encontré con esto, que es una exploración interesante de la forma en que funcionan algunas cerraduras digitales y es análoga al enfoque utilizado en el juego.

La sincronización de las entradas de los botones ahora se maneja con Javascript en el lado del navegador (permito 10 segundos muy generosos entre las entradas de los botones) y el flujo del juego ahora está completamente controlado por el jugador en lugar de codificado. La pantalla incluye ventanas que muestran el tiempo restante para hacer que se presione el siguiente botón y el número de entradas restantes antes de que el jugador envíe correctamente la secuencia.

El puntaje alto se almacena en EEPROM (o lo que pasa por EEPROM en el mundo ESP8266) y si un jugador alcanza un nuevo puntaje alto, un cuadro emergente le permite ingresar un nombre de su elección, que también se almacena en EEPROM. Estos valores se pueden restablecer a través de la página de configuración (estoy seguro de que podría haber razones legítimas para esto).

Con todo lo dicho, reutilicé una parte decente del código del juego Hackster que aceleró mucho las cosas.

Paso 5: el resto del código

El resto del código
El resto del código

Comparado con el código del proyecto Hackster, mi boceto de Arduino parece enorme, incluso sin todo el HTML, CSS y Javascript en los archivos de datos. Pero la mayor parte del boceto es un montón de funciones relacionadas con operaciones básicas como crear y administrar el servidor, obtener tiempo NTP, mDNS, proporcionar actualizaciones inalámbricas, administración WiFi, administración de archivos SPIFFS y similares.

El Javascript en los archivos HTML es principalmente para manejar los mensajes de Websocket (recibidos y enviados) y aumentar la interactividad de la GUI.

Como mencioné, quería mejorar la funcionalidad de la función "luces automáticas", que utiliza una resistencia dependiente de la luz en el único pin analógico del NodeMCU para detectar la luz ambiental y encender las luces del Mini a un nivel preestablecido (cuando no está en el modo de juego)., por supuesto). Si bien esta es una característica muy frívola en un proyecto frívolo, me molestó que en el proyecto original hubiera codificado el umbral de encendido y que un usuario no tuviera forma de ver cómo el nivel de luz predominante se relacionaba con ese umbral. Ahora, la lectura del nivel de luz se envía a la página Configuración cada cinco segundos y esa página también muestra los umbrales actuales para encender y apagar (que puede configurar el usuario). Así que trabajo en eso.

Oh, casi lo olvido. El código está en GitHub aquí. Después de la descarga, coloque todo el paquete en una nueva carpeta, cargue el boceto de Arduino y luego el contenido de la carpeta de datos en SPIFFS.

Recomendado: