Si queremos dividir el espectro visible en un número limitado de colores (por ejemplo, 3, 5, 7 y 13), ¿cuál es la mejor manera de elegir qué valores de color RGB utilizar?
Cuando estás trabajando en un proyecto electrónico, las (aparentemente) pequeñas cosas pueden ser las más intimidantes. Por ejemplo, tome mi impresionante artefacto audio-reactivo actual. La última vez que miré esto, pude obtener un efecto de arco iris de primer paso que circulaba a través de tubos que no funcionaban divididos en 13 grupos (columnas).
Efecto arcoíris de primer paso (Fuente: Max Maxfield)
Mientras esté aquí, observe los botones rojos y amarillos en el panel frontal. También hay un botón verde entre ellos, pero está oculto por el asa de cuero en esta toma, así que no puedes verlo.
El siguiente paso es agregar un micrófono MEM para proporcionar una entrada de audio, conectarlo al analizador de espectro de audio MSGEQ7 (consulte Consejos y trucos para usar el analizador de espectro MSGEQ7) y usar la salida del MSGEQ7 para controlar la amplitud del audio. CONDUJO.
En una columna futura, discutiré algunas opciones para los micrófonos MEM.Por ahora, yo Placa de conexiones INMP401 Viene de SparkFun y funciona muy bien. Bueno, está funcionando muy bien ahora. Para ser honesto, debo decir que al principio estaba un poco decepcionado con los resultados, pero resultó que esto se debió a una falla en mi código.
Los valores de las 7 bandas de frecuencia que salen de MSGEQ7 se almacenan en una matriz llamada “FreqBands”.[]Estos valores varían de 0 a 1023, por lo que en algún momento deben volver a escalarse a un rango de 0 a 255 para cumplir con los requisitos del modulador de ancho de pulso (PWM) que controla los LED.
Debido al hecho de que normalmente estamos rodeados de bajos niveles de ruido de fondo, la parte analógica de este circuito es inherentemente ruidosa, por lo que declaramos un valor constante llamado MSGEQ7_FLOOR, que actualmente está establecido en 80. fondo. Cualquier valor inferior a esto se restablecerá a 0. Esto es para eliminar el parpadeo de bajo nivel causado por el ruido. Basado en esto, el primer código de acceso para las funciones del preprocesador se veía así:

Funciones del preprocesador Firstpass (Fuente: Max Maxfield)
Como puedes ver hay dos pasos. Primero elimine el ruido y luego vuelva a escalar los valores. Comencemos con el filtrado de ruido. ¿Puedes detectar el primer error obvio?
No toma mucho tiempo darse cuenta de que la parte “(FreqBands[iBand>=0)”delainstrucción”if”esredundanteEstosedebeaquesolonecesitamosverificarsielvalorleídodeMSGEQ7esmenorqueMSGEQ7_FLOOREncuantoalcambiodeescalasimplementecambielosvaloresdefrecuenciaaladerechaen2bitsEstoeslomismoquedividirelvalordelafrecuenciapor4Estoconviertelosvaloresentre0y1023alosvalorescorrespondientesentre0y255[iBand>=0)”partedeladeclaración“si”esredundanteporquetodoloquedebemoshacerescomprobarsielvalorqueseleedelMSGEQ7esmenorquenuestroMSGEQ7_FLOORCuandosetratadeescalartodoloquehacemosescambiarlosvaloresdefrecuenciadosbitsaladerechaqueeslomismoquedividirlosporcuatroconvirtiendoasínuestrosvaloresde0a1023ensuscontrapartesde0a255[iBand>=0)」の部分が冗長であることを理解するのにそれほど時間はかかりません。これは、MSGEQ7から読み取った値がMSGEQ7_FLOORより小さいかどうかを確認するだけでよいためです。再スケーリングに関しては、周波数値を2ビット右にシフトするだけです。これは、周波数値を4で割ることと同じです。これにより、0~1023の値が対応する0~255の値に変換されます。[iBand>=0)”partofthe“if”statementisredundantbecauseallweneedtodoischeckwhetherthevaluewereadfromtheMSGEQ7islessthanourMSGEQ7_FLOORWhenitcomestorescalingallwedoistoshiftthefrequencyvaluestwobitstotherightwhichisthesameasdividingthembyfourtherebyconvertingour0to1023valuesintotheir0to255counterparts
Lamentablemente, los resultados no fueron en absoluto lo que estaba buscando, en cambio, cuando el tubo se encendió, cobró vida con una intensidad bastante fuerte. Nuevamente, ¿puedes detectar el error obvio?
Después de pensar un poco, se encendió una bombilla en mi cabeza y me di cuenta de lo que estaba mal, como se muestra en (a) a continuación.

Evolución del algoritmo (Fuente: Max Maxfield)
Recuerde que mi valor MSGEQ7_FLOOR actualmente está establecido en 80 y todos los valores por debajo de este se restablecen a 0. caso). Como resultado, cualquier valor por encima del valor mínimo, por pequeño que sea, tiene una intensidad mínima de 20, que es muy brillante para un LED.
La respuesta es tener solo un valor de 0 correspondiente a cualquier cosa por debajo del nivel MSGEQ7_FLOOR, tomar todo desde MSGEQ7_FLOOR a 1023 y convertir estos valores de 1 a 255, como se muestra en (b) de la imagen de arriba. a la gama de Lleno de entusiasmo, reescribí el algoritmo como se muestra a continuación.

Algoritmo modificado (Fuente: Max Maxfield)
Estoy seguro de que estás cansado de leer esto. Ciertamente estoy cansado de escribir esto, pero de nuevo, ¿puedes detectar el error obvio?
Sinceramente, me tomó años encontrar esta pequeña estafa yo mismo. Realmente no me registró porque estaba tan ocupado disfrutando de la mayor capacidad de respuesta en el extremo inferior que perdí algo de brillo en el extremo superior. Implementamos el cambio de escala como parte del mapeo realizado, por lo que ya no necesitamos hacer una “divide por 4” al final de la función. Al mantener esto, reduje la fuerza a 1/4 de lo que debería haber sido. “Argggggh” es todo lo que puedo decir (y lo digo de todo corazón).
Dicho todo esto, nada de lo anterior es lo que pretendía decirte (te advierto, enróllame y mírame ir).
Así que voy a experimentar con diferentes esquemas de modulación y visualización. Me gustaría poder dividir los tubos en diferentes números de grupos, excepto por el efecto de arco iris deslizante que cubriré con más detalle en una columna futura. El escenario más simple es hacer coincidir la forma en que los tubos se dividen físicamente en tres grupos, como se muestra a continuación.

Dividiendo los tubos en grupos de 3 (arriba) y 13 (abajo) (Fuente: Max Maxfield)
También planeé subdividir los tubos en grupos lógicos de 5 y 7, pero salté a los 13 grupos usados para implementar el efecto de arco iris deslizante, como se muestra arriba.
En este punto, tuve una epifanía (no te preocupes, llevaba ropa holgada). Es mucho más fácil comenzar con 13 grupos y luego “trabajar hacia abajo” que comenzar con solo tres grupos y poco a poco “trabajar hacia arriba”. Abajo:

Se utilizaron 13 grupos para generar mapeos de 3, 5 y 7 grupos (Fuente: Max Maxfield)
Para ser honesto, la parte más lenta de este proceso fue decidir qué valores de color usar. Esto puede parecer intuitivamente obvio, pero me he estado rascando la cabeza por un tiempo. Finalmente, dibujamos ‘cajas’ vacías que representan los 13 grupos y colocamos espectros en ellas, como se muestra a continuación.

Selección de color: 13 grupos y espectros (Fuente: Max Maxfield)
Un punto a tener en cuenta es que desea que todos sus colores iniciales sean lo más brillantes posible. Esto significa usar el mayor valor posible. Esto se debe a que sabemos que la modulación de audio reduce la intensidad.
El primer paso fue asignar los colores primarios rojo, verde y azul. Esto puede parecer una obviedad, pero si observa el espectro de arriba, verá que el tono rojizo domina el lado izquierdo y el verde está a la derecha del centro.

Selección de color: colocación de colores primarios (Fuente: Max Maxfield)
Luego asigné las posiciones de color secundario para amarillo, cian y rosa intenso. Cada color se produce mezclando dos colores primarios. Después de mover las cosas de un lado a otro por un tiempo, terminé con el arreglo que se muestra a continuación:

Elección de color: Colocación secundaria (Fuente: Max Maxfield)
Como puede ver, hay dos ranuras abiertas entre el rojo y el amarillo, y otras dos ranuras entre el amarillo y el verde. A continuación, abra solo las ranuras individuales entre verde y cian, cian y azul y azul y rosa fuerte. 0x00 está completamente apagado (0 %) y 0xFF está completamente encendido (100 %), por lo que en lugar de intentar crear un tono neutral a partir del espectro, puede combinar los valores de 0xFF con 0. Decidí generar Valores de ×80 (50%) y 0×C0 (75%) como se muestra a continuación:

Selección de color: llene las ranuras restantes (Fuente: Max Maxfield)
Para ser honesto, estoy bastante contento con la forma en que parece funcionar todo esto (aunque no lo supieras). El paso final es asignar las selecciones de color a los distintos grupos, como se muestra a continuación.

Asignación de opciones de color a diferentes grupos (Fuente: Max Maxfield)
Tenga en cuenta que lo anterior es solo un punto de partida. No sabrá si le gustan las opciones de color anteriores hasta que las vea en persona. La forma en que esto está configurado le permite cambiar el color de todos los bloques dentro de un grupo (por ejemplo, los 5 bloques verdes a la derecha del ‘grupo de 3’ en la imagen de arriba) con una sola declaración ‘#define’ cambiando el Grabaré un video y proporcionaré el código para todo esto en una columna futura (una vez que funcione).
Comience modulando todos los tubos del grupo con el mismo valor de amplitud, como se explicó anteriormente. Más tarde, experimente cambiando la fuerza de los tubos en cada grupo de adelante hacia atrás. Es decir, primero se enciende la primera fila de tubos, luego la segunda fila, la tercera fila y así sucesivamente.
Por supuesto, esto es un poco más complicado ya que los diferentes grupos tienen diferentes números de tubos y los propios tubos están dispuestos en diferentes pseudocolumnas, pero creo que tengo un plan inteligente para lidiar con todo esto. De hecho, este es un plan muy astuto. que puedes sacar la cola y llamarlo comadreja (perdón, víbora negra), pero dejaré esa explicación para una próxima columna. Mientras tanto, como siempre, agradecemos sus comentarios, preguntas y sugerencias.