Raspberry Pi Zero WH とスパイスボトル
スマホを公衆無線 LAN へ接続するときに間に挟む安全な Wi-Fi 中継器的なものが欲しいなと思案していたところ、Raspberry Pi Zero WH を 100 均のスパイスボトルに入れてみたら、なんとなく良い感じで雑に持ち歩けるサーバーになりました。
※ 今回はとりあえず特徴などを記載するだけで、各項目の詳細(設定やソースコードなど)等は後日追記していけたらなと思っています。
電源回路
最初は、単四充電池 x3 をスライドスイッチ経由で Raspberry Pi Zero WH へ接続し、機械的に ON/OFF する大雑把な作りだったのですが、ちょっと無理があったのと USB の電源にも対応させたくなったので、LTSpice とにらめっこしながら単四充電池 x2 で USB デバイス接続と給電にも対応する電源回路を自作しました。
各種インターフェース
蓋の中に「電源スイッチ(スライドスイッチ)」「マルチ機能ボタン(タクトスイッチ)」「USB コネクタ」を配置してあります。マルチ機能ボタンは「長押しでシャットダウン」「普通に押すとネットワーク接続をリセット」を割り当てています。
USB コネクタは OTG ケーブルによる USB デバイスの接続や、普通?のケーブルによる電源供給にも対応していますEther Gadget で PC との接続もできますが、USB の ID ピンを Raspberry Pi の方には接続していないので、モードの切り替えは config.txt
の書き換えと再起動が必要です。
加速度センサーも組み込んであり、指やペン先でボトルをダブルタップするとネットワークの接続状況を LED で通知します。
Wi-Fi ルーター
ざっくりと以下のような感じで Wi-Fi ルーターとして稼働させ、スマホと公衆無線 LAN の間に挟んで使っています。
- iw コマンドで ap のインターフェースを作成
- hostapd でアクセスポイント化
- ifupdown と WPA Suplicant のローミング機能で各種公衆無線LANサービスへ接続
- nftables で wlan0 と ap0 のマスカレード
もともとは、「Raspberry Pi Zero WH が VPN で接続できているときだけ AP をオンにする」ような安全なルーターにしようと思っていたのですが、Wi-Fi に負荷がかかってないと切断されたり、STATION と AP の ifup/ifdown がお互いに影響したりといろいろ安定しなかったので、VPN 接続はスマホ側にまかせて普通のルーターとして使っています。
シリアルポートのサーバー
これは当初予定していなかったのですが、PySerial でシリアルポートのサーバー(Single-port TCP/IP - serial bridge (RFC 2217))としても使っています。 Visual Studio Code の Remote Development - Container 上で PlatformIO を使う場合、ファームウエアのアップロードやモニターはリモートで接続するほうが楽だったので、そのための接続先の1つとして重宝しています。
また、回線の状態にもよりますが、モバイルネットワーク/公衆無線 LAN 経由でもアップロードできているので、やろうと思えばこういうこともできます(実際にはいろいろ無理があるので、やらないですけど :-)
まとめ
稼働時間が短い(2.5時間くらい)、USB 電源とデバイスを同時に使えないなどいろいろ不満な点もなくもないのですが、外出時に「持ってきておいてよかった」と思うことも結構あるので、四苦八苦しただけのことはあったかなと。