Last updated: 10 May 2022
Este proyecto te enseñará cómo crear un efecto sencillo pero muy realista de fuego (o llamas) con un Arduino y unos LEDs.
Es verdad que existen otros ejemplos de crear un efecto de fuego por allí en la web pero ninguno da un resultado muy realista. Son más bien ejercicios en encender y apagar un LED de forma aleatoria. Todos dan la sensación de ver unas luces de navidad baratas sufriendo un corte de circuito.
También se puede utilizar este tutorial como una introducción a la programación de Arduino/AVR (¡o incluso un primer paso a la programación en general!) porque el código solo requiere conocimientos muy básicos.
De hecho, el ejemplo del efecto de fuego es un buen punto de partida para niños (o niños adultos :) ) que están empezando programar Arduino. Todas las instrucciones están acompañadas por una explicación que no supone que hayas tocado un Arduino en tu vida.
Dado que el tutorial explica los comandos más básicos, se puede considerar un proyecto "hello world" Un programa ¡Hola, mundo! es un programa simple sin utilidad ninguna; solo demuestra que conozcas lo mínimo antes de ir más allá con tus sueños... . Es más divertido y útil (suponiendo, claro, que necesitas un efecto de fuegoven algún lugar de tu casa) que el ejemplo ubicuo de blinkparpadear. Si nunca has probado el ejemplo blink o lo has probado una vez y quedaste aburrido inmediatamente o (si tienes mucha suerte) no tienes ni idea qué es el ejemplo blink, puedes considerar esta página tu entrada en el mundo de la programación de Arduino y AVR :)
La primera vez que hice un efecto realista de fuego en un Arduino fue (debido a petición popular) para el belén navideño de mis hijas. De hecho fue la razón por la que compré y programé un Arduino por primera vez. Hacía unas cuántas navidades había logrado un efecto parecido (pero no tan realista) con un chip contador 4026, un chip temporizador NE555, un condensador y un par de resistencias enchufados a una protoboard (más un poco de cinta adhesiva) Encontré el diagrama en la web aunque no lo puedo encontrar ahora a pesar de mis mejores intentos en buscarlo. Supongo que ya no existe, pero si alguien conoce el URL, que me lo envie y añado un enlace aquí encantado..
(incluye enlaces pagados)
Conecta tu Arduino tal como se ve en el diagrama siguiente. Hay 4 LEDs conectados a las patas del Arduino 2, 3, 4 y 5 (salidas digitales). Cada LED está conectado a través de una resistencia 330Ω y por el otro lado conectado a tierra (GND). Claro, puedes usar más o menos LEDs pero evidentemente tendrás que poner como mínimo uno rojo y uno amarillo para conseguir una apariencia de llamas.
Para Arduino UNO (la placa más típica):
Para Arduino micro pro (un montaje más compacto):
Diagrama esquemático (sirve para ambos montajes):
Crea un programa nuevoPrograma > Nuevo en el IDE de Arduino.
Nos ha creado dos funciones automáticamente: setup()
Las instrucciones en setup()
se ejecutarán solo una vez cuando arranquemos el Arduino.
y loop()
Las instrucciones en
loop()
se ejecutarán repetidamente hasta
que desenchufemos el Arduino del corriente (sea cable USB, pila).
.
Antes de codifcar la lógica de estas funciones, crea una
variable global r
que usaremos
para asignar un número aleatorio cuando lo necesitemos
(porque, como verás, lo necesitaremos):
long r;
Añade el código de configuración (set-up). Esto dice que los pines 2, 3, 4 y 5 son salidas digitales (OUTPUTs); vamos a enviar un corriente eléctrico a través de ellos.
void setup(){ pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); }
Ahora creamos una función nuestra que alumbrará uno
de nuestros LEDs (pata x).
La primera linea genera un número aleatorio entre
0 y 100.
Si ese número es menos de 90, la segunda linea de
la función hará digitalWrite(x, true)
y el LED que está conectado a la pata x
se encenderá; en caso contrario hará
digitalWrite(x, false)
y el
LED que esté conectado a la pata x se
apagará.
Dicho de otra forma, cada LED estará encendido
durante 90% del tiempo. ¡¡¡Ésta es la clave
para crear un efecto realista de fuego!!!
void parpardear(int x){ r = random(100L); digitalWrite(x, r < 90); }
Ahora solo tenemos que añadir la lógica a la
función loop()
, que
simplemente invoca a nuestra función
parpardear()
para los
pines 2, 3, 4 y 5 y luego hace una pausa
durante una décima de segundo antes de
repetir.
void loop(){ parpardear(2); parpardear(3); parpardear(4); parpardear(5); delay(100); }
El código completo queda así:
long r; void setup(){ pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); } void parpardear(int x){ r = random(100L); digitalWrite(x, r < 90); } void loop(){ parpardear(2); parpardear(3); parpardear(4); parpardear(5); delay(100); }
Conecta tu Arduino al ordenador mediante el cable USB
y asegúrate que la placa correcta y puerto USB correcto
están seleccionados en el menú de Herramientas
.
Ahora subePrograma > Subir
o Ctrl + U
tu código al chip.
Deberías ver algo parecido a esto en la consola y barra de estado:
Subido
Archiving built core (caching) in: /tmp/arduino_cache_136769/core/core_arduino_avr_micro_db99e0ab099901ba14487a14637cc883.a
El Sketch usa 4626 bytes (16%) del espacio de almacenamiento de programa. El máximo es 28672 bytes.
Las variables Globales usan 157 bytes (6%) de la memoria dinámica, dejando 2403 bytes para las variables locales. El máximo es 2560 bytes.
Y, sobre todo, deberías ver tus LEDs parpardeando como si fuesen llamas :)
Si ves un montón de texto en rojo en la consola
que contenga los siguientes mensajes de error, probablemente
has seleccionado la placa equivocada. En este caso,
comprueba la placa especificada en el menú
Herramientas
.
Ha ocurrido un error mientras se enviaba el sketch
Arduino: 1.8.5 (Linux), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Archiving built core (caching) in: /tmp/arduino_cache_752042/core/core_arduino_avr_mega_cpu_atmega2560_db99e0ab099901ba14487a14637cc883.a
El Sketch usa 1908 bytes (0%) del espacio de almacenamiento de programa. El máximo es 253952 bytes.
Las variables Globales usan 17 bytes (0%) de la memoria dinámica, dejando 8175 bytes para las variables locales. El máximo es 8192 bytes.
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
An error occurred while uploading the sketch
Si ves un montón de text en rojo en la consola que
contenga los siguientes mensajes de error, probablemente
has seleccionado el puerto USB equivocado. En
este caso, comprueba el puerto especificado en el menú
Herramientas
.
avrdude: error: programmer did not respond to command: exit bootloader
Arduino: 1.8.5 (Linux), Board: "Arduino/Genuino Micro"
El Sketch usa 1908 bytes (0%) del espacio de almacenamiento de programa. El máximo es 253952 bytes.
Las variables Globales usan 17 bytes (0%) de la memoria dinámica, dejando 8175 bytes para las variables locales. El máximo es 8192 bytes.
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
Found programmer: Id = ""; type =
Software Version = . ; Hardware Version = �.
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: buffered memory access not supported. Maybe it isn't
a butterfly/AVR109 but a AVR910 device?
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: programmer did not respond to command: leave prog mode
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: programmer did not respond to command: exit bootloader
avrdude: error: programmer did not respond to command: exit bootloader
Tus LEDs deben estar parpardeando como un fuego de verdad. Ojalá que hubiera sacado la foto siguiente en la oscuridad :(
Luego solo hace falta cubrir los LEDs y la placa con palitos finos de madera o paja y colocarla en tu maqueta o belén con el cable USB enchufado a la pared o a una pila. Aquí teneis mi (bastante blasfemo) belén. Menos mal que sí saqué esta foto en la oscuridad:
¡¡¡Luces (digo llamas), cámara, acción!!!
Y si no quieres sacrificar tu Arduino en el belén de tus niños durante toda la navidad, ¡este artículo te enseña como montar este mismo proyecto en un chip ATtiny85 de €1!