PLC, HMI, SCADA, INVERTERS, GSD PROFIBUS,
GSDML PROFINET, EDS CanOpen, INDUSTRIAL AUTOMATION

21:53
ARDUINO Музыка, часть 1

В данной статье рассмотрим пример подключения компьютерного динамика к ARDUINO, а также скетч, реализующий проигрывание 10 песен. 

К плате ARDUINO подключены 3 кнопки, с помощью которых возможно повторять композицию (repeat), начинать проигрывание с 1-ой песни (restart) и проигрывать следующую в очереди песню (increment).

Данные кнопки подключены к соответствующим пинам на ARDUINO:

  1. const int buttonPin = 2;                // Кнопка инкремента
  2. const int buttonPin_zero = 3;        // Кнопка повтора композиции
  3. const int buttonPin_restart = 4;     // Кнопка рестарта

Плюсовой вывод динамика подключен к 11 пину - #define TONE_PIN 11.



Ответы к названиям песен:

1) Papa Roach -  Last Resort
2) europe - final countdown
3) macarena
4) Розовая пантера
5) назад в будущее
6) Jingle Bells
7) марио - подземелье
8) черепашки ниндзя
9) Гарри Поттер
10) rammstein - amerika

Скетч


#define OCTAVE_OFFSET 0
#define TONE_PIN 11
const int buttonPin = 2;     // Кнопка инкремента
const int buttonPin_zero = 3;     // Кнопка повтора композиции
const int buttonPin_restart = 4;     // Кнопка рестарта


const int ledPin =  13;      // номер выхода светодиода
// переменные
int buttonState = 0;         // переменная для хранения состояния кнопки
int buttonStateZero = 0;         // переменная для хранения состояния кнопки обнуления
int buttonState_restart = 0;
int Count = 0;
boolean Flag1 = false;
boolean Flag2 = false;
boolean Flag3 = false;
boolean Flag4 = false;
boolean Flag5 = false;
boolean Flag6 = false;
boolean Flag7 = false;
boolean Flag8 = false;
boolean Flag9 = false;
boolean Flag10 = false;
boolean Flag11 = false;
boolean Flag12 = false;
boolean Flag13 = false;
boolean Flag14 = false;


#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951

int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
char *song1 = "LastReso:d=4,o=5,b=45:32f,32g#,32g,32g#,32c6,32g#,32g,32g#,32d#,32g#,32g,32g#,32c6,32g#,32g,32g#,32c#,32g#,32g,32g#,32c6,32g#,32g,32g#,32c,32g#,32g,32g#,32c6,32g#,32g,32g#,32f,32g#,32g,32g#,32c6,32g#,32g,32g#,32d#,32g#,32g,32g#,32c6,32g#,32g,32g#,32c#,32g#,32g,32g#,32c6,32g#,32g,32g#,32c,32g#,32g,32g#,32c6,32g#,32g,32g#";
char *song2 = "countdown:d=4,o=5,b=125:p,8p,16b,16a,b,e,p,8p,16c6,16b,8c6,8b,a,p,8p,16c6,16b,c6,e,p,8p,16a,16g,8a,8g,8f#,8a,g.,16f#,16g,a.,16g,16a,8b,8a,8g,8f#,e,c6,2b.,16b,16c6,16b,16a,1b";
char *song3 = "Macarena:d=4,o=5,b=180:f,8f,8f,f,8f,8f,8f,8f,8f,8f,8f,8a,8c,8c,f,8f,8f,f,8f,8f,8f,8f,8f,8f,8d,8c,p,f,8f,8f,f,8f,8f,8f,8f,8f,8f,8f,8a,p,2c.6,a,8c6,8a,8f,p,2p";
char *song4 = "PinkPanther:d=4,o=5,b=160:8d#,8e,2p,8f#,8g,2p,8d#,8e,16p,8f#,8g,16p,8c6,8b,16p,8d#,8e,16p,8b,2a#,2p,16a,16g,16e,16d,2e";
char *song5 = "Back to the Future:d=16,o=5,b=200:4g.,p,4c.,p,2f#.,p,g.,p,a.,p,8g,p,8e,p,8c,p,4f#,p,g.,p,a.,p,8g.,p,8d.,p,8g.,p,8d.6,p,4d.6,p,4c#6,p,b.,p,c#.6,p,2d.6";
char *song6 = "Jingle Bells:d=4,o=5,b=170:b,b,b,p,b,b,b,p,b,d6,g.,8a,2b.,8p,c6,c6,c6.,8c6,c6,b,b,8b,8b,b,a,a,b,2a,2d6";
char *song7 = "smb_under:d=4,o=6,b=100:32c,32p,32c7,32p,32a5,32p,32a,32p,32a#5,32p,32a#,2p,32c,32p,32c7,32p,32a5,32p,32a,32p,32a#5,32p,32a#,2p,32f5,32p,32f,32p,32d5,32p,32d,32p,32d#5,32p,32d#,2p,32f5,32p,32f,32p,32d5,32p,32d,32p,32d#5,32p,32d#";
char *song8 = "Teenage Turtles:d=8,o=6,b=100:g5,a5,g5,a5,g5,16a5,g.5,a5,a#5,c,a#5,c,a#5,16c,a#.5,c,d#,f,d#,f,d#,16f,d#.,f,16c,16c,16c,16c,a#5,4c,16c7,16c7,16c7";
char *song9 = "HarryPotter:d=8,o=6,b=100:b5,e.,16g,f#,4e,b,4a.,4f #.,e.,16g,f#,4d,f,2b5,p,b5,e.,16g,f#,4e,b,4d7,c#7,4c7,g#,c.7,16b,a#,4a#5,g,2e";
char *song10 = "Amerika:d=4,o=5,b=125:d,d,8d,8d,8d,8f,a,8a,a.,8p,8a,g,8g,g.,8p,8g,g,8e,2e,8p,d,d,8d,8d,8d,8f,a,8a,a.,8p,8c6,c6,8e,e.,8p,8c6,c6,8e,e.,p,d,d,8d,8d,8d,8f,a,8a,a.,8p,8a,g,8g,g.,8p,8g,g,8e,2e,8p,d,d,8d,8d,8d,8f,a,8a,a.,8p,8c6,c6,8e,e.,8p,8c6,c6,8e,e";

void setup(void)
{
  // Serial.begin(9600);
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);      
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT); 
  pinMode(buttonPin_zero, INPUT);
  Count = 0;
}

#define isdigit(n) (n >= '0' && n <= '9')

void play_rtttl(char *p)
{
  // Absolutely no error checking in here

  byte default_dur = 4;
  byte default_oct = 6;
  int bpm = 63;
  int num;
  long wholenote;
  long duration;
  byte note;
  byte scale;

  // format: d=N,o=N,b=NNN:
  // find the start (skip name, etc)

  while(*p != ':') p++;    // ignore name
  p++;                     // skip ':'

  // get default duration
  if(*p == 'd')
  {
    p++; p++;              // skip "d="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    if(num > 0) default_dur = num;
    p++;                   // skip comma
  }

 // Serial.print("ddur: "); Serial.println(default_dur, 10);

  // get default octave
  if(*p == 'o')
  {
    p++; p++;              // skip "o="
    num = *p++ - '0';
    if(num >= 3 && num <=7) default_oct = num;
    p++;                   // skip comma
  }


  // get BPM
  if(*p == 'b')
  {
    p++; p++;              // skip "b="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    bpm = num;
    p++;                   // skip colon
  }

//  Serial.print("bpm: "); Serial.println(bpm, 10);

  // BPM usually expresses the number of quarter notes per minute
  wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in milliseconds)

 // Serial.print("wn: "); Serial.println(wholenote, 10);


  // now begin note loop
  while(*p)
  {
    // first, get note duration, if available
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    
    if(num) duration = wholenote / num;
    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after

    // now get the note
    note = 0;

    switch(*p)
    {
      case 'c':
        note = 1;
        break;
      case 'd':
        note = 3;
        break;
      case 'e':
        note = 5;
        break;
      case 'f':
        note = 6;
        break;
      case 'g':
        note = 8;
        break;
      case 'a':
        note = 10;
        break;
      case 'b':
        note = 12;
        break;
      case 'p':
      default:
        note = 0;
    }
    p++;

    // now, get optional '#' sharp
    if(*p == '#')
    {
      note++;
      p++;
    }

    // now, get optional '.' dotted note
    if(*p == '.')
    {
      duration += duration/2;
      p++;
    }
  
    // now, get scale
    if(isdigit(*p))
    {
      scale = *p - '0';
      p++;
    }
    else
    {
      scale = default_oct;
    }

    scale += OCTAVE_OFFSET;

    if(*p == ',')
      p++;       // skip comma for next note (or we may be at the end)

    // now play the note

    if(note)
    {
     // Serial.print("Playing: ");
     // Serial.print(scale, 10); Serial.print(' ');
     // Serial.print(note, 10); Serial.print(" (");
     // Serial.print(notes[(scale - 4) * 12 + note], 10);
      //Serial.print(") ");
      //Serial.println(duration, 10);
      tone(TONE_PIN, notes[(scale - 4) * 12 + note]);
      delay(duration);
      noTone(TONE_PIN);

    }
    else
    {
     // Serial.print("Pausing: ");
     // Serial.println(duration, 10);
      delay(duration);
    }
  }
}
//------------------------------------------
void loop(void)
{
  // считываем значения с входа кнопки
  buttonState = digitalRead(buttonPin);
  buttonState_restart = digitalRead(buttonPin_restart);
  buttonStateZero =  digitalRead(buttonPin_zero);
// рестарт
  if (buttonState_restart == HIGH) {
       Count = 0;
       Flag1 = false;
       Flag2 = false;
       Flag3 = false;
       Flag4 = false;
       Flag5 = false;
       Flag6 = false;
       Flag7 = false;
       Flag8 = false;
       Flag9 = false;
       Flag10 = false;
       Flag11 = false;
       Flag12 = false;
       Flag13 = false;
       Flag14 = false;


  digitalWrite(ledPin, HIGH); 
  }
    else {
    // выключаем светодиод
    digitalWrite(ledPin, LOW);
  }
    delay (100);
// повтор композиции
  if (buttonStateZero == HIGH) {    
        
       Flag1 = false;
       Flag2 = false;
       Flag3 = false;
       Flag4 = false;
       Flag5 = false;
       Flag6 = false;
       Flag7 = false;
       Flag8 = false;
       Flag9 = false;
       Flag10 = false;
       Flag11 = false;
       Flag12 = false;
       Flag13 = false;
       Flag14 = false;


       digitalWrite(ledPin, HIGH); 
  }
  else {
    // выключаем светодиод
      delay (100);
    digitalWrite(ledPin, LOW);
  }
  
  delay (200);
  // проверяем нажата ли кнопка
  // если нажата, то buttonState будет HIGH:
  if (buttonState == HIGH) {    
    // включаем светодиод    
    digitalWrite(ledPin, HIGH); 
   Count++; 
  }
  else {
    // выключаем светодиод
    digitalWrite(ledPin, LOW);
  }
  //Serial.println("count: ");
 // Serial.println(Count, DEC);
//----------------------------------------  
  if ((Count == 1) && (Flag1 == false))
   { play_rtttl(song1);
     Flag1 = true;
   }
//---------------------------------------------   
  if ((Count == 2) && (Flag2 == false))
   { play_rtttl(song2);
     Flag2 = true;
   }

  if ((Count == 3) && (Flag3 == false))
   { play_rtttl(song3);
     Flag3 = true;
   }  
   
//---------------------------------------------   
  if ((Count == 4) && (Flag4 == false))
   { play_rtttl(song4);
     Flag4 = true;
   }
//---------------------------------------------   
  if ((Count == 5) && (Flag5 == false))
   { play_rtttl(song5);
     Flag5 = true;
   } 
  
 //---------------------------------------------   
  if ((Count == 6) && (Flag6 == false))
   { play_rtttl(song6);
     Flag6 = true;
   }
   
//---------------------------------------------   
  if ((Count == 7) && (Flag7 == false))
   { play_rtttl(song7);
     Flag7 = true;
   } 
     
//---------------------------------------------   
  if ((Count == 8) && (Flag8 == false))
   { play_rtttl(song8);
     Flag8 = true;
   }  
  
//---------------------------------------------   
  if ((Count == 9) && (Flag9 == false))
   { play_rtttl(song9);
     Flag9 = true;
   }
   
//---------------------------------------------   
  if ((Count == 10) && (Flag10 == false))
   { play_rtttl(song10);
     Flag10 = true;
   }  
  /* 
//---------------------------------------------   
  if ((Count == 11) && (Flag11 == false))
   { play_rtttl(songB);
     Flag11 = true;
   }    
//---------------------------------------------   
  if ((Count == 12) && (Flag12 == false))
   { play_rtttl(songC);
     Flag12 = true;
   }    
//---------------------------------------------   
  if ((Count == 13) && (Flag13 == false))
   { play_rtttl(songD);
     Flag13 = true;
   }    
//---------------------------------------------   
  if ((Count == 14) && (Flag14 == false))
   { play_rtttl(songE);
     Flag14 = true;
   }  
 
//---------------------------------------------   
  if ((Count == 15) && (Flag15 == false))
   { play_rtttl(song15);
     Flag15 = true;
   } 
   
//---------------------------------------------   
  if ((Count == 16) && (Flag16 == false))
   { play_rtttl(song16);
     Flag16 = true;
   } 
//---------------------------------------------   
  if ((Count == 17) && (Flag17 == false))
   { play_rtttl(song17);
     Flag17 = true;
   } 
//---------------------------------------------   
  if ((Count == 18) && (Flag18 == false))
   { play_rtttl(song18);
     Flag18 = true;
   }  
   */
}
 

Категория: Хобби | Просмотров: 3355 | Добавил: gt7600 | Теги: Arduino | Рейтинг: 5.0/3
Всего комментариев: 0
avatar