※当サイトではアフィリエイト広告を利用しています

電子工作

ArduinoNano/DFPlayer/マイクロスピーカーで小型MP3プレイヤーを作りました

arduinonano-mp3player_thumbnail

 タイトルにある通り、先日ArduinoNanoを使用して小型MP3プレイヤーを作りました。

 僕は毎晩寝る前に決まったストレッチ動画を見るというのがルーティーンになっているのですが、スマホで毎回動画を再生するのが面倒だなと思っていたのです。そこでArduinoNanoを使用してストレッチ音声1曲だけを流す専用のプレイヤーを作りたいと思うようになりました。家の隅に常時置いておいて、ストレッチがしたくなったときにワンボタンで再生できるようにしたいのです。

 当初はどのように製作してよいか分かりませんでしたが、ChatGPTの助けを借りつつ、いくつかトラブルもありながら、無事完成させることが出来ました。

製作に必要なもの

 そもそも電子工作でどの部品を使えばMP3が再生できるか分からなかったので、早速ChatGPTに相談します。
 何度か往復した後、以下の部品を使えばよいということが分かってきます。

arduinonano-mp3player_07

 MP3データの読み取りですが、DFPlayerという外部モジュールを使えばSDカードからデータを読み取り、スピーカーに音声を出力できるそうです。当初は家に余っていたESP32を使って、いざというときにはWi-Fiで操作できるようにしたかったのですが、ESP32って3Vしか出力できないんですね。今回使用するスピーカーが5V駆動なのでESP32では出力が足らず。ということで5V出力ができるArduinoNanoを使うことにしました。

 

難解なDFPlayer制御コード

 とりあえず見切り発車的に各アイテムを購入。購入したはいいものの制御するためのコードをどのように書けば分からなかったので、とりあえずChatGPTに「ボタンを押したら曲が再生されるプログラム」を出力してもらいました。

 ・・・

 ・・

 ・

 長いし、どのコードが何やってるかサッパリ分からん。

 とりあえずサンプルで出してもらったコードに対して一行一行個別に追加質問していくことでなんとか出力してもらったコードについては理解できました。

 

構想書を作成する

 大まかにDFPlayerで制御できることが分かったところで、構想書を作成します。
 今回何をやりたいのか、何を試してみたいのか、そういった道筋を示したものを用意しないと行き当たりばったりになってしまうので僕は電子工作をやる際には必ず作るようにしています。

今回やりたいこと

  • ArduinoNanoを使用したMP3プレイヤー
  • ボタン一つで再生制御を行う
  • 省電力化のためにスリープモードを導入する
  • 音量については不揮発メモリに保存する

 「ボタン一つで再生や停止を制御するのであれば状態遷移がいるな」とか「処理は可読性やメンテナンス性の向上のためにモジュールは細かく分割したほうがいいな」と考えて構想書を作成します。

 そして出来上がったのが以下のペライチドキュメント。

arduinonano-mp3player_01

設計/実装上の困難

arduinonano-mp3player_02

ChatGPT5に不正確な情報を流される

 2025年9月現在、ChatGPTがVer4からVer5にアップデートされたのですが、これがどうもプログラミングコードに関しては不正確な情報を出力することが度々あり、そこで色々と苦労をさせられました。

 ArduinoNanoでFreeRTOSを使用して定周期タスク制御を行おうとして、タスク制御用のコードを出力してもらったのですが、それが何度コンパイルしてみてもエラーが出る。Arduinoを使用してFreeRTOSを使う場合は#include <Arduino_FreeRTOS.h>を使わないとダメなんですよね。

 まさかこんな単純なヘッダファイルのインクルードミスをChatGPTが引き起こすとも思わず、「なんでエラーが起きるんだ!?」と何時間も時間を浪費してしまいました。

 

ボタン(スイッチ)制御の切り分け方

 今回はひとつのボタン(スイッチ)で色んな制御を行おうと目論んでいたわけですが、いざ自分が設計/実装するとなると意外と難しい。「ボタンを素早く2回押しで音量変更」と言っても、「普通に1回ボタンを押す」と「素早く2回押す」をどう切り分ければよいのか。

 ChatGPTに相談してみたところ、やたら難しいロジックを考案されたので、こちらが理解できずにChatGPT案は却下。色々と考えを巡らした結果、「1回目のボタン押下から1秒以内に再度ボタンが押されたら『素早く2回押し』と判定する」というロジックとしました。

スリープに入らない

 今回挑戦してみたかったスリープ制御。

 開発の現場ではよく聞く制御ですが、自分は担当領分ではなかったため傍からいつも眺めていただけですが、自分でも一度動かしてみたいということで挑戦してみました。最終的には電池でこの小型MP3プレイヤーを駆動させたかったので、なるべく省電力にしたかったのです。

 スリープ制御については全く分かっていなかったので、ここでもChatGPTに相談します。

arduinonano-mp3player_04

 スリープに入るとRAMで保持していたデータはリセットされてしまうかと思っていたのですが、ChatGPTによると保持されるとのことでした。また一度スリープに入ると復帰するのにそれなりに時間がかかるのかなとも思っていたのですが、ChatGPTに出力してもらったサンプルコードを試してみると一瞬で復帰したので驚きました。これなら細かくスリープに入って電力を節約しても特にデメリットはなさそうです。

 ところがサンプルコードを動かしているときは良かったものの、このMP3プレイヤー制御を織り込んでみると、一度スリープに入ってから復帰が出来ない!

 これもChatGPTに丸ごとソースを渡して解析してもらったところ、スリープに入る直前に以下の通信を止めないと、復帰できないことがあると言われてしまったのです。

  • Arduino⇔PCのシリアル通信
  • Arduino⇔DFPlayerのDFシリアル通信

 なのでスリープに入る直前で以下のコードを追加して、通信を停止することで解決ができました。

無事完成

arduinonano-mp3player_06

 そこまで複雑なロジックではなかったものの、自分でMP3プレイヤーの制御を考えるとなると意外と時間がかかって、トータルで20時間ぐらいかけてしまった気がします。

 当初は電池によるArduinoNanoへの電源供給を目論んでいましたが、ArduinoNanoは電源供給方法がUSB Type-Cしかないので簡単にはいかず、ここは諦めました。代わりにモバイルバッテリーを使って電源供給を行うようにしており、今では毎日寝る前のストレッチに使っています。

 いやー今まで作ってきた電子工作の中でも一番有用なアイテムになりましたね。

本当は完成版のソース一式を出したかったのですが、今回僕が作ったソフトは現場のコーディングルールにゴリゴリ従ってコードを書いているので表には出せないものとなりました…(同じ職場の人に見られたら一発で同業だとバレるので)

電子工作のススメ

 ChatGPTのようなAIが登場した昨今、電子工作へのハードルは劇的に下がっており、特に駆け出しエンジニアの方にとってはぜひ挑戦してほしいアクティビティだなと思っています。

電子工作をやるメリット

  • プログラムに対する理解が深まる
  • 自己肯定感が高まる
  • 今後の転職の際の武器になる

プログラムに対する理解が深まる

 やっぱり自分の手で動かして失敗してみて/成功してみてという経験は非常に重要だと思うんですよ。

 それなりに歴史のある開発現場だと過去の失敗事例がコーディングルールとして体系付けられているので、ルールに従えば大きく失敗することなくプログラムを作れてしまいます。ですが「なぜそのルールが存在しているのか」というところに思いを馳せれている状態で開発をやれているか否かってソフトの品質や、本人の仕事の楽しさに大きく影響します。

 僕自身の経験で言えばお恥ずかしい話ですが、エンジニアになって1年ぐらいが経過して初めて電子工作に挑戦して、その段になってやっとヘッダファイルが何のために必要になってくるか理解できました。列挙体も「なんでこれ使うんだろ。別にdefineマクロで良くない?」と思っていたところ、自分で作ったプログラムがそこそこ大きくなって手戻り的にあとから各所に修正をいれる際に「あー! こういうときに修正不要になるから列挙体ってあるんだ!!」と腹落ちすることが出来ました。

 そういった実感を得てからは実装でのミスが大幅に減りました。

 

自己肯定感が高まる

 自分が元々文系大学上がりの事務職人間だったこともあって、こういうプロダクト(というにはあまりにも小規模なアイテムですが)を生み出せると自己肯定感が高まります。

 Arduinoを使用してMP3プレイヤーを作るなんて10年前には思いつきもしませんでしたし、それを実行して完成にまで持っていけるなんて自分でも驚いています。

 

今後の転職の武器になる

 電子工作をやるメリットって割とこれが一番デカいかなーと思っています。

 転職の面接の場で自分のスキル感を伝えるのって非常に難しいのですが、こうやって自分が作成した電子工作をポートフォリオにまとめて面接に持っていくとすごく喜ばれるんですよね。

 何のために電子工作を行ったかであるとか、その電子工作を行うことでどんな学びがあったかも簡単にまとめられると非常に良いです。僕の場合でいうと今回は「いつも聞いているストレッチ音声を手軽に流せるようにしたい」ですし、電子工作を行う上で「ボタン制御の方法」「スリープの動作の理解」「不揮発メモリ(EEPROM)の使い方」が理解できました。

 

 以上がArduinoNano/DFPlayer/マイクロスピーカーで小型MP3プレイヤーを作った報告となります。

 ChatGPTを使いこなせば非常に簡単に電子工作が出来てしまうので駆け出しエンジニアの方は是非挑戦してみてください!

関連記事
job-interview-with-powerpoint
転職の面接ではパワポで自分の強みをプレゼンしろ!

口下手が故に転職の面接でうまく自己PRができない 「○○について聞いてくれていたらもっとうまく喋れたのに」と面接後によく後悔する 自己PRをうまく行う方法について知りたい 今回はこのような疑問にお答え ...

続きを見る



-電子工作
-

© 2025 名古屋とエンジニアリング