Esquema: LEDs
Los LEDs requieren un poco de explicacion. Debido a que el Arduino no tiene suficientes salidas para todos los LEDs necesarios (9), el proyecto utiliza una tecnica llamada CharliePlexing.
https://en.wikipedia.org/wiki/Charlieplexing
Charelieplexing es un tipo de multplexacion que aprovecha los tres estados que puede tener un pin del Arduino (HIGH, LOW y configurado como INPUT). Asi con N pins se consigue controlar Nx(N-1) LEDs. En nuestro caso, con 4 pins podemos controlar 12 LEDs, aunque solo utilizaremos 9.
Charlieplexing tiene algunas limitaciones importantes. Va muy bien cuando solo un LED esta encendido a la vez, pero cuando varios LEDs se tienen que encender a la vez...
-Las resistencias limitadoras son compartidas entre LEDs. Si son de colores diferentes o si varios LEDs estan activos al mismo tiempo, puede haber diferencias de luminosidad entre LEDs importantes
-No todas las combinaciones de LEDs son posibles. Asi que esto nos obliga ademas a hacer multiplexacion en el tiempo y utilizar el efecto POV para simular que los LEDs estan encencidos a la vez.
Para manejar todo esto, el codigo utiliza la libreria
Chaplex incluida en el paquete. Esta libreria permite manejar facilmente todo el proceso, puesto que al principio hay que definir las conexiones de cada LED, y luego durante el codigo solo hay que cambiar el estado de cada LED con una funciona dedicada. Ejemplo:
myCharlie.ledWrite(myLeds[3], ON);
La multiplexacion de LEDs en este proyecto tiene algunos efectos negativos. El problema es que cada vez que cambiamos de canal, el KATANA manda un "dump" de parte de la memoria via USB, y esto lo utilizamos para analizar el preset y saber que efectos estan conectados/desconectados. Este proceso se come gran parte de la capacidad del Arduino, y tal y como esta montado el codigo, la prioridad la tiene el USB. Asi que durante este parsing de datos, los LEDs tienen baja prioridad y hacen su parpadeo demasiado lento, y se pierde el efecto POV. Algo parecido para al utilizar los pedales de expresion.
Quizas se podria mejorar el codigo con alguna interrupcion para evitar esto, pero de momento es un efecto negativo que hay.
Por eso, si tuviera que empezar ahora el proyeco de nuevo, no utilizaria Charlieplexing, y en su lugar utilizaria o bien un shift register, o bien un extender de E/S.