日記

日本語の勉強のためのブログ

【Arduino】ドア開閉時にファミマの入店音を鳴らす

散々使われてきたネタだと思うが、せっかく作ったので投下。

使用したもの&環境

  • ELEGOO UNO R3
  • 超音波センサ HC-SR04
  • パッシブブザー [1]
  • 220Ω抵抗 [2]
  • Arduino IDE 2.0.0-beta.10

[1] パッシブブザーは与える信号によって音程を変更できるブザーであり、よく圧電スピーカーと呼ばれているものと同一のようだ。
[2] 以下のページによると、ブザーには保護のために抵抗をかますことが多いとの事なので、それに従うことにした。 synapse.kyoto

回路図

f:id:kalax:20210809132148p:plain
図1. 回路図

作成したプログラム

// everykalax.hateblo.jp
// 2021.08.09

// ライブラリをinclude
#include "pitches.h" 
#include "SR04.h"

// 使用するピンの定義
#define SOUND_PIN 8
#define TRIG_PIN 12
#define ECHO_PIN 11

// 超音波センサの設定らしい
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;

// 音符の長さ(四分音符など)の定義
#define L1 2000   // [ms]
#define L2 (L1/2)
#define L4 (L1/4)
#define L8 (L1/8)

// メロディと音の長さを定義
int melody[] = {
  NOTE_FS4, NOTE_D4, NOTE_FS3, NOTE_D4, NOTE_E4, NOTE_A4, NOTE_E3,
  NOTE_E4, NOTE_FS4, NOTE_E4, NOTE_FS3, NOTE_D4
};
int duration[] = {
  L8, L8, L8, L8, L8, L4, L8,
  L8, L8, L8, L8, L4
};
 
// ===================================
void setup() {
  Serial.begin(9600);
  a = sr04.Distance(); // これいらないかも
}
 
// 距離の閾値 これより近くに接近したら音を鳴らす
long threshold_length = 5L;

void loop() {
  // 接近するまで待つ(ビジーウェイトなのでできれば改善したい)
  do {
    a = sr04.Distance();
    delay(50);
  } while(a > threshold_length);

  // センサとの距離をシリアルポートに出力
  Serial.print(a);
  Serial.println("cm");

  // ファミマのチャイムを鳴らす
  for (int thisNote = 0; thisNote < 12; thisNote++) {
    tone(SOUND_PIN, melody[thisNote], duration[thisNote]);
    delay(duration[thisNote]);
  }
   
  // 一応数秒間待つ
  delay(2000);
}
使用ライブラリ&参考にしたプログラム

買ったキットに入っていた"pitches.h" *1 と"SR04.h" *2 の2つのライブラリを使用した。
また、以下のページにあるzipファイル内の、

  • ELEGOO The Super Starter Kit for UNO V2.0.2021.03.31\English\Part 2 Module Learning\2.9 Ultrasonic Sensor Module\SR04_Example にある"SR04_Example.ino"
  • ELEGOO The Super Starter Kit for UNO V2.0.2021.03.31\English\Part 2 Module Learning\2.6 Passive Buzzer\passive_buzzer にある"passive_buzzer.ino"

を参考にした。 www.elegoo.com

今後の課題

  • 和音を鳴らせるようにしたい。
  • ジーウェイトを使わないで済む方法を模索したい。

補足

ファミマのチャイムの楽譜

この記事の中盤あたりに掲載されている楽譜を読み、メロディを作成した。いくつかの音には♯がついているため気を付ける。 dailyportalz.jp

*1:たぶんArduino公式ページにあるpitches.hと同一

*2:ELEGOOのサイトからDLできる