🎀

Arduinoと超音波距離センサーでいつでもご帰宅

に公開

はじめに

先日、初めてメイドカフェへ行きました。
その時の体験をいつでも味わうため、Arduino、超音波センサー、MP3プレーヤーを使用して、お皿をおくと愛を込めてくれるシステムを作りました。

同じことを考えた人がすぐにシステムを作れるよう、作成手順を記事にしておこう、という感じです。

必要な部品の購入

まずは必要な部品を購入します。
自分は抵抗器のみAmazonで購入しましたが、他はすべて電子工作ステーションで購入しました。
購入時の金額を参考に記載しておきます。

  • Arduino UNO R3互換ボード
    ¥1,110
  • Arduino用通信ケーブル
    ¥120
  • ブレッドボード
    ¥230
  • 抵抗セット30種類 各20本入り(1kΩが1本あればいいです)
    ¥649
  • 超音波距離センサー
    ¥295
  • ラウドスピーカー
    ¥150
  • DFPlayer mini(MP3プレーヤー)
    ¥270
  • microSDカード 32GB
    ¥1,031
  • ジャンパーワイヤー(オス・オス) 10本*2セット
    ¥220
  • みの虫クリップ 赤
    ¥70
  • みの虫クリップ 黒
    ¥50

合計:¥4,195

抵抗器は1kΩが1本あれば大丈夫です。
でも抵抗器1本だけ買うってなに?となったので、amazonでセットのものを購入しました。
ジャンパーワイヤーは1セットで足りますが、同じ色を2本使いたかったので2セット購入しました。

蛇足

今回購入したArduinoはピンヘッダがついていなかったので、自分ではんだ付けしました。
はんだが全然溶けなくてすごく難しかったです・・・

配線

部品が揃ったら、Arduinoとセンサー達を以下の図のように繋げていきます。

参考:https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299#Sample_Code

参考にさせていただいたサイトの配線に、超音波センサー部分を追加しました。
ありえないぐらい見づらいですが、一応自分が配線した写真も載せておきます。


自分の配線

SDカードに音声を入れる

次に、このシステムの核となるかわいいボイスをSDカードに書き込みます。
素敵な音声はニコニ・コモンズからお借りしました。
https://commons.nicovideo.jp/works/nc25534

SDカードにフォルダなどをつくらず、MP3データをそのまま入れます。
自分は使ってるPCにカードの差し込み口がなかったので、メモリカードリーダライタを使って書き込みました。

コーディング

物理世界でできる準備が整ったので、コーディングをしていきます。
Arduinoのプログラムを書くために、Arduino IDEをダウンロードします。
https://www.arduino.cc/en/software/

次に、Arduino IDEでDFPlayer miniを使えるようにするため、
「DFRobotDFPlayerMini.h」をインストールします。

<インストール方法>
ツールからライブラリを管理 を選択

ライブラリマネージャが出てくるので、DFRobotDFPlayerMiniと入力

これをインストールすればOKです。


コードを書いていきます。
超音波センサーで距離を計測し、4cm以内に物体が近づいたことを検出した場合に、
一度だけ音声が再生されるようにします。

loop()内で距離を計測しているので、距離が近づいたタイミングで単純に音声を流すと
無限もえもえをされてしまいます。

そのため、nearというフラグを使って、音声再生後は一度距離が離れるまで
音声を流さないようにします。

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define echoPin 2 // Echo Pin
#define trigPin 3 // Trigger Pin

double Duration = 0; // 受信した感覚
double Distance = 0; // 距離

bool near = false;

// IO10をRX, IO11をTXとしてアサイン
SoftwareSerial mySoftwareSerial(10, 11); 
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);

  Serial.begin(9600);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  // DFPlayerを初期化します。USBピンを使ってなければ、デバイスはSD(TF)カードが選択されます。
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    // 2秒以内に初期化できなかった場合はエラーメッセージを表示
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true) {
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(30);  // ボリュームをセット。(ボリュームは0から30の値で指定可能)
}

void loop(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); // 超音波を出力
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  Duration = pulseIn(echoPin, HIGH); // センサからの入力
  if(Duration > 0){
    Duration = Duration/2; // 往復距離を半分にする
    Distance = Duration*340*100/1000000; // 音速を340m/sに設定
    printDistance(Distance);

    if(near){
      // 距離が6cm以上離れている
      if(Distance > 5){
        near = false;
      }
    }else{
      // 距離が4cm以内に近づいている
      if(Distance < 5){
        near = true;
        myDFPlayer.play(1);  // 先頭のmp3ファイルを再生
      }
    }
  }
  delay(500); // 取得感覚0.5秒
}

void printDistance(double Distance){
    Serial.print("Distance:");
    Serial.print(Distance);
    Serial.print(" cm");
    Serial.println();
}

void printDetail(uint8_t type, int value) {
}

コードが書けたので、PCとArduinoを通信ケーブルで繋ぎ、Arduino IDEで書き込みします。

動作確認

こんな感じでログを吐きながら動いてくれます。

動画

https://youtu.be/-wYPf_Qzklc

いい感じです。

終わりに

これでいつでもお家でご帰宅ができます。素晴らしいですね。
Arduinoは本当に色々できそうなので、また何か作ってみようと思います。

以上です。

参考記事

今回の制作にあたって、とっても参考にさせていただきました。
ありがとうございます。

間違っている部分やわかりにくい部分があれば、教えていただけるととってもありがたいです。

Discussion