Ya queda algo lejos la Navidad, pero siempre vuelve… así que queremos compartir con vosotros el proyecto de Mae, un árbol programado con arduino con luces y canciones navideñas. Os compartimos el paso a paso del proyecto debajo del video, esperamos que os guste 🙂
CONECTANDO EL ALTAVOZ A LA PLACA DE ARDUINO:
- Conectar el cable de tierra que sale del altavoz a GND de Arduino.
- El otro cable conectarlo al pin 5.
CONECTANDO LOS LEDS:
Nuestra tira de leds funciona a 12 voltios y Arduino sólo proporciona 5 voltios por lo que son necesarios tres transistores (uno por cada uno de los colores básicos de la tira:Rojo Verde y Azul) que funcionen como amplificadores.
Para simplificar el proyecto, partimos de los transistores ya implementados por lo que únicamente es necesario realizar las siguientes conexiones:
- Cable negro a GROUND
- Cable rojo al pin 9
- Cable verde al pin 10
- Cable azul al pin 11
En este enlace se incluye la explicación detallada del control de tiras de LED de 12 voltios con Arduino: https://www.youtube.com/watch?v=Shly4dIspPY
El código del que hemos partido para incluir los villancicos se puede encontrar en: https://www.hackster.io/joshi/piezo-christmas-songs-fd1ae9
En la url anterior se hace referencia a la librería pitches que se puede descargar desde:
https://www.arduino.cc/en/Tutorial/toneMelody
Este es el código que hemos utilizado y que puedes compilar y subir a la placa:
/*
Arduino Christmas Songs
Based on a project and code by Dipto Pratyaksa, updated on 31/3/13
Modified for Christmas by Joshi, on Dec 17th, 2017.
Modificado por RGG 2019
*/
#include «pitches.h»
#define melodyPin 5
#define red 9
#define green 10
#define blue 11
int t = 500;
// Jingle Bells
int melody[] = {
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
NOTE_E5,
NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
NOTE_D5, NOTE_G5
};
int tempo[] = {
8, 8, 4,
8, 8, 4,
8, 8, 8, 8,
2,
8, 8, 8, 8,
8, 8, 8, 16, 16,
8, 8, 8, 8,
4, 4
};
// We wish you a merry Christmas
int wish_melody[] = {
NOTE_B3,
NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4,
NOTE_D4, NOTE_D4, NOTE_D4,
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4,
NOTE_E4, NOTE_E4, NOTE_E4,
NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4,
NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3,
NOTE_D4, NOTE_G4, NOTE_E4,
NOTE_F4
};
int wish_tempo[] = {
4,
4, 8, 8, 8, 8,
4, 4, 4,
4, 8, 8, 8, 8,
4, 4, 4,
4, 8, 8, 8, 8,
4, 4, 8, 8,
4, 4, 4,
2
};
// Santa Claus is coming to town
int santa_melody[] = {
NOTE_G4,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4,
NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4,
NOTE_D4, NOTE_F4, NOTE_B3,
NOTE_C4
};
int santa_tempo[] = {
8,
8, 8, 4, 4, 4,
8, 8, 4, 4, 4,
8, 8, 4, 4, 4,
8, 8, 4, 2,
4, 4, 4, 4,
4, 2, 4,
1
};
void setup(void) {
pinMode(5, OUTPUT); // Zumbador
pinMode(13, OUTPUT); // Indicador de Led cuando se reproduce una nota
randomSeed(analogRead(0));
}
void loop() {
sing(1);
delay(3000);
sing(2);
delay(3000);
sing(3);
delay(5000);
}
int song = 0;
void sing(int s) {
// Iteracciones sobre las notas de la melodía:
song = s;
if (song == 3) {
Serial.println(» ‘We wish you a Merry Christmas'»);
int size = sizeof(wish_melody) / sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
// Para calcular la duración de una nota, dividimos un segundo entre el tipo de nota
int noteDuration = 1000 / wish_tempo[thisNote];
buzz(melodyPin, wish_melody[thisNote], noteDuration);
// Para distinguir las notas, establecemos un tiempo mínimo entre ellas.
// la duración de la nota + 30% funciona bien:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// deja de sonar el tono
buzz(melodyPin, 0, noteDuration);
}
} else if (song == 2) {
Serial.println(» ‘Santa Claus is coming to town'»);
int size = sizeof(santa_melody) / sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
// Para calcular la duración de una nota, dividimos un segundo entre el tipo de nota
int noteDuration = 900 / santa_tempo[thisNote];
buzz(melodyPin, santa_melody[thisNote], noteDuration);
// Para distinguir las notas, establecemos un tiempo mínimo entre ellas.
// la duración de la nota + 30% funciona bien:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// deja de sonar el tono
buzz(melodyPin, 0, noteDuration);
}
} else {
Serial.println(» ‘Jingle Bells'»);
int size = sizeof(melody) / sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
// Para calcular la duración de una nota, dividimos un segundo entre el tipo de nota
int noteDuration = 1000 / tempo[thisNote];
buzz(melodyPin, melody[thisNote], noteDuration);
// Para distinguir las notas, establecemos un tiempo mínimo entre ellas.
// la duración de la nota + 30% funciona bien:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// deja de sonar el tono
buzz(melodyPin, 0, noteDuration);
}
}
}
void buzz(int targetPin, long frequency, long length) {
//inicializamos las variables para los colores de los leds
int ColorR = 0;
int ColorG = 0;
int ColorB=0;
digitalWrite(13, HIGH);
//Los colores los generamos aleatoriamente
ColorR=random(0,255);
ColorG=random(0,255);
ColorB=random(0,255);
//Enviamos el valor de los colores básicos para generar el color final
analogWrite(green, ColorG);
analogWrite(red, ColorR);
analogWrite(blue, ColorB);
long delayValue = 1000000 / frequency / 2; // calcula el valor de espera entre transiciones
long numCycles = frequency * length / 1000; //calcula el número de ciclos
for (long i = 0; i < numCycles; i++) { //bucle para el número de ciclos que hemos obtenido
digitalWrite(targetPin, HIGH); // enviamos el valor high al zumbador
delayMicroseconds(delayValue); // esperamos el tiempo calculado
digitalWrite(targetPin, LOW); //enviamos el valor low al zumbador
delayMicroseconds(delayValue); // esperamos el tiempo calculado
}
digitalWrite(13, LOW);
}
No olvides copiar el fichero pitches.h a Arduino/libraries
Comprueba que el altavoz reproduce correctamente los villancicos y se encienden los leds.
Puedes probar a cambiar los colores de los LEDS en lugar de generarlos aleatoriamente. Para ello, puede ser útil la página https://www.colorspire.com/rgb-color-wheel/ (Donde, dado un color nos indica la cantidad de Rojo, Verde y Azul necesario).