Índice general Foros Digital, Electricidad e Informática Tren.ino: Luces de obras

Tren.ino: Luces de obras

Moderador: 241-2001


Nota 27 Oct 2013 12:53

Desconectado
Mensajes: 625
Ubicación: Asturias
Registrado: 15 Nov 2012 19:16
Hola,

en la línea de lo comentado en el hilo 'Arduino => Tren.ino' os presento un proyecto de iniciación muy sencillo, de los que voy empleando para meterme en el mundo arduino, que creo puede servir a cualquiera:



Es algo muy simple, similar al que Aneste tenía en catálogo y muy sencillo de preparar. El esquema eléctrico:

Luces obras esquema.jpg

La alimentación puede proceder de la vía (en DCC) o de cualquier fuente de alterna, evidentemente. Un regulador del tipo 78L05 estabiliza la tensión a 5 voltios. El microcontrolador es el ATTiny85 y las salidas son los cinco LEDs con su correspondiente resistencia limitadora. En principio había previsto utilizar un potenciómetro para poder ajustar la frecuencia, pero eso significa utilizar la patilla de RESET lo que imposibilitaría la reprogramación del chip por el sistema ICSP, por lo que no le utilizo en el programa.

El pcb del circuito:

Luces obras.pdf
(9.52 KiB) 150 veces

y la distribución de componentes:

situacion componentes.jpg

El regulador 78L05 empleado es el smd porque tengo bastantes; si alguien está interesado puedo preparar el montaje para el clásico de tres patillas. El micro lo he montado sobre un zócalo de pines torneados para poder extraerlo y modificarle el programa si fuera necesario.

El programa cargado en el micro (editado para poner comprimido el archivo .ino):
Luces_obras.zip
(940 Bytes) 139 veces

Hubiera preferido poner el texto pero no puede formatearse y resulta incómodo de leer. Hace un chequeo inicial con tres parpadeos de todos los LEDs y luego ya en el bucle principal se enciende cada uno un cierto tiempo, luego se apaga y al siguiente. Creo que resulta sencillo de comprender incluso para principiantes. Si hay dudas intentaremos resolverlas.

Nota 30 Oct 2013 20:15

Desconectado
Mensajes: 625
Ubicación: Asturias
Registrado: 15 Nov 2012 19:16
...partiendo de cero...

por sugerencias, por si fuera útil para alguien a quien pueda parecer confuso lo presentado, pongo a continuación los pasos previos seguidos hasta instalar el programa en un circuito prototipo.

En primer lugar la placa del arduino (yo compré un Leonardo; no sé si fue un acierto) con las resistencias, diodos y cablecillos necesarios para montar el esquema mostrado al principio (sobre el arduino en lugar del ATTiny85 empleado después) en la protoboard (como se ve, con más 'invitados'):

Desde cero - 1.JPG
Desde cero - 1.JPG (210.7 KiB) Visto 1694 veces

Luego elegimos los terminales a emplear: como vamos a encender/apagar LEDs usaremos los terminales digitales que el sistema define por números. Dejamos libres el cero y el uno que se usan para comunicaciones y conectamos el 2, 3, 4, 5 y 6:

Desde cero - 2.JPG
Desde cero - 2.JPG (117.14 KiB) Visto 1694 veces

los cablecillos van a la protoboard; uno a cada fila; de cada fila sale un terminal de la resistencia de 330 ohmios; el otro va la fila donde se conectará el ánodo de su diodo correspondiente y los cátodos se pinchan en la misma fila, porque irán conectados al negativo:

Desde cero - 3.JPG
Desde cero - 3.JPG (93.24 KiB) Visto 1694 veces

al ver la foto me di cuenta de que me había desplazado con tres de las resistencias una posición. Detalle:

Desde cero - 4.JPG
Desde cero - 4.JPG (117.48 KiB) Visto 1694 veces

y finalmente funcionó con el programa que presentaré a continuación:

Desde cero - 5.JPG
Desde cero - 5.JPG (102.84 KiB) Visto 1694 veces

...

Nota 30 Oct 2013 20:20

Desconectado
Mensajes: 625
Ubicación: Asturias
Registrado: 15 Nov 2012 19:16
... y ahora el programa: en su conjunto sería:

luces_obras_0 -0.png
luces_obras_0 -0.png (78.19 KiB) Visto 1693 veces

Por partes: lo primero es declarar lo que vamos a emplear del arduino: sus cinco terminales. En el sistema se definen con un número, pero para nuestro lenguaje humano se supone que es más cómodo darles un nombre. Ese nombre se incluye, en este caso, en variables:

luces_obras_0 -1.png
luces_obras_0 -1.png (11.61 KiB) Visto 1693 veces

y a las variables se les da un nombre clave para identificar su tipo (vamos como los palos de una baraja, o el uniforme de un equipo de fútbol); en este caso son de tipo int y sus nombres led... porque parece oportuno ya que cada una corresponde a uno de los LED que hemos instalado en la protoboard. El resto es asignarle el número del terminal que el sistema arduino tiene definido para cada terminal. El 'led0' es el número 2.

Lo siguiente, impuesto por el sistema es escribir la función que obligatoriamente se llama setup (void porque no devuelve nada y los paréntesis que acompañan al nombre son el distintivo de que es una función):

luces_obras_0 -2.png
luces_obras_0 -2.png (5.41 KiB) Visto 1693 veces

aquí especificamos la forma de trabajo de cada terminal que vamos a emplear. Es imprescindible porque estos microcontroladores tienen varios bloques funcionales internos y los terminales son su conexión con el exterior; de esta forma especificamos qué prestación queremos de entre las que cada terminal puede tener (en el arduino vienen nombrados los terminales conforme a sus posibles funciones: las entradas analógicas A0...A5, los terminales digitales númerados de 0 en adelante y los que tienen la capacidad de generar señales pwm marcados con el símbolo '~'). Nosotros elegiremos el modo salida (OUTPUT) para cada pin definido.

Y así se llega ya al bucle principal 'loop()' donde se escribe el programa que se repetirá indefinidamente. Lo que queremos es que se encienda el primer LED durante un segundo, luego se apague y se encienda el siguiente..., y así sucesivamente. Las instrucciones básicas serán:

luces_obras_0 -3.png
luces_obras_0 -3.png (6.61 KiB) Visto 1693 veces

digitalWrite (led0,HIGH); (¡ojo a la sintaxis! en lenguaje c las mayúsculas y minúsculas son distintas; montones de errores muy frustrantes al principio) pone a nivel alto (+5V) el terminal led0; es decir, según nuestra conexión el LED se enciende.
delay(1000); pone a la CPU a esperar que pasen 1000 milisegundos (1 segundo)
digitalWrite (led0,LOW); pone a nivel bajo (0V) el terminal led0
y eso se repite para los cinco LEDs que hemos utilizado, de manera continua.

Si todo está conectado correctamente, ya podemos cargar el programa a la placa (que habremos asignado a la de cada cual en el menú Herramientas) y comprobar el funcionamiento. Ajustamos valores, hacemos los cambios que prefiramos y una vez que está a nuestro gusto ya podemos trasladar este código a un sistema concreto como el que empleo al principio de este hilo, porque sería un derroche dedicar la placa arduino a esta función solamente.

Al compilar el programa (generar el código máquina o código interno del microcontrolador) para ver si hemos cometido algún error, nos informa de que el tamaño es de 4990 bytes; me parece desmesurado, es lo que encuentro más problemático de arduino porque es mucho código para operaciones simples. Por ejemplo no se podría cargar en un chip que tuviera 4 KBytes de memoria de programa.

luces_obras_0 -4.png
luces_obras_0 -4.png (7.07 KiB) Visto 1693 veces

...

Nota 30 Oct 2013 20:21

Desconectado
Mensajes: 625
Ubicación: Asturias
Registrado: 15 Nov 2012 19:16
... y finalmente otro enfoque del mismo programa: tenemos cinco salidas y las cinco van a actuar de forma similar, con un hardware idéntico. Agrupamos todos los terminales en un array o matriz (conjunto de elementos de las mismas características: jugadores de un equipo de fútbol, por ejemplo) y diferenciamos a cada uno por su número de orden dentro de ese grupo (es decir un índice):

luces_obras_0A.png
luces_obras_0A.png (102.68 KiB) Visto 1692 veces

El código resulta más compacto porque primero definimos el nombre del conjunto 'led[]' (cada elemento se distinguirá por el índice que pongamos entre los corchetes), asignamos las operaciones mediante un bucle: una variable llamada 'i' toma los valores del indice y mediante un 'bucle for' va asignando a cada elemento su modo de trabajo (en setup) y luego su operación (en loop).

Puede comprobarse que aunque el código escrito es bastante más compacto, el que genera el sistema arduino sigue siendo enorme: 4860 bytes

Y así se me ocurre que puede ser desde cero-cero. No me importa empezar así en lo sucesivo, pero si esta forma básica es conocida sería tontería que ocupara tanto sitio en foro y que 'predicara en el desierto'; los interesados tenéis la palabra. Por ahora nada más.

Saludos,

Germán

Nota 01 Nov 2013 05:21

Desconectado
Mensajes: 1344
Ubicación: Esslingen
Registrado: 10 Oct 2010 12:11
Hola a todos,
German ante todo felicitarte por tan buen trabajo realizado, es indudable que habres las puertas a mas caminos para conseguir la posibilidad de hacer otras virguerias ademas de esta.

Te planteo de que ya que necesitas 5 Volt. para alimentar la placa porque no precindes del 78L05 con lo que te ahorras algo de trabajo y circuitos de placa y lo alimentas directamente con una fuente de alimentacion de un ordenador que te da este voltaje completamente estabilizado.
Lo digo simplentente por simplificar toda la placa y a su vez en costo y trabajo.
Yo lo he hecho en decoders y me he ahorrado bastantes componentes inutiles entre ellos el 78L05 y condensadores haciendo de filtros con el mismo resultado.

Un saludo, Angel

Nota 01 Nov 2013 12:04

Desconectado
Mensajes: 625
Ubicación: Asturias
Registrado: 15 Nov 2012 19:16
Hola Ángel,
¡chapeau!, me has leído el pensamiento. Precisamente pensaba incluir en el hilo general la sugerencia como dices, y que además tanta gente apoya; es una buena solución disponer para todo el conjunto de la maqueta de una fuente de PC: 12 voltios y 5 voltios garantizados. Incluso, para quien no quiera también se podría plantear una fuente normal con un 7812 y otro 7805 para tener esos voltajes, ya que un amperio es más que suficiente para iluminación si se utilizan LEDs y se prudente en su alimentación.

Para que veas que ya lo había pensado, te pongo un enlace al video que subí a youtube para presentar el efecto fuego:



Está hecho con una cámara de fotos y por mí, que no soy nada hábil, por eso el color no sale tan vistoso como es en realidad. Al final verás que al mostrar la placa no consta más que del micro y sus resistencias y LEDs; mide aproximadamente 1'7x1 cm y se puede cortar para dejar solos los LEDs de manera que se puedan situar donde convenga con un espacio mínimo (curiosamente un compañero me riñó por alimentarlo a 5 voltios sin más).

Mi intención era presentarlo en un hilo como complemento a la iluminación de viviendas o edificios de que hablamos, pero no sé si tiene el interés suficiente como para ocupar estos espacios; ya tengo hecho las 'luces para paso a nivel' y el 'efecto fluorescente', pero no sé si presentarlos.

Saludos,

Germán

PD por curiosidad: a esas horas ¿ya estás levantado o aún no te has acostado?


Volver a Digital, Electricidad e Informática

Síguenos en Facebook Síguenos en Youtube Síguenos en Instagram Feed - Nuevos Temas
©2017   -   Información Legal