はじめに
Youtubeに持ち運んで使える発車メロディスイッチを作る動画があり、これを見て作ってみようと思いました。ほかにもPCに繋げてスイッチ操作で音楽が流れるようなものもありますが、コンセプトはこの動画のようにスイッチ単独で動作できることです。
電子工作やプログラミングの知識や経験は全くありませんが、初心者でも一通り作成できることを紹介します。
コンセプト
- PCに繋がずスイッチ単独で動作できること
- スイッチONで発車メロディがリピート再生されること
- スイッチOFFで「ドアが閉まります」アナウンスが一度だけ流れ、ストップすること
- 発車メロディはランダムに再生されるようにすること
- スペース的にスイッチ内に電源内蔵は難しいため、USBケーブルを使用して電源はコンセントまたはモバイルバッテリーとすること
用意するもの
スイッチ:動力用押ボタン開閉器BSW215B3
駅で実際に使われているものです。これがないと始まりません。
MP3プレイヤー:DFPlayer mini
マイクロSDカード
マイコン:Arduino Nano互換ボード(ATmega328P)(Type-C)
Arduino Nano正規品はUSB Type-Bです。
スピーカー
リード線
抵抗:金属皮膜抵抗 1/4W ( 1kΩ)
USBケーブル
はんだごて:鉛フリーはんだ対応デジタル温調はんだこて PX-280
はんだごて初心者の私が一番苦労したのは、はんだごてをどれにするかでしたが、結果的には調温機能があるものがおすすめです。はんだ付けは技術ではなく道具選びが最も重要で、最初は100均ショップで売っているものを試してみましたが、全く使い物になりませんでした。成功の可否を左右するため、はんだごては信頼できるしっかりとしたものを使用します。デジタル表示のあるものを購入しましたのでご紹介します。
はんだごて台:はんだこて台 セラミックこて専用 ST-77
はんだごて台は安全に作業するために必須です。こて台はニクロムはんだごて用とセラミックこて用があり、使用するはんだごてに合ったこて台を使用します。
はんだ:精密プリント基板用 SD-82
はんだ吸取線:ディスペンスケースタイプ CP35Y
はんだ吸取線という存在を知らなかったのですが、はんだを誤ってつけてしまったり、多すぎたときに除去できるものです。この吸取線はボビンタイプもありますが、ディスペンスタイプのほうが吸取線の保持がしやすく使い勝手が良かったです。
作り方
大きく分けて次のステップで実施します。
- 音源を用意してSDカードに入れる
- Arduinoのプログラミングを作成し書き込む
- 配線し、スイッチのケースに格納する
SDカードへの音源保存
意図通りに動作できるか事前に確認しながら作成したため、今回はこのような感じで名前をつけて保存しています。フォルダは作成せず直下にファイルを保存し、名前は数字を1から順番に付けています。
2は戸閉放送でそれ以外を発車メロディとしています。
Arduinoのプログラミング
やりたいことは「スイッチONの間は2曲目を除外してランダムに選ばれた曲をループ再生し、スイッチOFFの際には必ず2曲目を1回再生して停止」することです。
Arduinoのプログラミング環境を整える
まずはArduinoのプログラミング環境を準備する必要があります。
ArduinoのHPからソフトウェアをダウンロードします。
Arduinoの基本設定
メニューバーのファイル>基本設定を選択し、基本設定画面からエディタ言語を日本語にする
ライブラリマネージャーで、dfplayerと入力し、DFRobotDFPlayerMiniをインストール
似たようなものがいくつか出てくるので、間違えないよう注意する
ツール>ボードでArduino Nanoを選択 表示されないときはPCとArduinoをUSBケーブルで接続
プログラムを書き込む
以下のコードをコピペする
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
SoftwareSerial mySoftwareSerial(4, 5); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
const int switchPin = 2;
const int stopSong = 2; // スイッチオフ時に必ず再生される曲の番号
const int totalSongs = 52; // 総曲数
int currentSong = 1; // スイッチオン時に再生される曲の番号
bool isRepeating = false;
unsigned long debounceTime = 50;
unsigned long currentTime;
int lastButtonState = HIGH; // 初期状態はHIGH(スイッチが押されていない)
int buttonState;
bool isPlaying = false;
void setup() {
pinMode(switchPin, INPUT_PULLUP); // 内部プルアップを有効にします
mySoftwareSerial.begin(9600);
Serial.begin(9600);
if (!myDFPlayer.begin(mySoftwareSerial)) { // Use softwareSerial to communicate with mp3.
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);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(30); // Set volume value to maximum (0 to 30)
randomSeed(analogRead(0)); // ランダムシードを設定
}
void loop() {
currentTime = millis();
int reading = digitalRead(switchPin);
// スイッチが押されている間(LOW)ランダムな曲をループ再生
if (reading == LOW) {
if (!isRepeating) {
do {
currentSong = random(1, totalSongs + 1); // 1からtotalSongsまでのランダムな曲を選択
} while (currentSong == stopSong); // stopSong(2曲目)を除外
myDFPlayer.loop(currentSong);
isRepeating = true;
isPlaying = true;
}
}
// スイッチが離された場合(HIGH)
else {
if (isRepeating) {
delay(800); // 1秒待機
myDFPlayer.play(stopSong); // 2曲目を再生
delay(7000); // 2曲目の再生時間を待つ(必要に応じて調整)
myDFPlayer.stop(); // 曲の停止
isRepeating = false;
isPlaying = false;
}
}
lastButtonState = reading;
}
Arduinoにコンパイル、書き込みをします。うまくいかない場合はProcessorの設定を確認してください。
部品の配線
回路図
回路図は以下の通りです。
はんだ付けの作業を写真に収められず様子がわかりにくいですが、ケーブルの被覆を4mm程度はがし、動かないように固定しながらはんだ付けを行います。
完成した状態の内部
試行錯誤
当初は部品を基板にはんだ付けしていましたが、これだとスイッチ内に収めることが難しいため、部品をケースにそのまま取り付けることにしました。
基板付きの試作
はんだ付けの回路図はネットで色々出てきますが、Arduinoのプログラムは自力では苦戦すると思います。そこでChatGPTを活用し、トライ&エラーを繰り返してなんとかたどり着きました。今回はプログラムのコードを最適化することではないので、プログラムの中身についてはあまり理解していません。プログラミングを覚えるより、自動で生成するほうがゴールまで近道になると思います。
コメント