Go Down

Topic: Luces RGB (Read 2344 times) previous topic - next topic

IgnoranteAbsoluto

Si son solo ocho no creo que sea problemático. Ya tendrás noticias mías con una posible implementación para los neopilxels.

OrnyTorrynKo

Perfecto, muchas gracias compañero!

IgnoranteAbsoluto

Aquí está la versión para el LED RGB con la opción de color aleatorio y, ya de paso, apagar todo con un sólo carácter. Para la próxima voy a ver qué se puede hacer con los neopixel.

Los nuevos comandos son:
X establece un color aleatorio y cada cuánto tiempo se ha de cambiar aleatoriamente en centésimas de segundo (de 0 a 999). Si el tiempo es 0 para los cambios si había tiempo establecido, si no había tiempo establecido entonces cambia de color sólo una vez.
Z apaga el LED y desactiva todas las opciones (parpadeo, aleatoriedad y cambio intensidad).

Ejemplo para apagarlo todo:
Z

Ahora, para que cambie aleatoriamente de color una sola vez:
X;

El ; es para no tener que poner X000. Para Z no hace falta porque no necesita ningún valor.

Para que cambie de color cada segundo:
X100

Para que pare de cambiar y mantenga el último:
X;

Y por supuesto, funcionan todos los anteriores comandos.

Al final el programita se me ha convertido en un pequeño ejemplo de "multitarea" y de pequeñas "máquinas de estado".


Adjunto el programa porque ya se ha hecho mayorcito y no cabe como "code".


OrnyTorrynKo

Perfecto compañero, en cuanto tenga un rato modificaré la app para incluirle esto último y te comentaré los resultados.

Estuve investigando sobre los neopixel y intentaré hacer algunas pruebas con el codigo, aunque lo veo complicado jejeje

IgnoranteAbsoluto

Aquí está la versión para neopixel. Con el "pequeño defecto" de que los gestiona todos por igual y no individualmente (tal vez la próxima versión). Hay dos constantes a tener en cuenta en el código: PIN_NEOPIXEL que indica en qué pin está conectado los neopixel, que en mi caso lo he conectado al pin 3. Y la constante TOTAL_CANTIDAD_NEOPIXEL que indica cuantos neopixel son los que tiene la tira o los que se quiere controlar, yo lo he usado 8.

Como en las pruebas he visto que los neopixel iluminan mucho así que, para no deslumbra demasiado, le he añadido un nuevo comando (i):

I establece la intensidad del LED (de 0 a 255). Si se establece 0 "se apaga" el control de la intensidad y es como si se hubiera establecido a 255 (el máximo).

Ejemplo, ponerlo azul y la intensidad a 10:
B255I10;

Si ahora queremos poner la intensidad al máximo podemos usar I000, I; o I255

El resto de comandos anteriores continúan funcionando igual. Ver este comentario y este otro.

Recuerdo que los comandos no diferencia entre mayúsculas y minúsculas. Y también recomiendo terminar siempre con algún carácter que no se a un comando como el ; (punto y coma) o un retorno de carro.

Adjunto el programa.

OrnyTorrynKo

Me parece una gran propuesta la que has realizado con todo este código y estoy totalmente agradecido por la ayuda que me has dado y las cositas que he aprendido.

En cuanto disponga del anillo led probaré el código aunque sin duda alguna se que funcionará.

Estaremos en contacto compañero y estaremos en contacto, un saludo!

IgnoranteAbsoluto

#36
Jul 13, 2017, 01:58 am Last Edit: Jul 13, 2017, 02:04 am by IgnoranteAbsoluto Reason: Mostrar imagen.
Al final creo que se me ha ido un poco de las manos. He encapsulado el código en clases y ahora se pueden controlar los neopixel todos juntos, uno a uno o varios a la vez. Para ello he implementado nuevos comandos que permiten la selección. Todos los comandos anteriores funcionan igual (sobre los LEDs seleccionados). Al empezar están todos seleccionados con lo que los comandos que no son de selección afectan a todos.

El código está configurado para conectar 16 neopixel en el pin 3. Si se quiere cambiar se han de modificar las líneas:

Code: [Select]
const int PIN_NEOPIXEL = 3;              // Pin al que están conectado los neopixel
const int CANTIDAD_TOTAL_NEOPIXEL = 16;  // Cantidad total de neopixel


Cuidado, se necesitan al menos 28 bytes por neopixel para controlarlos. Así que si se conectan muchos tal vez el Arduino se quede sin memoria.

Para saber cuales son los comandos anteriores ver los tres anteriores post:
https://forum.arduino.cc/index.php?topic=485147.msg3319112#msg3319112
https://forum.arduino.cc/index.php?topic=485147.msg3321914#msg3321914
https://forum.arduino.cc/index.php?topic=485147.msg3322652#msg3322652


Los nuevos comandos son:

N establece un único LED a manejar (de 0 a CANTIDAD_TOTAL_NEOPIXEL - 1) si el valor es mayor o igual que CANTIDAD_TOTAL_NEOPIXEL calcula el resto de dividir el valor establecido por CANTIDAD_TOTAL_NEOPIXEL.
D establece desde qué LED se va a manejar en conjunto (admite los mismos valores que el comando 'N'). Si 'D' es mayor que 'H' entonces se selecciona desde 'H' hasta el final y desde el principio hasta 'D'.
H establece hasta qué LED se va a manejar en conjunto (admite los mismos valores que el comando 'N'). Si 'D' es mayor que 'H' entonces se selecciona desde 'H' hasta el final y desde el principio hasta 'D'.
< inicia un comentario (para terminarlo se usa '>').
> finaliza un comentario comenzado por '<'.
T seleccionar todos los LEDs a la vez.
+ activa el seleccionado por el comando 'N' o por un '+' o '-' anterior y selecciona el siguiente sin activarlo. Del último se pasa al primero.
- desactiva el seleccionado por el comando 'N' o por un '+' o '-' y selecciona el siguiente sin activarlo. Del último se pasa al primero.
C invierte la selección de LEDs.
O inverte el parpadeo.
Z apagar y desactivar toda configuración de los LEDs seleccionados.

Ejemplo de seleccionar todos (T), inicializarlos (ponerlos todo a cero) con Z, ponerlos azul (B) y establecer la intensidad (i) a 10 para que no deslumbren mucho. Usamos el punto y coma porque la intensidad sólo necesita dos dígitos y no hay más comandos.
TZB255i10;

Siguiendo con el ejemplo anterior, los hacemos parpadear todos (con ejemplo de comentario):
TZB255i10;<ahora los haremos parpadear con P>P50;

Siguiendo con el ejemplo anterior, Seleccionamos del 4 al 7 e invertimos el parpadeo (o minúscula para que no se confunda con el cero. Sirve igualmente en mayúsculas):
D4H7o

Continuando lo anterior, selecciono el segundo LED, le quito el azul y lo pongo rojo:
N1BR255

Continúo desactivando la selección del segundo LED y "pasando" al tercero con el menos (-), selecciono el tercero y "paso" al cuarto con el más (+), deselecciono el cuarto y paso al quinto (-), deselecciono el quinto y paso al sexto (-), selecciono el sexto y paso al septimo (+), y ya no selecciono nada más. A los dos seleccionados (tercero y septimo) le digo que cambie de color aleatoriamente (X) cada 10 centésimas de segundo:
-+--+X10;

Ahora invierto la selección (C) y les digo que varíen de intensidad con "velocidad" 2:
CV5;

La intensidad la hemos limitado anteriormente a 10. Ahora la vamos a limitar a 100 (salvo los que están aleatorios que no están seleccionados).
i100

Por último invertimos la selección y paramos los aleatorios:
CX;


Un ejemplo "completo" de comandos para una matriz de neopixel de 4x4 (las letras están en minúsculas para no confundir con los números):
tzi10n0+++-+-+-+-+++-+b255p50n0++---------++on2pn4pn3x40n5+---+-----+r255v5;

Que mostraría algo tal que así:




Advierto que lo he hecho un poco "a las prisas" porque no he tenido mucho tiempo disponible. Entiendo que para muchos neófitos en la programación orientada a objeto les va a resultar difícilmente comprensible el código. Y para los ya curtidos también puede que les parezca enrevesado. Aún así, si alguien tiene alguna duda y se atreve a preguntar ruego lo hagan por aquí, por si le puede servir de ayuda a otros.


Adjunto el programa.

OrnyTorrynKo

Perfecto IgnoranteAbsoluto, en cuanto tenga un poco de tiempo libre reconfiguraré la app adaptada al nuevo código y te comento los resultados.

Un saludo compañero.

Go Up