CircuitPythonで大きなファイルをフラッシュメモリに書き込むとCIRCUITPYドライブが消える【対処法あり】
Adafruit Feather RP2040、いいですよね。8MBもストレージ(フラッシュメモリ)があるし。(STEAM Tokyoストアでも販売中です。)
mp3などのマイコンにとってはちょっと大きなファイルを入れて、高音質で再生させたら面白いかな~と思って試した時に起きた問題と対処法をご紹介します。
Feather RP2040のフラッシュメモリ容量
Feather RP2040にCircuitPython6.2.0を書き込んだ直後の初期状態で、空き容量が6.96MBあります。
ライブラリやCircuitPythonのコードもこの中に保存されますので、現実にはもう少し減りますが、従来のマイコンが2MB程度ですのでかなり余裕がありそうです。
問題発生!CIRCUITPYドライブが認識されない!
さて、mp3ファイル(4.9MB)を用意しました。空き容量が6.96MBあるので、大丈夫そうですね。
これをいつもの通り、CIRCUITPYドライブにドラックドロップします。
書き込み中のダイアログが出て完了…かと思ったらFeather RP2040自体を認識出来なくなり、CIRCUITPYドライブが消えてしまいました。
Windowsのデバイスマネージャを確認するとUSBコントローラの一つでエラーが出ていますので、そもそもWindowsからFeather RP2040を見つけられない状態のようです。
***なお、その後何度か検証のためにエラーを再現しようとしましたがうまくいく場合もあって、大きなファイルを書き込もうとすると毎回必ず発生する障害というわけでもなさそうです。***
試したこと
ブートローダーモードに入ってCircuitPythonを書き込み直しましたが、ブートローダーモードから抜けると同じエラーが出て、CIRCUITPYドライブは認識されませんでした。
- ブートローダーモードには入れているので、ボード自体が破損したわけではない。
- 別のWindowsマシンでも同様に認識されないので、PC側の問題ではない。
- しかし、CIRCUITPYドライブに触れないので、mp3ファイルを削除することもできない。
問題への対処
AdafruitのDiscordで現在の症状について投稿したところ、AdafruitのNeradocさんからこんな回答が返ってきました。
ブートローダーモードでflash_nuke.uf2ファイルを書き込んでフラッシュメモリを初期化するってことですね。
“nuke”ってなかなかのネーミングセンスですね…笑
また、別の方から…
「ctrl+cを押してREPLに入った状態で大きなファイルを書き込んだらどうなる?」と言われたので試してみたところ、問題なく4.9MBのmp3ファイルが書き込めて、CIRCUITPYドライブも認識されました!
対処法のまとめ
CIRCUITPYドライブが消えてしまったとき
Feather RP2040またはRaspberry pi picoでCIRCUITPYドライブが認識されなくなったら、ブートローダーモードに入ってflash_nuke.uf2(以下のボタンからダウンロードできます。)を書き込み、フラッシュメモリを初期化する。
(フラッシュに書き込んであったものは消えてしまいますのでご注意ください。)
その後、CircuitPythonのuf2ファイルを書き込み直す。
大きなファイルをフラッシュに書き込みたいとき
大きなファイルを書き込みたい時は、ctrl+cでREPLに入った状態でCIRCUITPYドライブにファイルを書き込む。
既知の問題だった…
その後、githubにissueとして挙がってることを教えていただきました。
REPLに入っていない通常の状態だと、書き込みが終わるとAuto reloadがかかってコードが実行されますよね。
どうやら、このAuto reloadが悪さをしているようです。
REPLに入ると、Auto reloadが無効化されますので、ファイルの書き込みに悪影響を及ぼさないようです。
念のため、関連するissueのURLをご紹介します。
Copying multiple larger files can hang the copy if autoreload is on — https://github.com/adafruit/circuitpython/issues/3986
“Large” file transfer to CIRCUITPY — https://github.com/adafruit/circuitpython/issues/4158
最後に
問題発生から数時間悩みましたが、AdafruitのDiscord(http://adafru.it/discord)で相談したところ、1時間足らずで解決しました。
こうやってコミュニティと積極的にコミュニケーションして手厚くサポートしてもらえるのはAdafruitのCircuitPythonならではだなと感謝しています。