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

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つの距離センサーを使うと、移動方向を推測できます。人の移動方向に応じて「こんにちは」または「さようなら」を再生するプログラムを作りました。

#define trigPin 13  // 第1距離モジュール用
#define echoPin 12
#define trigPin2 10 // 第2距離モジュール用
#define echoPin2 9
long Distance, auxDistance, gap = 0;
long Distance2, auxDistance2, gap2 = 0; // 新しい変数
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
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;
}
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;
}

ハッピーハッキング!

製造プロセス

  1. 家庭用の低コストワイヤレスセンサーネットワークを構築
  2. K30 CO2センサで室内空気質をリアルタイム監視する
  3. デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
  4. DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
  5. Arduino UNOとDFPlayer Miniで音声を再生する方法 - ステップバイステップガイド
  6. Arduinoウェブ制御MP3プレーヤー:ブラウザから簡単オーディオ再生
  7. ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
  8. Arduino Nanoで作るスマートな動体検知水鉄砲
  9. Arduino UNO + WiFiシールドで温度をWebリアルタイム表示 — シリアル出力だけでグラフ化
  10. コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
  11. Arduino UNOで作る静電容量式タッチLEDスイッチ - 簡単DIY