Programar su cubo LED Arduino 4x4x4 para hacer cosas más impresionantes

  • Brian Curtis
  • 0
  • 5120
  • 1192
Anuncio

La semana pasada, construí un cubo LED Cómo hacer un cubo de LED Arduino pulsante que parece que vino del futuro Cómo hacer un cubo de LED Arduino pulsante que parece que vino del futuro Si has incursionado en algunos proyectos principiantes de Arduino , pero están buscando algo un poco permanente y en otro nivel de asombroso, entonces el humilde cubo LED de 4 x 4 x 4 es ... - 64 LEDs que puedes programar para hacer fantásticos espectáculos de luces futuristas, y espero que también lo hayas hecho, porque es un gran proyecto para motivarte y expandir tu conjunto de habilidades Arduino. Te dejé algunas aplicaciones básicas para que pienses, pero hoy presentaré algunos bits más de software que hice para el cubo, junto con explicaciones de código. El propósito de esto es darle algunos espectáculos de luces más bonitos para ejecutar, pero también aprender sobre algunas de las limitaciones de programar el cubo y aprender algunos conceptos de programación nuevos en el proceso..

Esta es una codificación bastante avanzada; realmente necesita haber leído todos mis tutoriales anteriores de Arduino y nuestra guía de Arduino para principiantes antes de personalizar el código proporcionado.

Aplicación 1: Mini Serpiente

En lugar de ejecutar una secuencia de patrones similar a una serpiente, quería programar una serpiente, una artificial que hiciera sus propias elecciones aleatorias y fuera completamente impredecible. Está limitado a 2 segmentos solamente, lo que explicaré más adelante, y puede ver la demostración a continuación. Descargue el código completo aquí.

Cuando se trata de espacio 3D, necesita 3 coordenadas para un solo punto: X, Y, y Z.

Sin embargo, en nuestro cubo, los planos X y Z están representados por pines LED, mientras que Y se asigna directamente a los planos del cátodo. Para facilitar el trabajo con estas coordenadas y calcular el movimiento alrededor del cubo, creé un nuevo tipo de datos (usando struct) para representar un solo punto en el cubo, que llamé “xyz”. Consta de solo dos enteros: “xz”, y “y”. Con esta estructura, también podría representar una dirección, indicada a continuación en nuestro sistema de coordenadas especial (xz, y):

Movimiento Y (arriba abajo): (xz, y + 1), (xz, y-1)
Z movimiento (adelante, atrás): (xz-1, y), (xz + 1, y)
Movimiento X (izquierda derecha): (xz + 4, y), (xz-4, y)

Por ejemplo, para mover el LED en posición (0,0) uno a la izquierda, aplicamos (xz + 4, y) y terminar con (0,4).

Hay ciertos límites que se colocan en el movimiento, a saber, que las coordenadas Y solo pueden ser posibles 0 a 3 (0 es la capa inferior, 3 es la superior), y las coordenadas XZ solo pueden ser 0 a 15. Se impone un límite adicional al movimiento Z para evitar “saltando” desde la parte posterior hasta el frente del cubo, y viceversa. En este caso, usamos la función de módulo para probar múltiplos de 4 y negar ese intento de movimiento. Esta es la lógica se representa en el válido() función, que devuelve un verdadero si la dirección propuesta es un movimiento aceptable, y falso en caso contrario. Agregué una función adicional para buscar un dirección inversa - es decir, si la serpiente se dirige en una dirección, no queremos que retroceda sobre sí misma, incluso si de lo contrario es un lugar válido para moverse, y un movimiento() función, que toma una coordenada, una dirección y devuelve la nueva coordenada.

los XYZ tipo de datos, válido(), movimiento() y inverso() todas las funciones se pueden encontrar en el xyz.h archivo en las descargas. Si se pregunta por qué esto se colocó en un archivo separado en lugar del archivo de programa principal, se debe a algunas complicadas reglas del compilador Arduino que impiden que las funciones devolver tipos de datos personalizados; deben colocarse en su propio archivo, luego importarse al comienzo del archivo principal.

De vuelta en el archivo principal de tiempo de ejecución, una serie de direcciones almacena todos los movimientos posibles que puede hacer la serpiente; simplemente podemos elegir un miembro de matriz aleatorio para obtener una nueva dirección. Las variables también se crean para almacenar la ubicación actual (ahora), la anterior dirección y anterior ubicación. El resto del código debería ser bastante obvio para usted; solo For bucles, y encender y apagar los LED. En el bucle principal, verificamos si la dirección propuesta es válida, y si lo es, seguimos ese camino. Si no, elegimos una nueva dirección.

Lo único que hay que señalar en el bucle principal son algunas comprobaciones para corregir un error que encontré que involucra la multiplexación: si la nueva ubicación estaba en el mismo plano catódico o el mismo pin del ánodo, apagar el LED anterior provocaría que ambos se apagaran. También es en este punto que me di cuenta de que ir más allá de una serpiente de 2 segmentos sería imposible con mi implementación actual: intente encender 3 LED en una disposición de esquina. No puede, porque con 2 capas y 2 pines de LED activos, se encenderían 4 LED, no 3. Este es un problema inherente con nuestro diseño de cubo multiplexado limitado, pero no se preocupe: simplemente necesitamos usar la potencia de persistencia de la visión reescribir el método de dibujo.

La persistencia de la visión significa que cuando la luz llega a nuestros ojos secuencialmente, más rápido de lo que podemos procesarla, parece ser una sola imagen. En nuestro caso, en lugar de dibujar las cuatro capas al mismo tiempo, debemos dibujar la primera, desactivarla, dibujar la segunda y desactivarla: más rápido de lo que podemos decir, incluso cualquier cambio está sucediendo. Este es el principio sobre el cual trabajan los escritores de mensajes, como este:

Nuevo método de dibujo usando la persistencia de la visión

Primero apagado, una nueva rutina de sorteo. He creado un Matriz bidimensional de 4 x 16 de bits (verdadero o falso) para ser una representación literal del estado del cubo LED. La rutina de dibujo implementará la persistencia de la visión simplemente iterando sobre esto y enjuagando cada capa al cubo por un breve momento. Continuará dibujándose en el estado actual hasta que haya transcurrido el tiempo de actualización, momento en el cual volveremos a pasar el control al bucle principal (). He guardado esta sección del código en este archivo LED_cube_POV, por lo que si solo quieres saltar a la programación de tus propios juegos, puedes usar esto como base.

Aplicación 2: Juego de la vida

Por ahora, desarrollemos esto en una versión básica de Conway's Game Of Life. Para aquellos de ustedes que no están familiarizados. (intenta buscarlo en Google para encontrar una increíble animación de huevo de pascua), la Juego de vida es un ejemplo de autómatas celulares que crea un patrón fascinante de comportamiento emergente dado solo unas pocas reglas simples.

Así es, por ejemplo, cómo las hormigas parecen moverse con inteligencia y una mente colmena, a pesar del hecho biológico de que en realidad solo siguen reglas hormonales muy básicas. Aquí está el código completo para descargar: presione el Reiniciar botón para reiniciar. Si te encuentras con el mismo patrón una y otra vez, intenta mantener presionado el botón de descanso por más tiempo.

Estas son las reglas del juego de la vida:

  • Cualquier célula viva con menos de dos vecinos vivos muere, como si fuera causada por una subpoblación.
  • Cualquier célula viva con dos o tres vecinos vivos vive hasta la próxima generación..
  • Cualquier célula viva con más de tres vecinos vivos muere, como si estuviera abarrotada..
  • Cualquier célula muerta con exactamente tres vecinos vivos se convierte en una célula viva, como por reproducción.

Ejecuta el código. Notarás dentro de 5 a 10 “generaciones”, los autómatas probablemente se hayan detenido, estabilizándose en una determinada posición; a veces este patrón estable cambiará de ubicación y cambiará alrededor del tablero. En casos raros, incluso pueden haberse extinguido por completo. Esta es una limitación de tener solo 4x4x4 LED para trabajar, pero de todos modos es un buen ejercicio de aprendizaje..

Para explicar el código:

  • Puede que no estés familiarizado con memcpy () función. He usado esto para guardar el estado del juego anterior, ya que las matrices no se pueden asignar entre sí como variables normales: en realidad, debe copiar en el espacio de memoria (en este caso, 64 bits).
  • howManyNeighbours () La función debería explicarse por sí misma, pero en caso de que no lo sea, este método toma una sola coordenada y se ejecuta a través de cada posible vecino (la misma matriz de direcciones que utilizamos anteriormente en la aplicación de serpiente), para verificar si son válidas. Luego verifica si esos LED vecinos estaban 'encendidos' en el estado del juego anterior, y cuenta cuántos hay.
  • La función principal de esta aplicación Game of Life es progressGame (), que aplica las reglas de autómatas al estado actual del juego.

Mejoras: He pasado demasiado tiempo en esto hasta ahora, pero es posible que desee intentar agregar un cheque que restablezca automáticamente el tablero después de 5 o más generaciones del mismo patrón. entonces por favor hágamelo saber! También sugiero que intentes agregar la metodología POV al juego de la serpiente para hacer posible una serpiente más larga.

Eso es todo de mi parte hoy. Es posible que vuelva a visitar algunas aplicaciones de cubo de LED Arduino más adelante, pero espero que pueda modificar mi código y crear sus propias reglas del juego: díganos qué piensa en los comentarios, para que todos podamos descargar tus creaciones! Como siempre, estaré aquí para responder a sus preguntas y defender mis horrendas habilidades de codificación..

Crédito de la imagen: coordenadas cartesianas - usuario de Wikimedia Sakurambo




Nadie ha comentado sobre este artículo todavía.

Sobre tecnología moderna, simple y asequible.
Tu guía en el mundo de la tecnología moderna. Aprenda a usar las tecnologías y los dispositivos que nos rodean todos los días y aprenda a descubrir cosas interesantes en Internet.