カビパン男と私

HOME/横書き縦書き

mp3 ジュークボックスの製作

製作の動機

いつも音楽をパソコンを使って聴いているが、だんだん不便を感じ始めた。まず、フォルダを順々に開いて目的の楽曲のファイルを見つけ出さなくてはならない。たとえば、ハイドンのピアノソナタ 1 番を聴きたいとする。ホーム→音楽→クラシック→ハイドン→ピアノソナタ全集→第1巻、という具合だ。それぞれのフォルダをダブルクリックするとして、ここまでで 6×2=12 回のクリックを行わなくてはならない。そして最後に目当てのファイルをダブルクリック。つまり 14 回右手の人差指をせわしなく動かさなくてはならない。もしもあらかじめパソコンが立ち上がっていないならば、これに加えて電源スイッチを入れ、ログインするためにパスワードを打ち込む手間がかかる。

これに対し、番号を打ち込めばそれに対応する楽曲ファイルが再生される仕組みならば、番号の桁数だけ指を使えば済む。ようするに、ジュークボックスの UI だ。もちろん、そのためには楽曲名と再生のための番号の対応表を見る必要が出てくる。

かかる手間を総合的に考えてみると、断然ジュークボックス方式のほうが楽そうだという結論に至った。はじめは面倒かもしれないが、慣れてくれば対応表のどこにどの楽曲があるか見当がつくので効率が良くなるだろう。

ただし、このジュークボックス的なものがパソコン上のアプリケーションとして動くのでは有り難さは半減以下である。アプリを立ち上げるのに手数がかかるし、立ち上がるのを待っている時間は愉快なものではないからだ。そこでパソコンと独立したジュークボックス装置を製作することにした。

製作の真の動機

たまには思いきりハンダ付けがやりたかった :-)

試作

DFPlayer mini は mp3 等を再生するモジュールで、安価(1000円ほどだった)で普及したものだ。同モジュールは Micro SD カードを入れるスロットがあって、カードの中の楽曲を再生してくれる。これをマイコンからシリアル通信で制御するのが、最も手軽だろう。メーカーで、Arduino 用のライブラリを用意しているから、これを利用すれば至極簡単である。シリアル通信をするために消費するピンの数は 2 つ。そのほか演奏中かどうかを検出するために使うピンが 1 つあって、マイコンは合計 3 つのピンを消費する。

番号を入力するためのキーパッドは、秋月電子のキーパッド・キットが 350 円ほどだった。タクトスイッチを 4 行 3 列に並べたものである。これをマイコンから読み取ればよい。必要なピンの数は 8 本である。

入力された番号を表示するのは 7 セグ LED 4 桁を使う。シフトレジスタ経由で 3 本(データ、クロック、ラッチ)、LED のほうに 8 本(ドットを示す LED も使うことにする)のピンを食われる。

合計 19 本のピンがあればよいので、Arduino UNO なら 1 本ピンに余裕ができる。このピンにかかる電圧を可変抵抗器で変えれば、その電圧を読取って DFPlayer mini 側に音量の変更を指示できるはずだ。

ということで Arduino UNO とブレッドボードを使って試作してみると、いくつか問題点を解決する必要があった。

問題点1 DFPlayer が雑音を発する。ブッ、ブッ、ブッという間欠的なノイズが聴くに耐えないくらいの大きさで入るのである。DFPlayer に GND ピンが 2 つあるが、そのうちの 1 つをグランドに繋がずにイヤホン出力専用にするとこの雑音が出ないということを発見した。どうしてそうなるのかは、わからないし、他の個体でどうなるのかもわからない。

問題点2 DFPlayer が Micro SD カード内のフォルダ数の読み取りに失敗する。DFPlayer を作成しているメーカーが提供しているライブラリを見ていると、シリアル通信のタイムアウトを設定する変数があったので、タイムアウトまでの時間を伸ばしてやったら解決した。

ケースに入れる

机の上を 3 枚のブレッドボードに占領されている状態はいかにも欝陶しいし、何かの具合でジャンパー線を引き抜いてしまうのも嫌なので、ケースに収めることにした。

Arduino UNO ごとケースに収めるとかさばるから、Arduino UNO に入っているのと同じ ATmega328p を使う方針にする。プリント基板など作る予算がないから、秋月のユニバーサル基板(B基板)を利用することにした。

また、5V の電源確保およびファームウェアの書き換え用に USB シリアル変換モジュール(AE-CH340E 使用で USB Type-C のが安かった)を購入した。

少し悩んだのが、4 桁の 7 セグ LED をどうケースに固定するかだ。透明 ABS ケースを使えば基板からピンソケットで下駄をはかせた LED が具合よく見えることに気づいた。頑丈さには問題があるが、気分で別の色の LED モジュールに差し替えられるといういい面もある。

ABS ケースは、ちょうつがい式のものであるが、これは Micro SD カードを抜き刺しするためには便利だった。

レイアウトの都合上、USB シリアル変換モジュールはメインの B 基板ではなく、その下にもぐり込ませた別の小さな基板を利用することにしたが、その結果、メインの基板から出るビニール被覆線の数は、キーパッドに 8 本、電源スイッチに 2 本、可変抵抗器に 3 本、USB シリアル変換モジュールに 6 本、イヤホンに 3 本、合計 22 本ということになった。これではコネクタを使わないと手に負えそうもない。差し替えの便利を考えて基板にはピンヘッダつけて QI コネクタを使うことにしたが、キーパッドはスペースの節約のため hx コネクタにした。

楽曲ファイル

DFPlayer mini が読み取れる Micro SD カードは 32GB までである。カードの最上位の場所に 99 個のフォルダ、各フォルダに 255 のファイルを入れることができる。私はハイドンの CD 100 枚以上を入れたが、まだ半分以上余裕がある。曲のファイルは、フォルダ 01 から順に、きっちり 255 ファイルずつコピーしていった。ユーザーは楽曲と番号の対を印刷した冊子を見て、聴きたい楽曲番号をキーパッドから入力。それを受け取ったマイコンは、DFPlayer mini にいくつ目のフォルダのいくつ目のファイルを演奏せよという指令を出す(Micro SD カードにコピーされた順番によって何曲目かが決まる)。

2500 個以上の楽曲ファイルをこの装置に入れたが、それだけの楽曲と番号を対応させるリストの作成は案外大変で CDDB で曲名を取得した上で、リスト作成から Micro SD カードへコピーを行うスクリプトを書いて処理する必要があった。

UI

UI の方針は、LED の表示だけ見て現在の状態が完全にわかること。同じ表示が文脈によって異った意味を持たないこと。

4 桁の数を入れるとそれだけで再生が開始。
0000 はランダムに再生。
* ボタンで一時停止または再生再開
# ボタンで、再生中・停止中にかかわらず次の曲を再生
数を打ち込む途中で * を押すと入力取り消し

結果として、たいへん易しい UI が実現した。最も簡単に使える mp3 プレイヤーに属するのではないかと思う。

あきらめた機能

連続再生は思い切り良くあきらめた。複数の楽章からなる曲は、前の楽章の再生が終了後 # を押さないと全楽章を聴くことができない。これは不便なようでいて、悪くなかった。

シフトレジスタのピンのうちの 1 本を low にするか high にするかで LED 表示/非表示をセットできるが、これは使わずに常に LED 表示されることにした。

DFPlayer mini にはモノラルながらスピーカ出力が可能である。スピーカーにつなげるソケットを設けようかとも思ったが、割愛。

DFPlayer mini は、USB メモリをつないでそこから楽曲を再生することが可能。このためのピンヘッダも基板につけたが、どうせ使わないし面倒だから配線しなかった。

感想

音楽もサブスクリプションが全盛である。しかし、CD にしてせいぜい数百枚の手持ち音源をヘビーローテーションするという聴き方ならば、ジュークボックススタイルの再生装置は大変便利である。また、スマホやパソコンと独立して使える専用機というのはやはり手軽である。

@kabipanotoko