夏休みになったので、CD-ROMドライブにRaspberry Pi Pico 2Wを内蔵する工作をしました。「EjectPico」です。
とりあえずこのショート動画を見て、あーね(なんもわからん)になってもらうと良いと思います(?)
EjectZeroはWebSocketじゃなかった
2015年末に実装したEjectZeroは、Socket.ioで実装していました。じゅ、10年前……?
Socket.ioのことを、内部的にWebSocketでやっていると思っていたのですが、どうやら違う?らしく、Socket.ioの環境に対してWebSocketでつなぎに行くのはできないらしいということに、わりと最近になって気づきました。
先日のMisskeyリアクションモニターで、Picoを使ったWebSocket接続ができたので、EjectもWebSocketでやれればPico版のEjectZeroも作れると思ったのですが、Socket.ioにつなげられないのでは、サーバーやらなんやらを一式書き直す必要がありそうです。
書き直した
というわけで、全部書き直してみました。サーバーは、EjectZeroではSocket.ioのNode.js版を使用していましたが、今回はPythonとwebsocketsライブラリを使用しました。サーバーは初めて書くので、以下のチュートリアルを参考に、仕組みを理解しながら実装しました。AIを使えば実装は一瞬なんでしょうけど、AIは不使用です。て、手の温かみ……
HTMLの方は、デザインはEjectZeroのままとしつつ、JavaScriptは全部書き直しです。しかし、ライブラリが不要になって、Mozillaの解説と少々を参考にしがらイマドキなJavaScriptの書き方にならって行くと、いい感じに書き上がりました。いい時代や。CSSも、10年前にドラフトだったものが正式になっていたようで、ブラウザごとの記述をまるっと消してさっぱりさせることができました。
CD-ROMドライブ側のコードは、先にwebsocketsで仮で作ったあと、Pico 2Wに移植する形で実装しました。これだと、Picoじゃなくていいところの実装をPCで先に作り込めますからね。Picoに持ち込むときは、Misskeyリアクションモニターのルーチンをベースに実装をしました。
以上の成果物は、Ejectコマンドユーザー会のリポジトリに投げました。
CD-ROMドライブの実装
今度は物理的な工作のほう。今回使用するドライブはこちら。

実はこのドライブには先住民の初代Raspberry Piが入っていたのですが、令和7年最新版になるべく、退去してもらいます。許せ。

せっかくなので並べてみました。やれることは違えど、こんなに小さくなって無線も内蔵で、いいことしかない。

先住民は、サイズの都合上ドライブの中に引きこもるタイプの設置方法でしたが、Pico 2Wは小さいので、EjectZeroと同様にトレイに設置して、外に出ていくタイプの設置方法にします。

穴を開けて、ネジ止めをしたところで、裏側から見て右側の穴がガイドに思いっきり干渉していることに気がつきました。このガイドは、トレイの開閉とトレイを閉じたときのロックに必要な機構なので、これではまずいですね。さらに、ガイドに干渉していない左側も、トレイを閉じるときに本体内の部品と干渉しており、横向きの設置はダメそうでした。ぐぬぬ。

というわけで、回避策として縦で設置。ネジ止めは無線アンテナ側の2箇所だけになりましたが、まあ軽いし大丈夫でしょう。

トレイ開閉ボタンを操作するフォトカプラーは元のやつを流用します。昔適当に作ったせいでケーブルが硬いやつだったので、柔らかいケーブルに付け替えました。Pico 2Wから見える位置に空中配置したかったので、この部分だけ元の硬いケーブルを利用することで、空中配置を実現しています。

ドライブのボタン部分にケーブルを配線(あとでボタン側の配線が逆とわかって修正)。トレイが出ても引っ込んでも問題のないケーブル長にしてあります。

電源も同様に配線。こちらも柔らかいケーブルで配線しなおしました。

電源はSATA端子から5Vを取ります。これも前の実装と同じ取り付け方です。

配線ができたので、後はプラグラムの書き込みです。作業中はSATA電源を抜いて、Pico 2WにMicroUSBケーブルを繋いで作業しますが、たまに接続時にトレイが閉まろうとするので、そうなったらトレイを引っ張って閉じるのを阻止します。綱引きかよ。あと、モーター駆動は12Vが必要だったはずだけど、なぜでしょうね?

完成
プログラムの方は数日前からちょっとずつ練習として手を付けてていて、今朝は練習の目処がついたところから始めて、昼すぎにだいたい完成形になり、午後はドライブの工作とCircuitPythonでのプログラム実装という感じで、だいたい1日でなんとか出来上がりました。

EjectZeroとの比較
EjectZeroとEjectPicoを並べてみるとこんな感じ。EjectZeroのPiZeroは、実は一瞬でディスコンになったV1.2なので、無線もカメラ端子もないやつです。なので、無線LANドングルが必要で、見た目がカオス気味ですね。

比較するのは、アイドル時の消費電力と、通電開始からEjectできるようになるまでの時間の2つです。言うまでもなくどちらもPicoが勝つのですが、どのくらい変わるかを見ていきます。
アイドル時の消費電力は、EjectZeroが0.36A、EjectPicoが0.14Aでした。ドライブ側が何か電気を食っている可能性があるので、機種で差が出るかもしれませんが、それでも0.22Aの差です。まあまあでかいですね。
通電開始からEjectできるようになるまでの時間は、EjectZeroが1分25秒、EjectPicoは8秒(!)でした。さすがにPicoはOSの起動時間がほぼ無くなるだけあって早いです。Zeroの方も、仮にZero 2Wに置き換えたらもっと早くなったりするとは思いますが、今からやるかと言われると、ちょっとZero 2Wもったいなくてできないですね。もったいないとは……?
まとめと余談と宣伝
Raspberry Pi Pico 2WでリモートからEjectするやつを作りつつ、PicoでWebSocketを使いたいがために、サーバーとWebをSocket.ioからWebSocketにまるっと作り直したお話でした。Pico Wが出たときから、いずれCD-ROMドライブに搭載したいと思ってやっていなかったやつなので、やっと実現できて満足しました。
そもそも、なんで今これをやろうと思ったのかと言うと、週末にコミケのブースレイアウトの練習をしていて、Eject本の販促に実物のデモを用意しようとして、クローゼットから出てきたドライブがこれだったので、ついでに初代RPiをPico 2Wに置き換えたという感じでした。脱線がすぎる。
しかも、ドライブはこんな感じで置くので、トレイを見るにはお品書きをめくる必要があります。トレイに載せた意味とは……!!!ちなみに、EjectZeroだとトレイの力不足で押し出せなくて不採用になりました。もしかするとトレイのベルトが弱っているのかも。
というわけで、今週末のコミケで実物が見られるので、ぜひ見に来てくださいね。8/17 日曜日の東7ホール S-33b 「こくだランド」です。
新刊はメロンブックスで委託します。電子版は後日BOOTHで販売予定です。
新刊も出し終えたタイミングで、薄い本1章分はありそうな文量の工作ネタをブログに投稿するやつがあるか?まあ、3ヶ月半後の冬コミに載せればええな、ガハハw