Radiko Jukebox製作記(Raspberry Pi)

# はじめに

Raspberry Pi Zero W を使ってradikoを再生するだけの専用機を作ったのでその時の奮闘記をまとめてみました。

Raspberry PiでのプログラミングよりもAutodesk Fusion 360での3Dモデリングとジュークボックスの箱を作ることに時間を割いたのでQiitaの投稿としてはあんまりふさわしくないのかもしれないなと思いつつも電子工作や3Dモデリングに興味を持ってくれる人もいるかもしれないと思い、また自分の記憶を書き留めておきたかったということもあり記事にしてみました。誰かのご参考になれば。

なお、今回の製作は業務ではなく完全なるプライベートな時間でやったものです。

# 使用した主な技術・部品

- Raspberry Pi Zero W + Raspberry Pi OS(bullseye)
- Arduino Nano
- Autodesk Fusion 360 (3Dモデリング)
- レーザーカッター

# 作った動機

今回の作品を作るにあたっては以下の動機がありました。

- 社内メイカースペース(KM1)ユーザーの展示会と9/3(土),4(日)の[Maker Faire Tokyo 2022](https://makezine.jp/event/mft2022/)に展示しようという流れになったので何か作ろうと思い立った。(KM1については[この記事](https://makezine.jp/blog/2022/08/toshiba_creative_circuit.html)を参照。)
- 在宅勤務でたまにradikoでFMラジオを聞きたくなるが、スマホでアプリを起動するのは面倒だし、amazon echoでは再生できるけど「この曲なんだっけ？」という時に知るすべがない。
- radikoの楽曲情報を取得できることは知っていたのでそれを組み合わせれば面白いかも。

# ダンボールによる試作品

## 最初の実装仕様

最初に頭の中で考えた実装の仕様は以下のとおりでした。

- Raspberry Pi 3のイヤホンジャックにスピーカーを繋いで鳴らす。
- ジュークボックスのような外観にする。
- Neopixelでピカピカ光らせる。
- 4inch のディスプレイで pythonで現在再生されている放送局と流れていた曲を3曲履歴を表示する。 → すごく小さいOLEDにしたので仕様変更

## pythonでのradikoの再生方法

実装は、Raspberry Pi を使うことを最初から想定し自宅にあったRaspberry Pi 3を使うことにしました。インターネットで調べてみるとradikoを再生するには streamlink とmpv を使えば良いことがこちらの記事「[ラジコを聞く～その２～ ? ピントくる](https://pingtocool.com/?p=310)」でわかったのでそれを参考に以下の通りにインストールしました。

```
sudo apt-get install mpv
python3 -m pip install streamlink
```

上記ページに書いてあったとおりに以下の内容を radiko.sh として作成し、

```
#!/bin/sh
~/.local/bin/streamlink -p mpv http://radiko.jp/#!/live/$1 best
```

これで`radiko.sh FMT`と実行すると`FM Tokyo`が再生されるようになりました。ちなみにJ-WAVEなら`FMJ`です。

上記はstreamlinkでラジコのストリーミングを取得して、mpvというメディアプレーヤーでそれを再生しているのですがstreamlinkでストリーミングを取得して、mpvで音が再生されるまではかなり時間がかかります。(30sec?1min程度)

mpv以外にもvlc, ffplayといったプレーヤーでも再生が出来ました。そちらについては「 [Raspberry Pi Streamlinkでradiko再生](https://dbpro.xyz/10314)」を参照してください。

再生されるようにはなったもののイヤホンジャックに繋いだアンプなしのスピーカーではボリュームが小さすぎて音がほとんど聞こえないのでアンプ付きのBluetoothスピーカーのAUX INに入力することでまともに音が聞こえるようになりました。

## LCD(OLED)での曲情報の表示

radikoの曲情報の取得方法については以前調べていた[こちら](https://note.com/gadgetking/n/n3d4f204f79bd)に書いてあるとおりです。JSONで各放送局における曲情報が取得できますがNHKについては残念ながら取得できません。

取得した曲情報（アーティスト名、曲名）を表示するためにRaspberry Piで使えるLCDを検索。楽曲情報を表示するためには日本語も表示できるようにする必要があるためそのようなものを探しました。

結局、「[Raspberry PiでOLEDに文字表示](https://101010.fun/iot/raspi-oled.html)」に書いてあるものを真似して、I2C接続の「DSD TECH／OLED 0.91インチディスプレイ」を使うことにしました。

インストールは上記ページに記載の通りで以下の通りです。

```
$ sudo pip3 install adafruit-circuitpython-ssd1306
$ sudo pip3 install adafruit-blinka
$ sudo pip3 install pillow
$ sudo apt-get install fonts-noto-cjk
```

adafruit-circuitpythonのサンプルコードを試し、適当に文字表示をスクロールできるようにしてみたりでひとまず楽曲情報が表示出来る目処が立ちました。

## Neopixelでピカピカ光らせる

実はジュークボックスで検索して出てくるような実物のジュークボックスが動いているところを見たことがないのですが、なんとなくネオンランプがピカピカしているんだろうと想像して、それと同じようなことをフルカラーで色表現出来るNeopixelで実現しようと考えました。

Neopixelはこれまで何度か使ってきましたが、過去にRaspberry Piで使った時に他のデバイスと干渉してしまってうまく点灯させられなかった経験があったので使うことを少し躊躇しましたが、ひとまず前記のI2CのOLEDと一緒に使っても問題なさそうなことが確認できました。（しかしこれが後々の悲劇に遭遇することになります...）

Neopixelのpythonライブラリは  「https://koehnen.info/2021/02/05/Neopixels-ws2812-and-a-raspberry-pi-zero-w」 を使いました。

インストールは上記ページに記載の通りで以下の通りです。

```
$ sudo pip3 install rpi_ws281x adafruit-circuitpython-Neopixel
$ sudo python3 -m pip install --force-reinstall adafruit-blinka
```

なお、それほど大きな問題ではありませんがこのライブラリを使って動作させる場合は `sudo python3 neopixel.py` としてroot権限を与える必要があるところが注意点です。

これで12個 * 2setをディージーチェーン接続したNeopixelをレインボー表示できるようになりました。

後ほどNeopixelを状態に応じていろんな表示をさせようと思って、こちらのページ([Time-Based Neopixel Fading In Circuitpython With FancyLED - The Collected Works of jjmojojjmojo](https://jjmojojjmojo.github.io/time-based-fading.html))を参考にしようと思っていましたが結果的にはそこまで手が出せませんでした。

## Raspberry Pi 3 から Raspberry Pi Zero Wに変更

なんとなくRaspberry Pi 3を使うのはもったいない気がして、手元にあった小型のRaspberry Pi Zero Wで行けるのではないかと思いリプレースを考えました。

しかしZero Wにはイヤホンジャックがないので、USB接続のスピーカーを繋ぐことを検討しました。この辺の情報([Raspberry Pi Zeroで音を出したい！（USBスピーカーをつけたよ！）｜神楽坂らせん｜note](https://note.com/rasen/n/n0d14689fc095))を参考にして、USB接続のスピーカーを購入することを検討しましたがなかなか良さそうなのが見つからず、結局「[usb to 3.5mm オーディオケーブル USB外付け サウンドカード USBオーディオ変換アダプタ](https://www.amazon.co.jp/USB%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF-USB%E3%83%9D%E3%83%BC%E3%83%88-3%E6%A5%B5%EF%BC%88TRS%EF%BC%89-4%E6%A5%B5%EF%BC%88TRRS%EF%BC%893-5mm%E3%83%9F%E3%83%8B%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF%E5%A4%89%E6%8F%9B%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-X%E3%80%81Linux%E3%80%81PS4%E3%80%81Windows-pro%E3%80%81Chromebook%E3%80%81Raspberry/dp/B08T24GZRM/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2QEJQCC9NQIJW&keywords=%E3%82%B5%E3%83%A0%E3%82%B3%E3%82%B9+usb+to+3.5mm+%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB+USB%E5%A4%96%E4%BB%98%E3%81%91+%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89+USB%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF&qid=1662383436&s=computers&sprefix=%2Ccomputers%2C153&sr=1-1)」を購入。これを使ってZero Wからオーディオ出力することにしました。

## 操作ボタン

ボタン操作であらかじめプリセットしているFM横浜、J-WAVE、TOKYO FM、NHK FMを順番に選局できるようにしました。ボタンは手元にあったごく普通のタクトスイッチを使用し、Raspberry Piにはプルアップ抵抗が内蔵されているので直接GPIOに接続し、2個繋いで一つは選局用、もう一つは再生停止用としました。

## プログラムについて

radikoを再生する部分はpythonのメインスクリプトからsubprocessで前述のradiko.shを起動するようにしました。OLED, Neopixelはそれぞれライブラリとして実装。OLEDライブラリはメインスクリプトにてimportして使うようにしましたがNeopixelは前述したようにroot権限が必要でちょっと厄介だったためにこちらもsubprocessからneopixel.pyを外部プログラムとして起動し、消灯させる場合も同じくsubprocessから `killall neopixel.py` として半ば強引に終了させる方法を採用しました。

なお、radikoを再生する部分も前述したようにstreamlinkとmpvの2つの外部プログラムを起動して行うことになるので同様にsubprocessからの起動と、放送局を切り替えるためには一旦`killall`によってプロセスを終了させてから再度放送局を選択して起動するという手段で実現しました。すべてをpythonだけで再生できるようなライブラリがあればもう少し綺麗に作れたかもしれなかったのですがそこに時間を割くのは諦めました。

メインスクリプトでは他にタクトスイッチの入力とOLEDの表示制御を行っていますがthreadingライブラリを使ってスレッド化して実現しています。

## 一時試作品完成

適当にダンボールをカッターナイフで切って折り曲げて作った粗末なジュークボックス風の箱を作り、OLEDとNeopixelとタクトスイッチが見えるように穴をあけ、用意した部品を適当にテープでペタペタしながら箱に貼り付けました。Neopixelはそのまま見えてしまうとかなり眩しいので拡散させる方法を考えて、ひとまずA4の紙を切って挟むようにしてみたらそれなりに綺麗に見えたのでこれで良しとしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/0e9173b8-c196-83bb-2a28-60a9fc8b47cc.png)

目分量で適当に線を引いて切ったためにかなりいい加減な寸法となってしまいましたがひとまず一通り箱の中に収められました。本当は綺麗にジュークボックスの上の円形の部分を表現したかったのですが、社内展示会向けに作業する時間が足りなかったことと、とある事情でその展示会にはリモートでの参加となってしまったため動作中の動画展示だけすることになってしまったこともあり、手抜きのままでひとまず試作品は完成としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/fb767a3e-fb2e-c770-28f0-5f72c2b4daed.png)

かなり見た目がしょぼいですが、無事(?)に7/15の社内メイカースペース(KM1)ユーザーの展示会を乗り切りました。

# Maker Faire Tokyo 2022に向けた実装

9/3(土), 4(日)のMaker Faire Tokyo 2022に会社の有志メンバーで出展することが最終目標となっていたのでさすがにダンボール仕立ての変なものは出店することが憚れることからなんとかかっこよく作る必要があるだろうとのことでいろいろ検討をしました。

最初、MFD材をレーザーカッターでカットしてジュークボックスの箱を作れば良いかなと思いましたが、会社のレーザーカッターではMFD材をカットさせてもらえないため、ひとまず自力でカットして箱を作ることにしようと考えました。

## スピーカーを購入

イヤホンジャックに繋いだスピーカーではちょっと調子悪いので、ラズパイに接続できるスピーカーを検討したところ、[サウンドカード 拡張ボード スピーカー スターターキット for RPI RPI0 RPI4B らずべりーぱい Raspberry Pi ラズベリーパイゼロ 2 W ラズパイ Zero 2 W WH 3 4 電子工作 セット](https://www.amazon.co.jp/%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89-%E6%8B%A1%E5%BC%B5%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88-Raspberry-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4/dp/B08QH1QQKL)を発見。7/15に即発注しました。しかしこれが届いたのが8/2と2週間もかかってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/4c8b4748-61f7-34d9-e65e-1cecb5bd8c9b.png)


到着してから[WM8960 Audio HAT - Waveshare Wiki](https://www.waveshare.com/wiki/WM8960_Audio_HAT)の情報を参考にセットアップを実施。特に問題なく音が流れることを確認しました。ボリュームを変更する方法はそこでは確認せず、ひとまず音が出たのでめでたしめでたしとしました。（これが後にさらなる悲劇を生む）

## ジュークボックス風にするために上の丸い部分をどう実装するか？

MFD材を切って箱にすることは出来そうだし、ジュークボックスの丸い部分の正面と背面も[ピラニアトルネード糸鋸](https://piranha.co.jp/ps10/)でも使えばなんとか曲線を切れるだろうと思いつきましたが、その天井部分をどうやって丸い形状で作るか。これは本当に悩みに悩みました。来る日も来る日もああでもないこうでもないとジョギングしながら考えました。普通の木を曲げることは到底素人にはできないのでベニヤ板を曲げる方法のYouTubeの動画をみつけたりしてみましたがR10（直径10cm)ぐらいの弧に曲げることはできそうにありません。

薄い板を何枚も重ねて作ることも考えましたが手作業で力ずくで切り出すのは結構しんどいし、全部のパーツがきれいに揃うように切ることもなおさらハードルが高そうです。

なにか良い方法がないかと考えたあげく、カインズホームを物色していたところ「[コルクシート](https://www.cainz.com/g/4905309058201.html?utm_content=addm_cp_ggl_alys_00mc17989881300.56-5643_nt&utm_term=4905309058201&utm_medium=cpc&utm_source=google&utm_campaign=addm_cp_ggl_alys_00mc17989881300&gclid=CjwKCAjw1ICZBhAzEiwAFfvFhPSBXIHOhOd0C_6eWTKIkWb_2R0UAHsNaUdwSXd4zVeVrUrlFYMMVBoC6jEQAvD_BwE)」が目に留まりました。触ってみると良い感じで簡単に曲がります。大きさも丁度よい感じで値段も手頃です。「これしかない、これで行ける！」とこの時確信しました。このコルク板との出会いがなかったら絶対に完成品にたどり着けなかったと今振り返っても思います。

## Fusion 360でモデリング

会社で3Dモデリングを行うためにAutodesk Fusion 360に触れる機会があり、基本的な簡単なものだったら押し出し操作を操ればなんでも作れそうな気がしてきていました。そこでホビーユーザーは無料で使えるとのことで手元のmacにインストールして、今回のジュークボックスで使う部品を全部3Dモデリングし、そこからRadiko Jukeboxの完成形のモデルを作り込んでみることにしました。

OLED, Neopixel, ボタン, スイッチ, スピーカーをひとつずつ、ノギスで寸法を図りながら慣れないFusion 360でちまちまとスケッチに丸や長方形を入力してサイズを入力しては、押し出しをして形を作っていきました。操作に慣れた人なら一瞬で出来そうですが超初心者の私の場合は、中心を合わせる方法が良くわからなかったり、同じ形を均等にコピーする方法がわからなかったりでかなり効率悪く地味な作業を繰り返して作り込みました。（最初から楽をしてはいけない。これは修行だと思い聞かせて。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/b33ad1ba-62d6-81b0-9dc4-51e272ab3b17.png)

ジュークボックスの箱は、20cm * 20cm に、R10の半円を上に組み合わせるサイズで行けそうだったのでそんな形を四角と半円で作って結合させて、肉厚をMFD材の3mmに合わせて「シェル」を使って中をくり抜くということで形を作りました。この形を見た時にこれをそのまま3Dプリンタで出力してしまえばなんの苦労もなく箱が完成するのではないかと頭によぎりましたが、これだけのサイズの3Dプリンティングはとてつもない金額になりそうだったのでそれは忘れることにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/10a182ac-fc52-5e0c-6f39-8c5237a550c4.png)

次にジュークボックスの箱の外形のモデルにそれぞれ作った部品を並べていきました。これがまた超初心者には操作方法が良くわからないため想像以上に難しい。取り込むことは出来るのですがそれを丁度よい位置に寸法通りに配置する方法が全くわからない状態でした。いろいろ調べて位置合わせで面と面をあわせてみたり、接線と面をあわせてみたり、接線のところからの距離をオフセットに入力して移動させてみたりといろいろ試行錯誤を重ねてなんとかイメージ通りに部品を配置できました。後で手作業でMFD材にこの図面を見ながら線を引く必要があったのでなるべく切りの良い数字になるようにしました。（ふうっ。）

次にそれぞれの部品をジュークボックスの前面に露出させるための穴をこれも押し出しを使って開けました。部品の「投影」を使って押し出して穴を開ければ出来るだろうと思ったのですが、投影を使う方法がいまいち良くわからずかなり苦戦しました。2Dの座標となる「スケッチ」を開き、投影させる部分を選択し、「投影/取り込み」 から「プロジェクト」を選べば良いはずなのですが選択がうまく出来ていないのかなかなかそれがうまくいかず。部品を見えなくしてみたり、グリグリと図面を3Dで動かしてみたりしてなんとかなんとか投影する部分を選択し、一応なんとかすべての穴を押し出しにより開けることが出来ました。ここまで来るのに1週間はかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/b0953cd7-de09-8073-56cc-0003bf2547e8.png)


## 図面を出力

3Dで入力しているのだからきっと平面図も簡単に出力できるだろうと思っていたのですが、出来なかったらどうしようと思いつつもそれがどうやら出来そうだとわかってホッとしました。しかし実際に出力しようとやってみたところ部品の数が多すぎて無料版の制限である部品点数10個を超えていたために出力できない問題に遭遇しました。仕方なくいらない部品を消して、なんとか平面図（図面）を出力出来ました。

勝手に寸法も表示されるのかと思いきや、表示させたいところを自分で指定して表示させる必要があるらしいことが誤算でした。勝手にやってくれても良いのに...。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/af71bc38-ae9f-c467-92be-023971415dfd.png)


## 図面をPDFに出力できないままMFD線を引く

あとは図面を印刷してそれを見ながらMFD材に線を引いていこうと思っていたのですが、なんと図面をプリントアウトするにはFusion 360のサブスクリプション契約が必要とのこと。仕方ないのでmacの画面上で図面を見ながら定規で寸法を測ってはMFD材に線を引いて行きました。もしかしたらPDFで印刷できていれば寸法通りのサイズになっていて、それをそのままMFD材に透過させられれたとしたら定規で測ることもなくトレース出来たのかもしれないなとも思いましたがそれは忘れることにしました。実際はどうだったかわかりませんけど。

## MFD材を切る

MFD材ならのこぎりを使わなくてもカッターナイフで切れるだろうと思ってやってみたのですが相当な力と根気がいることがわかりました。一箇所切るのにもヘトヘトになり一気に切り出すことが出来ず休みながらなんとか四角い部分だけは切り出しに成功しました。

## ひょっとして薄い木材ならレーザーカッタで行けるのでは？

会社のレーザーカッターではMFD材の加工はNGとなっていますが薄い木材なら切っても良いと聞いたので、会社に行った時にホームセンターに立ち寄ってちょうど良さそうな板を探してみました。そこで「版画の板」が目にとまりこれでいけるのではないかと早速購入（350円ぐらだったかな？）し試してみることにしました。

会社のPCにはFusion 360が入っていないので、PowerPointでジュークボックスの表面の図形を数値指定や図形の合成で作成してからPDFにエクスポートした後に、レーザーカッターに接続しているPCのIllustratorでPDFを取り込みました。なぜか生成されている余計なパス情報を取り除いたり、諸々の設定をしてから早速版画の板を試し切り。最初出力は75%でやってみましたが強すぎる感じだったので60%に落としてみたら大体良い感じで切り取れました。

ジュークボックスの外側にNeopixelの光を拡散させる部分は別途5mm厚の透明アクリル板を使って作成しました。光を拡散させるために塗りつぶしで彫刻も施しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/abfbe298-3e41-2d5e-74b6-46477b4323bd.png)

## ジュークボックスの箱を作る

ジュークボックス前面はレーザーカッターで良い感じに作れました。側面部分はMFD材を苦労して手作業で切りとりました。残りの底面と背面は手持ちのMFD材が足りなくなり近くの100均で10mm厚の板を購入。のこぎりでギコギコやって切り取り、最後は裏面を前面のジュークボックスの形に沿って線を引き、それに合わせてピラニアのこぎりでギコギコとキロ取りましたが10mmもの厚みがあったために斜めに刃が入りガタガタの切り口になってしまいました。しかし背面だから見えないし適当で良いやということで切ったあとに少しヤスリをかけたぐらいで完成としました。

前面パネルに横板を2枚と底板を木工用ボンドで貼り付けました。曲がらないように慎重に固定されるのを待って一枚ずつ接着していきました。

## ジュークボックスの箱の中に部品を治める

あとは箱の中に部品を収めれば完成と思っていたらレーザーカッターでOLEDの穴とスイッチの穴を切り忘れていたことに気がつきました。このぐらいの直線の穴だったらなんとかくり抜けるだろうと再びカッターナイフで力任せに何度もなぞって穴を開けました。これがまた想像以上に大変でした。ドリルで穴をあけてからピラニアのこぎりで切るか、ノミがあるならそれでくり抜くのが簡単だったかもしれません。カッターナイフで版画の板を切るのは普通の人にはおすすめできません。

板を切る作業だけでクタクタになるもやっと穴を開けられて部品の配置が出来る状態になりました。

OLEDはどうも裏から上手に支える方法が思いつかず、端っこのほうを無理やりテープで止めるだけにしました。

タクトスイッチは基板にはんだ付けしていたので強力な両面テープでその基板ごと貼り付けることにしました。

スピーカーは穴の位置を合わせるために底板とスピーカーの間にMFD材を挟んで丁度よい高さにした上でこれも両面テープで貼り付けました。

ジュークボックスの表面とNeopixelの拡散用アクリルは曲線部分は嵌合が少し甘かったので端っこの方に木工用ボンドをちょっとだけ付けて固定。直線の部分は上下方向が少しアクリルのほうが長かったので紙やすりで少しずつ削りながらしっかりと嵌合するように調整してはめ込んで固定できました。

Raspberry Pi Zero Wは、スピーカーとスピーカーの間に横置きでちょうど収まるように設計していた（本当にそうだったか少し怪しい）のでそこに配置してジュークボックスの側面とRaspberry Piの短辺方向のエッジ部分にそれぞれ余っていた木を切って左右から抑え込むようにして固定しました。Raspberry Piを少し傾けると取り出せるぐらいに調整しました。

Neopixelはあまったアクリル板を適当なサイズに切って、Neopixelの発光面がジュークボックスの上部を向くようにアクリルと両面テープで接着したうえでジュークボックスの前面とも両面テープで固定しました。Neopixelは12個でひとまとまりのものを2個用意していたのでOLEDの上の部分とタクトスイッチの下の部分にそれぞれ取り付けました。

## ジュークボックスの外形仕上げ

部品が全部ジュークボックス内に収まったので最後にジュークボックスの上の丸い部分としてコルクボードを綺麗に合わせて木工用ボンドで貼り付けましたが、想像以上に美しい仕上がりになって自己満足していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/fd90c385-1f1d-77e1-b2c0-abcd64e0a90e.png)

裏蓋は特に何かで支える必要もなく良い感じの摩擦で開け締め出来るようにうまく嵌合したのでこれで良しとしました。最後に電源ケーブルを外に引き出すために少しだけピラニアのこぎりで穴を開けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/37d0fce3-de2d-57e2-3102-ecdccdcdd3e9.png)

## 塗装

完成した外形を眺めてなんだかジュークボックス表面の白っぽさが気になりだしました。レーザーカッターで切った時に少し焦げ付いていたのも気になります。そこで「[アンティークワックス](https://www.amazon.co.jp/%E3%82%BF%E3%83%BC%E3%83%8A%E3%83%BC%E8%89%B2%E5%BD%A9-AW120005-%E3%82%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BC%E3%82%AF%E3%83%AF%E3%83%83%E3%82%AF%E3%82%B9-%E3%83%80%E3%83%BC%E3%82%AF%E3%82%AA%E3%83%BC%E3%82%AF/dp/B01DKBOJRA/ref=asc_df_B01DKBOJRA/?tag=jpgo-22&linkCode=df0&hvadid=208393847190&hvpos=&hvnetw=g&hvrand=12307544076425367547&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-439508628906&th=1)」なるものを使うことを初期の構想段階で考えていたことを思い出し、amazonで発注して購入。塗って失敗したら後戻りはできなくなるのでドキドキしながらの作業でしたが妻にも手伝ってもらいながら慎重に塗りたくって乾いてから乾いた布でゴシゴシこすってみたところ、良い感じで光沢が出てレトロ感が出て想像以上に自己満足できる外観になりました。

## 完成！？

すべてを組み込んで「完成した！」と思って動かしてみたところ、いろいろとRaspberry Pi周りに問題が発生してしまいここからが修羅場でした。

### スピーカーから音が出ない(展示3日前)

いろいろ調べてみたらWM8960 Audio HATのファンクショナルピンがNeopixelで使っていたRaspberry PiのD18と被っていることがわかり、Neopixelを空いていたD12に繋ぎ変えたところ無事に音が出るようになりました。その際、いろいろ触った時にNexpixelのハンダが外れてしまったのでハンダ付け直しもしました。これでなんとか修正完了。

### OLEDがエラー(展示2日前)

なぜかOLEDがI2Cのエラーになり起動しません。なにか接触が悪いのかとな思い、テープで貼り付けた部分を剥がしてみたらエラー修復。どうやら基板の部分にテープが張り付いていたために変なテンションがかかって調子が悪かったようです。ひとまずテープの止め方を工夫して回避したらエラーは出なくなりました。

## 自動起動で音がならない(展示2日前)

`crontab -e`でcronを編集
```
@reboot  /home/pi/radiko_juke/radiko_juke.py
```
として、Raspberry Piのboot後に radiko_jukebox.py を自動起動するようにしたのですが、なぜか音がならない状態が発生。systemctldからの起動にしてみたりと、いろんなことを試してみましたがどうしてもうまく行きません。これはもう諦めて起動の時はconsoleでsshしてコマンドを叩くしかないかなと思っていました。

しかし、起動時にOLEDに取得したIPアドレスを表示する仕様を追加してみたところ、偶然にも音が鳴らない原因がIPアドレスの取得タイミングにあることに気がつきました。どうやらIPアドレスの取得に時間がかかり、それよりも先にradiko_jukebox.py が起動してしまうためその状態では音がならないというのが顛末だったようです。OLEDにIPアドレスを表示するまでは次に進まない処理を追加したことで自動再生の問題は自然解決しました。

## ボリューム変えたらNeopixelがちらつく(展示前日の夜9時)

これで完成！と思い、最後にボリューム調整を行う方法を調べて、alsamixer でWM8960-soundcardのボリュームをコントロール出来ることを確認。コマンドラインからも

`amixer -c1 sset Speaker 100,100 unmute`

とすればボリュームを変えられることがわかりました。あとはタクトスイッチの長押しあたりでボリュームを変えられるようにすれば良いかなと思った時にトラブル発生。なぜかNexpixelのLEDが音を鳴らすとちらつくようになってしまいました。この時点で9/2の夜の9時...。

原因がわからずalsamixerでいろいろ設定をいじってみるものの全く治る気配なし。あきらかに音を流すとNeopixelがちらつく状態になってしまいました。困った。ボリュームを変える前は問題なかったはずなのに...。

実は過去にGoogle Voice KitのRaspberry Pi Zero Wを使ってNeopixelを光らせた時にうまく光らないという現象に遭遇したことがありました。その時はArduinoにNeopixelを繋いでRaspberry PiとUSBシリアル接続してNeopixelをコントロールしていましたが、今回もそれで凌ぐしかないと決断。急遽Arduino Microを探し出して繋ぎ変えることにしました。

Arduino MicroとRaspberry PiはUSBシリアルで接続し、Arduino MicroでNeopixelの点灯をRaspberry Piからのコマンド送信によりコントロール出来るように突貫で作りました。本当はいろんな光らせ方をさせたかったのですが時間がないのでレインボーで表示するだけの最低限の実装となりました。

## 完成

これでついについに完成！明日の朝は早いこともあって必要最低限の動作確認で終了。この時点で夜の11時。これで明日の本番でうまく動かないことがあったらその時はその時だと覚悟を決めて寝ることにしました。

## Maker Faire Tokyo 2022 当日

実は、このRadiko JukeboxはWi-Fiでインターネットに繋がらないと何も出来ないのですが、Maker Faireのような展示会では過去の経験上Wi-Fiが繋がりにくくて全くだめということがあることを知っていました。そのため普通はそういう場合に備えて有線による接続か、Wi-Fiにつながっていなくてもデモが出来るように仕込んでおくのが常套手段なのですが、前日のドタバタでそんなコンティンジェンシープランを用意しておくことは全く出来ませんでした。

そんな一抹の不安を抱えながらも慎重に家から完成品のRadiko Jukeboxを段ボール箱に入れて運び、会場の東京ビッグサイトに到着。メンバーと一緒に自分達のブースに向かい、他のみんなが到着して各自の作品の準備を始めるなか、ドキドキしながらRadiko Jukeboxを取り出し、自腹のモバイルWi-Fiルーターを起動後にRadiko Jukeboxに電源を入れました。

このJukeboxはRaspberry Piの起動にも時間がかかる上にWi-Fiに接続して、Radikoからストリーミングデータを取ってくるまでに2分。場合によっては3分ぐらいかかります。Radikoの音声が流れるまで固唾を飲んで祈るように見守りました。

そして、ついに、音が出た！

なんだかすごくホッとしました。ただしこの時点ではまだセッティング開始段階でWi-Fiが混んでいないだけで問題がなかったのかもしれないという気持ちもあり、昼12時の本番開始以降でどうなるか不安は残っていました。でもだめな時はもうどうすることも出来ない状況なので運を天に任せるしかない状態でした。

## 最終結果

これだけ作るまではトラブル続きだったが、9/3, 4の本番は9/3に一度だけWi-Fiが切れたのか音がならなくなりリブートさせて復活させましたが、9/4は朝の電源投入以降、17:00の蛍の光が流れるまで驚くほど順調に問題なく動作し続けました。奇跡的だったなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/0871ff70-699d-29d5-76fb-5b6f199b2398.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422837/f9aaf1ab-b0bb-7aec-d340-c86c512136f8.png)

なお、ブースを訪れてくれた人たちのRadiko Jukeboxに対する反応はいまいち。9/3は「Radiko Jukebox」と書いている以外の何の説明書きもなかったので説明してあげないと何もわからない状態でした。9/4は少し説明を書き入れて少しはましになったかのかどうか。会場は想像以上にざわついていてボリュームを最大にしてもラジオの音がほとんど聞こえない環境だったのも厳しかったかもしれないです。

それでも、何人かは面白いと言ってくれたし、コルクボードで作った部分のアイデアに気がついて感心してくれる人がいてそれだけで個人的には十分満足でした。だってこれは自己満足のために作ったわけだから...。

## Maker Faireを終えて

同じブースの他の人達の展示物はゲーム性のあるものだったり、子供が遊べるものが人気だったようです。Maker Faireで来場者ウケするにはこの手の展示が良いかもなと思ったりもしました。

さて、来年も参加するかどうかはわかりませんが、やはり「ものづくり」って良いなと。苦労して試行錯誤して得られる知見は計り知れません。今後も今回の経験を糧に面白いものを作っていけたらなと...。

# まとめ

- Fusion 360でモデリングが少し出来るようになって嬉しい。
- 人力よりもレーザーカッター。
- Raspberry PiでAudio系とNeopixelを同時に使うのは危険。
- Raspberry Piで自動起動によりプログラムを走らせる時はIPアドレスを取得しているか確認が必要。
- 曲げ木の代わりにコルクボードが使える。
- 早い段階でシステムは全部組み上げて総合テストをやっておけ！