工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく

部品と材料

部品名数量備考
Arduino UNO1
ProtoStax Arduino用エンクロージャー1
ProtoStax ブレッドボード/カスタムボード用エンクロージャー1
ProtoStax 水平スタッキングキット1
超音波距離センサー HC-SR041
ProtoStax HC-SR04用キット1
Adafruit 0.56インチ 4桁7セグメントディスプレイ I2Cバックパック付き(青)1
Adafruit ピエゾブザー PS12401
ハンダレスブレッドボード ハーフサイズ1

アプリとオンラインサービス

プロジェクト概要

手洗いは感染症予防の基本ですが、COVID-19パンデミック以降、その重要性が一層高まりました。CDC(米国疾病予防管理センター)のガイドラインでは、石鹸で最低20秒間こすり洗いすることが推奨されています。

この「非接触ミュージカルハンドウォッシュタイマー」は、超音波センサーに手をかざすと起動し、7セグメントディスプレイでカウントダウンを表示しながら、20秒間のジングルを再生します。プリロードされた4曲(ハッピーバースデー、ドレミの歌、We Will Rock You、ジェパディテーマ)が順番に流れ、飽きずに手洗いを続けられます。楽譜があれば独自の曲も簡単に追加可能です。

非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく

ステップ1:回路図

Arduino Uno、I2C接続の7セグメントLEDバックパック、HC-SR04超音波センサー、ピエゾブザーを使用します。上図の回路図を参照してください。

ステップ2:企画とセットアップ

動作確認だけでなく「完成品として使いやすくする」ことを意識し、ProtoStaxのスタッカブルエンクロージャーで筐体化しました。Arduino用とブレッドボード用のベースを水平スタッキングコネクターで連結し、プロトタイピングプラットフォームを構築。超音波センサーは側面壁に取り付け、筐体完成後も外部からアクセスできるようにしました。

非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく
非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく

ステップ3:プログラミングとテスト

プロトタイプが完成したらコード開発へ。動作テストの動画では、iPhone 11が超音波センサーの「カチカチ」という動作音まで拾っていました。全機能確認後、側面パネルとトップカバーを取り付けて筐体を完成させました。

非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく
非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく

コードの理解

コンポーネントの初期化

Adafruit_7segmentクラス(LEDバックパックライブラリ)で7セグメントディスプレイを初期化。HC-SR04のTrigピンを出力、Echoピンを入力に設定。

Adafruit_7segment matrix = Adafruit_7segment();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
matrix.begin(0x70);

メインループの概要

  1. 超音波センサーの距離読み取りで起動を判定
  2. 起動したら現在時刻を記録し、カウントダウン(20秒)を初期化、次のジングルを選択(ラウンドロビン方式)
if (distance < 10 && !startMusic) {
  startMusic = 1;
  countDown = 20;
  currentTime = millis();
  melodyNum = (melodyNum + 1) % NUM_MELODIES;
}

delay()を使わない同時処理

カウントダウン表示の更新とジングル再生を同時に行うため、delay()は使いません。tone()関数は非ブロッキング(Timer2を使用)なので、音が鳴っている間も他の処理が可能です。millis()で経過時間を管理し、カウントダウン表示を更新しながら次の音符へ進みます。

楽譜からの簡単な音楽データ化

音符と長さを別配列で持つ従来方式ではなく、音符と相対的な長さをセットにした構造体を定義。全音符を1として、2分音符=0.5、4分音符=0.25、8分音符=0.125…とマクロで定義し、付点音符はDOTTED(X) = X * 1.5で表現します。

typedef struct Note { int frequency; float duration; } Note;
#define NOTE_WHOLE 1
#define NOTE_HALF 0.5f
#define NOTE_QUARTER 0.25f
#define NOTE_EIGHTH 0.125f
#define NOTE_SIXTEENTH 0.0625f
#define DOTTED(X) (X * 1.5f)

例えば「ハッピーバースデー」は以下のようにほぼ音符通りに記述できます。楽譜が読めなくても、音名さえわかれば移植可能です。

Note melody[] = {
  {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH},
  {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER},
  {NOTE_C7, NOTE_QUARTER}, {NOTE_B6, NOTE_HALF},
  // ... 以下同様
};

メロディ構造体には音符配列、音符数、全音符の実ミリ秒長を含めます。

typedef struct Melody {
  Note *notes;
  int numNotes;
  int wholeNoteDurationMs;
} Melody;

ループ内では、選択されたメロディの音符を順に再生しつつ、millis()でカウントダウンを並行更新。20秒経過後も曲が終わるまで再生し、曲が短ければ繰り返して20秒以上再生します。

プロジェクトの発展アイデア

  1. お気に入りの曲を上記マクロで移植・追加(メモリ節約のため既存曲をコメントアウトするか、PROGMEM化)
  2. メロディデータをSRAMからFlash(PROGMEM)へ移動。Arduino UnoはSRAM 2KB、Flash 32KB。PROGMEM化で動的メモリ使用量を76%→22%に削減可能、大量の曲を格納できる

他にもアイデアがあれば共有してください。Happy Making!

コード

ProtoStax 非接触ミュージカルハンドウォッシュタイマー デモ

GitHubリポジトリから全コードを取得できます。

回路図

非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく

製造プロセス

  1. 手洗いステーション点検の実証済みベストプラクティス
  2. Bluetooth操作のArduinoスパイボットを自作する
  3. FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
  4. 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
  5. ウォッチドッグタイマーを理解する:マイコンのハングアップを防ぐ仕組み
  6. 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
  7. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  8. Arduinoプロジェクトのための最適化電源ソリューション
  9. Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
  10. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  11. SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー