Arduinoで音楽を鳴らす


「Arduino 音楽を鳴らす」で検索するといくつかのページがヒットします。
tone関数を使う例が多いですが、Arduino側にそのためのコードが必要になります。
できるだけ簡単にやりたかったので、100均で手に入る「呼び出しチャイム」を使ってみました。


残念ながら200円です。



本体を開けると中はこのようになっています。
基板から出ている黒いボタンを押すと曲が変わります。
曲は16曲内蔵されています。


基板にはチップが1つ実装されています。
チップマーキングを読んでみましたが「YL0076」あるいは「YL0078」と読めましたが該当するチップは見つかりませんでした。


音が少し大きすぎるのでスピーカとの間に47オームの抵抗を挟んで音量を調整しました。


元に戻すとこんな感じです。


呼び出しSW側もばらしてみました。
これも何かに使えそうなのでキープしておきます。
ATtiny85とこちらの ライブラリを使えば専用リモコンが作れそうです。


Arduinoとの接続は以下の通りです。
単にSWケーブルをD12につないでいるだけです。


音を鳴らすスケッチは2通りあります。



【パターン1】
D12の初期値をLOWにしてHIGH→LOWのパルスで音を鳴らします。
パルス間隔は短くてOKですが、Reset時にチャイムが鳴ってしまいます。
/*
 * 起動時(Reset)に音が出てしまう
 * パルス間隔は100mSecでOK
 */
#define CHIME     12
#define INTERVAL  30

unsigned long lastTime = 0;

void chime() {
  digitalWrite(CHIME,HIGH);
  Serial.println("CHIME HIGH");
  delay(100);
  digitalWrite(CHIME,LOW);
  Serial.println("CHIME LOW");
}

void setup() {
  Serial.begin(9600);
  pinMode(CHIME,OUTPUT);
  digitalWrite(CHIME,LOW);
  lastTime = millis();
}

void loop() {
  static int counter=0;

  long now = millis();
  if (now - lastTime > 1000) {
    lastTime = now;
    counter++;
    Serial.println("counter=" + String(counter));
    if (counter == INTERVAL) {
      chime();
      counter = 0;
    }
  }
}



【パターン2】
D12の初期値をHIGHにしてLOW→HIGHのパルスで音を鳴らします。
Reset時にチャイムは鳴りませんが、チャイムが鳴っている間はLOWを保持する必要があります。
チャイムが鳴っている間にHIGHにするとトーンが変わってしまいます。
/*
 * 起動時(Reset)に音が出ない
 * 音が鳴っている間はLOWのままにする必要があるK
 */
#define CHIME     12
#define INTERVAL  30

unsigned long lastTime = 0;

void chime() {
  digitalWrite(CHIME,LOW);
  Serial.println("CHIME LOW");
  delay(10000);//チャイムが鳴っている間はLOWのままにする必要がある
  digitalWrite(CHIME,HIGH);
  Serial.println("CHIME HIGH");
}

void setup() {
  Serial.begin(9600);
  pinMode(CHIME,OUTPUT);
  digitalWrite(CHIME,HIGH);
  lastTime = millis();
}

void loop() {
  static int counter=0;

  long now = millis();
  if (now - lastTime > 1000) {
    lastTime = now;
    counter++;
    Serial.println("counter=" + String(counter));
    if (counter == INTERVAL) {
      chime();
      counter = 0;
    }
  }
}

音はこんな感じです。