☛ 功能說明

利用 Arduino Uno 開發板播放鋼琴入門音樂 – 小蜜蜂 ( Little Bee )。如下表所示小蜜蜂簡譜,數位 1 ~ 5 代表音符 C、D、E、F、G。每一段有四小節,每小節有四拍,如果演奏的速度是每分鐘 180 拍,則每拍的時間是 60/180 秒 = 60000 / 180 毫秒。

☛ 使用材料

Arduino UNO R3 開發板 × 1、10 μF/16V 電容 × 1、 喇叭或蜂鳴器 × 1。

☛ 電路圖及麵包板接線圖

☛ 程式碼

const int speaker = 2;                               // 數位接腳 2 接至喇叭
unsigned int frequency[7] =                          // 音符頻率
             { 523, 587, 659, 694, 
               784, 880, 988 };
char toneName[] = "CDEFGAB";                         // 音符表
char beeTone[]  = "GEEFDDCDEFGGGGEEFDDCEGGEDDDDDEFEEEEEFGGEEFDDCEGGC";
byte beeBeat[]  = { 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2,
                    1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1,
                    1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1,
                    1, 2, 1, 1, 2, 1, 1, 1, 1, 4 };
const int beeLen= sizeof(beeTone);                   // 小蜜蜂音符總數
unsigned long tempo = 180;                           // 每分鐘 180 拍
int i, j;

void setup()
{ }

void loop()
{
     for(i=0;i<beeLen;i++)
         playTone(beeTone[i], beeBeat[i]);           // 播放小蜜蜂樂曲
     delay(3000);                                    // 間隔 3 秒重複播放
}

void playTone(char toneNo, byte beatNo)              // 播放音符函式
{
     unsigned long duration = beatNo*60000 / tempo;  // 計算每拍時間 ( 毫秒 )
     for(j=0;j<7;j++)
     {
         if(toneNo==toneName[j])                     // 查音符表
         {
            tone(speaker,frequency[j]);              // 播放音符
            delay(duration);                         // 此音符的節拍
            noTone(speaker);                         // 關閉聲音
         }
     }
}

 

☛ 練習

⑴ 設計 Arduino 程式,利用 Arduino 開發板播放鋼琴入門音樂 – 小星星 ( Little Star )。小星星簡譜如下所示,每一段有 4 小節,每小節有 4 拍,演奏速度是每分鐘 120 拍。

const int speaker = 2;                               // 數位接腳 2 接至喇叭
unsigned int frequency[7] =                          // 音符頻率
             { 523, 587, 659, 694, 
               784, 880, 988 };
char toneName[] = "CDEFGAB";                         // 音符表
char beeTone[]  = "CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC";
byte beeBeat[]  = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
                    2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
                    1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
                    1, 1, 2 };
const int beeLen= sizeof(beeTone);                   // 小星星音符總數
unsigned long tempo = 120;                           // 每分鐘 120 拍
int i, j;

void setup()
{ }

void loop()
{
     for(i=0;i<beeLen;i++)
         playTone(beeTone[i], beeBeat[i]);           // 播放小星星樂曲
     delay(3000);                                    // 間隔 3 秒重複播放
}

void playTone(char toneNo, byte beatNo)              // 播放音符函式
{
     unsigned long duration = beatNo*60000 / tempo;  // 計算每拍時間 ( 毫秒 )
     for(j=0;j<7;j++)
     {
         if(toneNo==toneName[j])                     // 查音符表
         {
            tone(speaker,frequency[j]);              // 播放音符
            delay(duration);                         // 此音符的節拍
            noTone(speaker);                         // 關閉聲音
         }
     }
}

 

⑵ 設計 Arduino 程式,利用 Arduino 開發板播放鋼琴入門音樂 – 小星星 ( Little Star )。並使用 6 個 LED 顯示 C、D、E、F、G、A 等 6 個目前正在播放的音符。

const int speaker = 2;                               // 數位接腳 2 接至喇叭
unsigned int frequency[7] =                          // 音符頻率
             { 523, 587, 659, 694, 
               784, 880, 988 };
char toneName[] = "CDEFGAB";                         // 音符表
char beeTone[]  = "CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC";
byte beeBeat[]  = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
                    2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
                    1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
                    1, 1, 2 };
const int beeLen= sizeof(beeTone);                   // 小星星音符總數
unsigned long tempo = 120;                           // 每分鐘 120 拍
int led[6] = { 4, 5, 6, 7, 8, 9 };                   // 數位接腳 4 ~ 9 連接 6 個 LED
int i, j;

void setup()
{
     for(i=0;i<7;i++)
         pinMode(led[i],OUTPUT);                     // 設定數位接腳 4 ~ 9 為輸出模式
}

void loop()
{
     for(i=0;i<beeLen;i++)
         playTone(beeTone[i], beeBeat[i]);           // 播放小星星樂曲
     delay(3000);                                    // 間隔 3 秒重複播放
}

void playTone(char toneNo, byte beatNo)              // 播放音符函式
{
     unsigned long duration = beatNo*60000 / tempo;  // 計算每拍時間 ( 毫秒 )
     for(j=0;j<7;j++)
     {
         if(toneNo==toneName[j])                     // 查音符表
         {
            tone(speaker,frequency[j]);              // 播放音符
            digitalWrite(led[j],HIGH);               // 點亮音符對應的LED
            delay(duration);                         // 此音符的節拍
            noTone(speaker);                         // 關閉聲音
            digitalWrite(led[j],LOW);                // 熄滅音符對應的LED
         }
     }
}