表題のとおり。Raspberry Pi Pico Wとても便利なのですが、Wi-FiのSSIDとパスワードをソースコードに埋め込んだり、ビルド時の引数で埋め込む方式を取ることが多いようです。ですが、これ、Picoを普通の人に渡した時「えぇ!?自宅のWi-Fiに繋ぎたいだけなのに、ぼくが開発環境を用意するのかい!?」的な破綻を迎えてしまうので、あまり良い方法ではないと考えています。
そこで、Picoのオンボードフラッシュメモリ2MBの一部を、USBマスストレージクラスのファイルWIFI.TXT
として扱えるようにします。PicoをPCにUSB接続してマウントし、Wi-Fiの設定を普通のテキストファイルとして編集できるようにしてみました。
ホストPCからはFAT12ファイルシステムとして認識されます。Pico上ではUSBを介したWIFI.TXT
への読み書きをフックして、Wi-Fiの設定値の構造体をフラッシュメモリに出し入れする擬似FAT12として動作しています。読み書き動作はmacos 14.4.1, Windows 11 Homeで動作確認しています。
Wi-Fiの接続に成功するとPico WのLEDを点灯します。
ファイルシステムの容量は32KBにしています。もっと小さく8KBとかにしても良いのですが、macosのテキストエディットで編集すると、中間ファイルなどが容量を食い潰してしまう問題があったためこのサイズにしました。
WIFI.TXT
以外のファイルはPicoのSRAMに展開するだけで、フラッシュメモリには保存していません。なので見た目ではファイルを追加して保存できますが、Picoを電源オフすると消えます。無常。
ファイルシステムまわり以外のつまずきポイントはcyw43_arch_wifi_connect_timeout_ms()
などブロックする類のAPIでWi-Fi接続しようとすると、USBデバイスとしては止まってしまうあたり。cyw43_arch_wifi_connect_async()
を使ってブロックせずすぐにループに復帰するようにしています。USBのポーリングなどと関係あるのかや、ブロックせずにcore1で処理したら良いのかとか、不慣れなのでよく知りません。
追記
擬似FAT12はフットプリントが軽いけど扱う側の脳に優しくないなぁと考えて、Picoのオンボードフラッシュメモリの末尾64KBをFAT12でフォーマットする構成も試してみました。この構成であれば:
- Pico内部からFatFsでファイル操作
- PCからUSBマスストレージクラスでフラッシュメモリデバイスとしてファイル操作
と、双方からファイルシステム全体を読み書き永続化できます。
pico-sdkには元々FatFsがバンドルされているので、追加要素は無し。擬似FAT12版の容量が32KBだったのに正規FAT12版が64KBに増えているのは、FatFsのミニマムのボリュームサイズが128セクターな故です。
ちなみに、Picoのようなデバイスは突然の電源切断がありうるので、「Picoで収集したセンサーデータの保存」といった用途にはlittlefsなど耐性のあるモダンなファイルシステムを使うのがより好ましいでしょう。しかし「ホストPCからファイルとして手軽に操作したい」類のユースケースでは現状難があるので、しばらくはFATが第一候補になります。