La Navidad con Arduino

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).

Deja un comentario

Scroll al inicio