Programar su 4x4x4 arduino llevó cubo para hacer más materia impresionante
La semana pasada yo construido un cubo de LED - 64 LEDs que se puede programar para hacer fantásticos espectáculos de luz futuristas - y espero que tú también, porque es un gran proyecto para motivar y expandir su conjunto de habilidades Arduino. Os dejo con un par de aplicaciones básicas para hacerle pensar, pero hoy voy a estar presentando unos cuantos trozos de software que hice para el cubo, junto con las explicaciones de código. El propósito de esto es tanto para darle un poco de luces más bonitas para correr, sino también para aprender acerca de algunas de las limitaciones de la programación del cubo, y aprender algunos nuevos conceptos de programación en el proceso.Cómo hacer un cubo pulsante Arduino LED que se ve como si viniera de The FutureCómo hacer un cubo pulsante Arduino LED que se ve como si viniera de The FutureSi ha incursionado con algunos proyectos de Arduino para principiantes, pero está buscando algo un poco más permanente y en otro nivel de impresionante, entonces el humilde cubo de LED de 4 x 4 x 4 es ...Lee mas
Esto es cierto coding- bastante avanzada que realmente necesita haber leído toda mi anterior tutoriales Arduino y nuestro Guía para principiantes de Arduino antes de personalizar el código proporcionado.
Aplicación 1: Mini serpiente
En lugar de ejecutar una secuencia de patrón de serpiente conjunto, quería programar una serpiente - uno artificial que lo harían las propias decisiones al azar, y ser completamente impredecible. Es limitada a sólo 2 segmentos, que explicaré más adelante, y se puede ver debajo de la demostración. Descargar el código completo aquí.
Cuando se trata de un espacio 3D, necesita 3 coordenadas para un único punto: X, Y, y Z.
Sin embargo, en nuestro cubo, los X y Z aviones están representados por pasadores de LED, mientras que el Y se mapea directamente a los planos de cátodo. Para facilitar el trabajo con estas coordenadas y averiguar el movimiento alrededor del cubo, que, por lo tanto creado un nuevo tipo de datos (Usando struct) para representar un único punto en el cubo - que he llamado “XYZ”. Se compone de sólo dos números enteros: “xz”, e “y”. Con esta estructura, pude entonces también representan una dirección, se indica a continuación en nuestro sistema (xz, y) coordinar especial:
movimiento Y (arriba abajo): (Xz, y + 1), (xz, y-1)
Z movimiento (Hacia adelante, hacia atrás): (Xz-1, y), (xz + 1, y)
movimiento X (izquierda derecha): (Xz + 4, y), (XZ-4, y)
Por ejemplo, para mover la posición del LED en (0,0) uno a la izquierda, aplicamos (Xz + 4, y) y terminar con (0,4).
Hay ciertos límites que pueden colocar en movimiento - a saber, que las coordenadas Y sólo puede ser una posible 0 a 3 (Siendo 0 la capa inferior, 3 siendo la parte superior), y las coordenadas XZ sólo podía haber 0 a 15. Un límite adicional se coloca en el movimiento Z para evitar el “salto” de la parte trasera a la parte delantera del cubo, y viceversa. En este caso, se utiliza la función de módulo para la prueba de múltiplos de 4 y negar que el movimiento intento. Esta lógica se está representado en el válido() función, que devuelve un cierto si la dirección propuesta es un movimiento aceptable, y falso en caso contrario. 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 se vaya hacia atrás sobre sí mismo, incluso si es de otra manera una ubicación válida para mover a - y una movimiento() función, que tiene 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 presentar en las descargas. Si usted se pregunta por qué esto fue puesto en un archivo independiente en lugar del archivo de programa principal, que es debido a algunas reglas complicadas compilador de Arduino que impiden las funciones de devolver tipos de datos personalizados- tienen que ser colocados en su propio archivo, y luego importados en el inicio del archivo principal.
De vuelta en el archivo principal de ejecución, una serie de direcciones almacena todos los posibles movimientos de la serpiente puede YOLIOZU podemos simplemente elegir un miembro de la matriz al azar para obtener una nueva dirección. Las variables también se crean para almacenar la ubicación actual (hoy), el anterior dirección y el anterior ubicación. El resto del código debería ser bastante obvio para usted- apenas For bucles y encender y apagar LEDs. En el bucle principal, comprobamos para ver si la dirección propuesta es válida, y si es entonces vamos de esa manera. Si no es así, elegimos una nueva dirección.
La única cosa a destacar en el bucle principal es algunas comprobaciones para corregir un error que encontré que implica la multiplexación: si la nueva ubicación era en el mismo plano cátodo o ánodo mismo pin, apagando el LED anterior resultaría en tanto salir. Es también en este momento cuando me di cuenta de que va más allá de una serpiente 2 segmento iba a ser imposible con mi implementación actual: tratar de iluminar 3 LEDs en una disposición de esquina. Puede que no, porque con 2 capas y 2 pines LEDs Actived, 4 LED se encendía, no 3. Este es un problema inherente con nuestro diseño de cubo de multiplexado limitado, pero que no se preocupe: simplemente hay que usar el poder de persistencia de la visión reescribir el método de sorteo.
Persistencia de la visión significa que cuando la luz llega a nuestros ojos de forma secuencial - más rápido que podamos procesarla - que parece ser una sola imagen. En nuestro caso, en lugar de dibujar las cuatro capas al mismo tiempo, debemos señalar a la primera, desactivarlo, dibujar el segundo y desactivarlo: más rápido de lo que podemos decir cualquier cambio es aún ocurriendo. Este es el principio en el que por escritores de mensajes funcionan, como éste:
Nuevo método Draw Uso de la persistencia de la visión
En primer lugar entonces, una nueva rutina de empate. He creado una 4 x 16 matriz bidimensional de bits (verdaderas o falsas) ser una representación literal del estado de cubo del LED. La rutina sorteo implementará persistencia de la visión simplemente interactuando sobre esto y el lavado de cada capa al cubo por un breve momento. Se va a continuar a dibujarse a sí mismo en el estado actual hasta que haya transcurrido el tiempo de refresco, momento en el que vamos 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 sólo quiere saltar a programar sus propios juegos y tal entonces no dude en utilizar esto como una base.
Aplicación 2: Juego de la Vida
Por ahora, vamos a desarrollar esto en una versión básica de Juego de Conway de la vida. Para aquellos de ustedes que no están familiarizados (Intente buscar en Google para encontrar una animación huevo de Pascua impresionante), el Juego de vida es un ejemplo de un autómata celular que crea un patrón de comportamiento emergente fascinante dado sólo unas pocas reglas simples.
https://youtube.com/embed/XcuBvj0pw-E
Este es, por ejemplo, cómo las hormigas parecen moverse con inteligencia y una mente colmena, a pesar del hecho biológico real que sólo tiene que seguir las reglas hormonales muy básicas. Aquí está el código completo para su descarga: pulse el Reiniciar botón para reiniciar. Si usted se encuentra el conseguir el mismo patrón una y otra vez, intenta mantener pulsado el botón de reposo durante más tiempo.
https://youtube.com/embed/iBnL8pulJ
Estas son las reglas del juego de la vida:
- Cualquier célula viva con menos de dos vecinos vivos muere, como si causada por la subpoblación.
- Cualquier célula viva con dos o tres vecinos vivos vive a la siguiente generación.
- Cualquier célula viva con más de tres vecinos vivos muere, como si por el hacinamiento.
- Cualquier célula muerta con exactamente tres vecinos vivos se convierte en una célula viva, como si por reproducción.
Ejecutar el código. Se dará cuenta dentro de 5 a 10 “generaciones”, los autómatas probablemente han llegado a un descanso, estabilizador sobre un determinado posición- veces este patrón estable va a cambiar la ubicación y el cambio en el tablero. En raros casos, pueden incluso han desaparecido por completo. Esta es una limitación de tener sólo LED 4x4x4 para trabajar, pero es un buen ejercicio de aprendizaje de todos modos.
Para explicar el código:
- Es posible que no estén familiarizados con memcpy () función. He utilizado esto para guardar el estado del juego anterior, como matrices no sólo pueden ser asignados a uno al otro como variables normales - tienes que copiar en realidad a través del espacio de memoria (en este caso, 64 bits).
- howManyNeighbours () función debe explica por sí mismo, pero en caso de que no es - este método toma una única coordenada, y corre a través de cada vecino posible (la misma gama de direcciones que previamente usados en aplicación serpiente), para verificar si son válidas. A continuación, comprueba si esos LEDs vecinos eran ‘activada` en el estado del juego anterior, y cuenta cuántos son.
- La función principal de este juego de aplicación 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 probar la adición de un cheque que se restablece automáticamente el tablero después de 5 o más generaciones de la misma pauta. a continuación, por favor hágamelo saber! También me gustaría sugerir intentar añadir la metodología POV al juego de la serpiente para hacer posible una serpiente de esperar más tiempo.
Eso es todo de mí hoy. Puedo revisar algunos más aplicaciones cubo Arduino LED en un momento posterior, pero es de esperar que debería estar en condiciones de modificar mi código y crear sus propias reglas de juego: háganos saber lo que te ocurrió en los comentarios, para que todos podamos descarga sus creaciones! Como siempre, voy a estar aquí para responder a sus preguntas y defender mis capacidades de codificación horrendos.