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

La semana pasada, construí un cubo LED - 64 LED que puedes programar para hacer fantásticos espectáculos de luces futuristas - y espero que tú también lo hayas hecho, porque es un gran proyecto para motivarte y ampliar tu conjunto de habilidades de Arduino. Te dejé con algunas aplicaciones básicas para que pensaras, pero hoy presentaré algunas partes más del software que hice para el cubo, junto con las explicaciones del código.

La semana pasada, construí un cubo LED - 64 LED que puedes programar para hacer fantásticos espectáculos de luces futuristas - y espero que tú también lo hayas hecho, porque es un gran proyecto para motivarte y ampliar tu conjunto de habilidades de Arduino.  Te dejé con algunas aplicaciones básicas para que pensaras, pero hoy presentaré algunas partes más del software que hice para el cubo, junto con las explicaciones del código.
Anuncio

cubo led arduino La semana pasada, construí un cubo de LED Cómo hacer un cubo de LED Arduino pulsante que parece venir del futuro Cómo hacer un cubo LED de Arduino que parece venir del futuro Si has incursionado en algunos proyectos para principiantes de Arduino, pero están buscando algo un poco permanente y en un nivel completamente diferente, entonces el humilde cubo de 4 x 4 x 4 LED ... Leer más - 64 LED que puedes programar para hacer fantásticos shows de luces futuristas - y yo Espero que lo haya hecho también, porque es un gran proyecto para motivarlo y ampliar su conjunto de habilidades de Arduino. Te dejé con algunas aplicaciones básicas para que pensaras, pero hoy presentaré algunas partes más del software que hice para el cubo, junto con las explicaciones del código. El propósito de esto es tanto ofrecerle espectáculos de luces más bonitos, como también aprender sobre algunas de las limitaciones de la programación del cubo, y aprender algunos conceptos de programación nuevos en el proceso.

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

Aplicación 1: Mini Snake

En lugar de ejecutar una secuencia de patrones en forma de serpiente, quería programar una serpiente, una artificial que haría sus propias elecciones al azar, y sería completamente impredecible. Está limitado a 2 segmentos solamente, lo cual 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.

cubo led arduino

Sin embargo, en nuestro cubo, los planos X y Z están representados por pines LED, mientras que el Y está directamente asignado a los planos del cátodo. Para facilitar el trabajo con estas coordenadas y descubrir el movimiento alrededor del cubo, creé un nuevo tipo de datos (usando struct) para representar un único punto en el cubo, que llamé "xyz". Consta de solo dos enteros: "xz" e "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)
Movimiento Z (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 terminamos con (0, 4) .

Hay ciertos límites que se ponen en el movimiento, a saber, que las coordenadas Y solo pueden ser 0 a 3 posibles (0 es la capa inferior, 3 es la parte superior) y las coordenadas XZ solo pueden ser de 0 a 15 . Se coloca un límite adicional en el movimiento Z para evitar "saltar" de la parte posterior al frente del cubo, y viceversa. En este caso, usamos la función de módulo para probar múltiplos de 4 y negamos ese intento de movimiento. Esta es la lógica que se representa en la función válida (), que devuelve un valor verdadero si la dirección propuesta es un movimiento aceptable, y de lo contrario es falsa. Agregué una función adicional para verificar una dirección inversa, es decir, si la serpiente se dirige en una dirección, no queremos que retroceda sobre sí misma, incluso si es una ubicación válida para moverse hacia ella, y una función move (), que toma una coordenada, una dirección y devuelve la nueva coordenada.

El tipo de datos XYZ, las funciones valid (), move () e inverse () se pueden encontrar en el archivo xyz.h en las descargas. Si se pregunta por qué se colocó este archivo en un archivo separado en lugar del archivo principal del programa, se debe a algunas reglas complicadas del compilador Arduino que impiden que las funciones registren tipos de datos personalizados ; deben colocarse en su propio archivo y luego importarse al comienzo del archivo principal.

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

Lo único que se debe señalar en el ciclo principal son algunas comprobaciones para corregir un error que encontré que involucra multiplexación: si la nueva ubicación estaba en el mismo plano de cátodo o el mismo pin de ánodo, apagar el LED anterior resultaría en que ambos salieran. También en este punto me di cuenta que ir más allá de una serpiente de 2 segmentos iba a ser imposible con mi implementación actual: intente encender 3 LED en una disposición de esquina. No se puede, porque con 2 capas y 2 LED activados, se encenderán 4 LED, no 3. Este es un problema inherente a nuestro diseño limitado de cubos multiplexados, pero no se preocupe: simplemente necesitamos usar el poder de la persistencia. de visión para reescribir el método de sorteo.

La persistencia de la visión significa que cuando la luz llega a nuestros ojos de forma secuencial, 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, deberíamos dibujar la primera, desactivarla, dibujar la segunda y desactivarla: más rápido de lo que podemos ver, cualquier cambio está ocurriendo. Este es el principio por el cual funcionan los escritores de mensajes, como este:

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

Primero que nada, una nueva rutina de sorteo. Creé una matriz de bits bidimensional de 4 x 16 (verdadera o falsa) para que sea una representación literal del estado del cubo de LED. La rutina de sorteo implementará la persistencia de la visión simplemente iterando sobre esto y vaciando cada capa del cubo por un breve momento. Continuará dibujándose en el estado actual hasta que haya transcurrido el tiempo de actualización, momento en el que pasaremos el control al bucle principal (). He guardado esta sección del código en este archivo LED_cube_POV, así que si quieres saltar a la programación de tus propios juegos, siéntete libre de usar esto como base.

App 2: Juego de la vida

Por ahora, desarrollemos esto en una versión básica de Game of Life de Conway. Para aquellos de ustedes que no están familiarizados (intente buscar en Google para encontrar una impresionante animación de huevos de Pascua), el Juego de la vida es un ejemplo de autómatas celulares que crea un patrón fascinante de comportamiento emergente dado solo unas pocas reglas simples.

http://www.youtube.com/watch?v=XcuBvj0pw-E

Esto es, por ejemplo, cómo las hormigas parecen moverse con inteligencia y una mente colmena, a pesar del hecho biológico de que realmente solo siguen reglas hormonales muy básicas. Aquí está el código completo para descargar: presione el botón de reinicio para reiniciar. Si se encuentra obteniendo el mismo patrón una y otra vez, intente mantener presionado el botón de reposo durante más tiempo.

http://www.youtube.com/watch?v=iBnL8pulJ

Estas son las reglas del Juego de la Vida:

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

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

Para explicar el código:

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

Mejoras : he pasado demasiado tiempo hasta ahora, pero es posible que desee intentar agregar un cheque que reinicie automáticamente el tablero después de 5 generaciones del mismo patrón. ¡por favor, házmelo saber! También me gustaría sugerir que se agregue la metodología POV al juego de serpientes para hacer posible una serpiente más larga.

Eso es todo por mí hoy. Quizás vuelva a visitar algunas aplicaciones de cubo LED Arduino más adelante, pero espero que usted esté en posición de modificar mi código y crear sus propias reglas del juego: díganos qué se le ocurre en los comentarios, para que podamos descargarlo todo. tus creaciones! Como siempre, estaré aquí para responder sus preguntas y defender mis horrendas habilidades de codificación.

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

In this article