Arduinoと超音波距離センサーで作るインタラクティブMP3プレーヤー
コンポーネントと用品
| Arduino UNO | × | 1 |
| CATALEX製 シリアルMP3プレーヤーモジュール | × | 1 |
| 超音波センサー HC-SR04 (汎用) | × | 2 |
| 3.5mmジャック入力対応スピーカー | × | 1 |
このプロジェクトについて
CATALEX製シリアルMP3プレーヤーの使い方
以前のチュートリアルでは、#include <SoftwareSerial.h>ライブラリのみで、簡単な関数を解説しました:
void sendCommand(int8_t command, int16_t dat) {
if (command==CMD_PLAY_WITHFOLDER || command==CMD_PLAY_WITHVOLUME){
Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");
}
delay(20);
Send_buf[0] = 0x7e; // 開始バイト
Send_buf[1] = 0xff; // バージョン
Send_buf[2] = 0x06; // コマンドのバイト数(開始/終了バイト除く)
Send_buf[3] = command;
Send_buf[4] = 0x00; // 0x00=フィードバックなし, 0x01=フィードバックあり
Send_buf[5] = (int8_t)(dat >> 8); // データ上位
Send_buf[6] = (int8_t)(dat); // データ下位
Send_buf[7] = 0xef; // 終了バイト
for(uint8_t i=0; i<8; i++) {
mySerial.write(Send_buf[i]);
}
Serial.println();
}
HC-SR04超音波距離センサーの使い方
ライブラリ不要で簡単に使用できます。以前の投稿を関数化しました:
long measureDistance(){
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
Serial.println("distance:");
Serial.println(distance);
return distance; // cm単位で距離を返す
}
両方を組み合わせる Version 1: シンプルなMP3距離トリガー
ライブラリ <SoftwareSerial.h> をインストールしてください。
このバージョンでは、何かが50cm以内に近づくとMP3オーディオがトリガーされます。私は「サプライズ・マザーファッカー」という大音量のクリップでルームメイトを驚かせるのに使いました。
注意: 完全な .ino コードは下部のプロジェクト添付ファイルにあります。
void loop() {
if(measureDistance() < 50){
sendCommand(CMD_PLAY_WITHFOLDER, 0X0203); // 2番目のフォルダの3曲目を再生
delay(1000); // エラー防止のため待機
}
delay(300);
}
両方を組み合わせる Version 2: ディスターベンス(変化検知)MP3距離トリガー
このバージョンは距離そのものではなく、読み取り値の「差分」を検知します。誤検知が多い場合は if(gap > 20) の値を大きくしてください。ループの外で新しい変数を宣言する必要があります。私はコードの冒頭で宣言しました。
int firstTime = 0; // ループ外で宣言が必要
long Distance, auxDistance, gap = 0;
void loop() {
Distance = measureDistance(trigPin, echoPin);
gap = abs(Distance - auxDistance); // 前回との差分を計算
if(firstTime == 0){ // 安定化のため必要
auxDistance = Distance;
gap = 0;
firstTime++;
delay(1000);
}
if(gap > 20){ // 20cm以上の変化があれば
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201); // 2番目のフォルダの1曲目を再生
firstTime = 0; // エラー防止
delay(2000);
}
Serial.print("New Distace:");
Serial.print(Distance);
Serial.print(" Old Distance: ");
Serial.print(auxDistance);
Serial.println(gap);
delay(300);
auxDistance = Distance; // 次回ループ用に保存
}
両方を組み合わせる Version 3: 2つの距離センサーで方向検知
2つの距離センサーを使うと、移動方向を推測できます。人の移動方向に応じて「こんにちは」または「さようなら」を再生するプログラムを作りました。
- 第2のHC-SR04用に2つのデジタルピンを追加定義:
#define trigPin 13 // 第1距離モジュール用
#define echoPin 12
#define trigPin2 10 // 第2距離モジュール用
#define echoPin2 9
- 新しい変数!
long Distance, auxDistance, gap = 0;
long Distance2, auxDistance2, gap2 = 0; // 新しい変数
setup()で新しいピンを宣言:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
measureDistance()関数を引数でピンを指定できるように変更:
long measureDistance(int trigger, int echo){
long duration, distance;
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH);
distance = (duration/2) / 29.1;
Serial.println("distance:");
Serial.println(distance);
return distance;
}
loop()での処理:
void loop() {
Distance = measureDistance(trigPin, echoPin);
Distance2 = measureDistance(trigPin2, echoPin2);
gap = abs(Distance - auxDistance);
gap2 = abs(Distance2 - auxDistance2);
if(firstTime == 0){
auxDistance = Distance;
auxDistance2 = Distance2;
gap = 0;
gap2 = 0;
firstTime++;
delay(2000);
}
if(gap > 20 && gap2 < 20){ // 右側センサーのみ変化 = 右から左へ移動
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);
firstTime = 0;
Serial.println("RIGHT MOVEMENT DETECTED");
delay(2000);
}
if(gap2 > 20 && gap < 20){ // 左側センサーのみ変化 = 左から右へ移動
sendCommand(CMD_PLAY_WITHFOLDER, 0X0202);
firstTime = 0;
Serial.println("LEFT MOVEMENT DETECTED");
delay(2000);
}
// デバッグ出力
Serial.println("\\\\\\\\\\\\\\\\\\\\\\");
Serial.print(" New Distace:");
Serial.print(Distance);
Serial.print(" Old Distance: ");
Serial.print(auxDistance);
Serial.print(" GAP ");
Serial.println(gap);
Serial.print("New Distace2:");
Serial.print(Distance2);
Serial.print(" Old Distance2: ");
Serial.print(auxDistance2);
Serial.print(" GAP2 ");
Serial.println(gap2);
Serial.println("\\\\\\\\\\\\\\\\\\\\\\");
delay(300);
auxDistance = Distance;
auxDistance2 = Distance2;
}
ハッピーハッキング!
製造プロセス
- 家庭用の低コストワイヤレスセンサーネットワークを構築
- K30 CO2センサで室内空気質をリアルタイム監視する
- デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino UNOとDFPlayer Miniで音声を再生する方法 - ステップバイステップガイド
- Arduinoウェブ制御MP3プレーヤー:ブラウザから簡単オーディオ再生
- ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
- Arduino Nanoで作るスマートな動体検知水鉄砲
- Arduino UNO + WiFiシールドで温度をWebリアルタイム表示 — シリアル出力だけでグラフ化
- コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
- Arduino UNOで作る静電容量式タッチLEDスイッチ - 簡単DIY