Paso 5: Software
La tira LED del Radio Shack viene con un enlace para probar el código para el Arduino. Esto formó la base del programa adjunto, sin embargo la versión de Radio Shack utiliza un conjunto duro codificado de patrones y la modificación de estos patrones es mucho trabajo para poco resultado.
He creado un nuevo método para conducir la tira que tiene dos componentes:
- colores - matriz de RBG (rojo verde azul)
- Illum - gama de intensidades de magnitudes (% 0.0 = 0 = OFF, 100 = 1.0% = ON completo)
Esto le permite generar una gama más dinámica de patrones rápidamente sin tener que especificar toda la información cada secuencia. Sólo multiplica cada componente del valor hexadecimal de RBG por la magnitud y unidad la tira (se realiza en la función light_strip()).
Breve desviación hacia cómo funciona el código de LED de bajo nivel
El código realmente manejar los bits a la tira de LED en la función send_strip() no necesita ser modificado, pero si eres curioso sobre lo que está sucediendo con el código para manejar el LED, leyendo...
Aquí está el enlace a archivos de soporte de Radioshack para franja TriColor que contiene la hoja de datos para la tira de LED. Esta tira se trabaja sobre el protocolo de TM1803 que es de 24 bits para definir un color (8 bits Red, 8 bits, azul, verde de 8 bits). Un segmento de la tira uno recibe 24 bits, los datos siguiente pasará sobre el segmento y pasar al segmento siguiente. De esta manera el primer tramo de impulsión de 24 bits 1, el próximo 24 bits son para el segmento 2, etc....
Para realmente transmitir los bits, verá para microsegundos 0,78 0 que necesita configurar el pin de datos a alto (1 lógico) y luego ajuste el pin de datos a bajo (0 lógico) de 1,55 microsegundos. Para conducir un poco 1 necesita el momento opuesto, alto por 1,55 microsegundos y baja de 0,78 microsegundos.
Por ejemplo que si quisieras enviar un valor de 0110 en binario, lo haría real necesario transmitir
ALTO de 0.78us, baja 1.55us, alta de 1.55us, baja 0.78us, alto de 1.55us, baja 0.78us, alto de 0.78us, bajo para 1.55us
¿Cómo se logra esto en el código, en la función de send_strip()?
El código coloca sobre todos los 24 bits, y basados en si cada bit es 1 o 0 se realiza una operación diferente. Tomemos por ejemplo 1, el código ejecuta en primer lugar DATA_1 que establece el pin de salida en alto, luego no realiza 28 operación (nop) Instrucciones de montaje. La Arduino Uno posee una velocidad de reloj de 16 MHz, lo que significa que cada instrucción está terminando en un tiempo aproximado 62,5 nanosegundos. Así el códigos no-28 ops tendrá 28 veces 62,5 nanosegundos para completar, que es 1750 nanosegundos = 1,75 microsegundos. Esto es un poco sobre el 1.55us tiempo que estamos buscando, pero está bien debido a que la operación de DATA_1 no termina inmediatamente en el momento en el primer nop es golpeado, así que básicamente el primer pareja nop no cuenta hacia el tiempo de una la señal es alta. Para desarrollar código así idealmente usaría un oscilliscope para agregar o quitar declaraciones nop y midiendo el tiempo resultante en oscilliscope, hasta llegar a ese 1.55us punto en la hoja de datos.
Por suerte la mayoría de las tiras de LED tienen las bibliotecas de Arduino que ha ya averiguado esto para el usuario, pero sigue siendo bueno saber cómo el código alcanza el calendario en la hoja de datos.
Reflexiones finales
Te he comentado el código lo suficientemente bien que no entraré en más los detalles sobre cómo funciona, pero como mencioné anteriormente, creo que la idea de crear patrones de luz más interesantes sería una gran manera de aprender algunos simple codificación y depuración de habilidades.
El flujo general del programa es:
- Arranque el Arduino
- Esperar para el movimiento
- Dibujar un arco iris
- Dibujar patrones más 20
- Reiniciar el programa
Buena suerte y disfruta! Si te ha gustado el Instructable, amo su voto para el concurso de creación de código.