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カードに書き込みます。
素敵な音声はニコニ・コモンズからお借りしました。
SDカードにフォルダなどをつくらず、MP3データをそのまま入れます。
自分は使ってるPCにカードの差し込み口がなかったので、メモリカードリーダライタを使って書き込みました。
コーディング
物理世界でできる準備が整ったので、コーディングをしていきます。
Arduinoのプログラムを書くために、Arduino IDEをダウンロードします。
次に、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で書き込みします。
動作確認
こんな感じでログを吐きながら動いてくれます。
動画
いい感じです。
終わりに
これでいつでもお家でご帰宅ができます。素晴らしいですね。
Arduinoは本当に色々できそうなので、また何か作ってみようと思います。
以上です。
参考記事
今回の制作にあたって、とっても参考にさせていただきました。
ありがとうございます。
- https://toccho.net/2022/12/10/dfplayer-mini-arduino/
- https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299#Sample_Code
間違っている部分やわかりにくい部分があれば、教えていただけるととってもありがたいです。
Discussion