Programación de su Arduino 4x4x4 LED Cube para hacer algunas cosas más impresionantes
La semana pasada, construí un cubo de LED Cómo hacer que un cubo de Arduino LED pulsante que parece que vino del futuro Cómo hacer un cubo de Arduino LED que pulsa que parece que vino del futuro Si has incursionado con algunos proyectos principiantes de Arduino , pero están buscando algo un poco permanente y en otro nivel impresionante, entonces el humilde cubo LED de 4 x 4 x 4 es… Leer más - 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 ampliar tu conjunto de habilidades de Arduino. Te dejé con algunas aplicaciones básicas para que pienses, pero hoy presentaré algunas partes más del software que hice para el cubo, junto con explicaciones de códigos. El propósito de esto es darte más shows de luces bonitas para correr, pero también conocer algunas de las limitaciones de la programación del cubo, y aprender algunos nuevos conceptos de programación 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 para principiantes de Arduino antes de personalizar el código provisto.
Aplicación 1: Mini Snake
En lugar de ejecutar una secuencia de patrones tipo serpiente, quería programar una serpiente, una artificial que haría sus propias elecciones al azar y sería completamente impredecible. Se limita a 2 segmentos solamente, lo que explicaré más adelante, y puede ver la demostración a continuación. Descarga 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 clavijas LED, mientras que la Y se asigna directamente a los planos del cátodo. Para facilitar el trabajo con estas coordenadas y determinar el movimiento alrededor del cubo, creé un nuevo tipo de datos (usando struct) para representar un solo punto en el cubo, al que llamé “xyz”. Se compone de sólo dos enteros: “xz”, y “y”. Con esta estructura, también podría representar una dirección, que se indica 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 pueden poner en movimiento, a saber, que las coordenadas Y solo pueden ser una posible 0 a 3 (0 es la capa inferior, 3 es la superior), y las coordenadas XZ solo pueden ser 0 a 15. Un límite adicional se coloca en el movimiento Z para prevenir “saltando” 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 negar ese intento de movimiento. Esta lógica está representada en el válido() función, que devuelve un verdadero si la dirección propuesta es un movimiento aceptable y, de lo contrario, es falso. He añadido una función adicional para comprobar si hay una 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 hacia y - 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() funciones se pueden encontrar en el xyz.h Archivo en las descargas. Si se pregunta por qué se colocó 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 devolviendo tipos de datos personalizados; deben colocarse en su propio archivo y luego importarse al inicio del archivo principal.
De vuelta en el archivo de tiempo de ejecución principal, una serie de direcciones almacena todos los movimientos posibles que la serpiente puede hacer; simplemente podemos elegir un miembro de una matriz aleatoria 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 debe ser bastante obvio para usted; solo For bucles, y encender y apagar los LEDs. En el bucle principal, verificamos si la dirección propuesta es válida, y si es así, seguimos ese camino. Si no, elegimos una nueva dirección..
Lo único que se debe señalar en el bucle principal son algunas comprobaciones para corregir un error relacionado con la multiplexación: si la nueva ubicación estaba en el mismo plano del cátodo o en el mismo pin de ánodo, apagar el LED anterior provocaría que ambos se apagaran. También en este punto me di cuenta de 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 pines y 2 pines LED activados, 4 LED se encenderían, 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 imagen única. 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 decir, cualquier cambio está sucediendo. Este es el principio por el cual trabajan los escritores de mensajes, como este:
Nuevo método de dibujo usando la persistencia de la visión
Primero que nada, una nueva rutina de sorteo. He creado un 4 x 16 matriz bidimensional 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 expulsando 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 que devolveremos 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 programar tus propios juegos, no dudes en utilizarlo 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 (Intenta con Google para encontrar una impresionante animación de huevos 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.
Esto es, por ejemplo, cómo las hormigas parecen moverse con inteligencia y con una mente de 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.
Aquí están 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 en la próxima generación.
- Cualquier celda viva con más de tres vecinos vivos muere, como si fuera hacinamiento.
- Cualquier célula muerta con exactamente tres vecinos vivos se convierte en una célula viva, como por reproducción.
Ejecutar el código. Te darás cuenta dentro de 5 a 10 “generaciones”, los autómatas probablemente hayan llegado a un descanso, estabilizándose en cierta 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 es un buen ejercicio de aprendizaje de todos modos.
Para explicar el código:
- Puede que no esté familiarizado con memcpy () función. Lo he usado para guardar el estado del juego anterior, ya que las matrices no pueden asignarse unas a otras como variables normales; en realidad, tiene que copiar en el espacio de la memoria (en este caso, 64 bits).
- HowManyNeighbours () La función debe explicarse por sí misma, pero en caso de que no lo sea, este método toma una sola coordenada y recorre cada posible vecino (el mismo conjunto de direcciones que usamos anteriormente en la aplicación snake), para verificar si son válidas. A continuación, comprueba si los LED vecinos estaban "encendidos" en el estado del juego anterior, y cuenta cuántos hay.
- La función principal de esta aplicación de Juego de la Vida 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 reinicie automáticamente el tablero después de aproximadamente 5 generaciones del mismo patrón. entonces por favor hágamelo saber! También sugiero tratar de 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 de las aplicaciones de Arduino LED cube en un momento posterior, pero espero que pueda modificar mi código y crear sus propias reglas de juego: háganos saber qué ha encontrado en los comentarios, para que todos podamos descargar tus creaciones! Como siempre, estaré aquí para responder tus preguntas y defender mis horrendas habilidades de codificación..
Crédito de la imagen: coordenadas cartesianas - Usuario de Wikimedia Sakurambo
Explorar más sobre: Arduino.