PlatformIO+Raspberry Pi Picoで一時Uploadができなくなった話

Raspberry Pi Picoを触り始めてるんですが、「PlatformIOからスケッチをUploadできない」「BOOTSELモードに入ってもUSBストレージとして認識すらされない」という躓きがあったのでどう解決したかのメモを残します。

環境はWindows 11とVS Code、PlatformIOでearlephilhower版Arduinoコア(Raspberry Pi Pico/RP2040)を使用。多分Arduino IDEや公式のArduinoコア(Arduino Mbed OS RP2040)でも解決方法は同様だと思います。

 

 

PlatformIOからスケッチをUploadできない→Zadigでドライバを指定→そこから更に別のドライバ指定


きっかけはUSBスタックをTinyUSBに変更したこと。

pratformio.iniに 

build_flags = -DUSE_TINYUSB

を追加、main.cppで

#include <Adafruit_TinyUSB.h>

とsetup()内に

Serial.begin(115200);

を追加。以下のArduino-Picoのドキュメント

USB (Arduino and Adafruit_TinyUSB) — Arduino-Pico 2.7.1 documentation

によればこれでUSBシリアルポートの使用とIDEからのスケッチアップロードが可能とのことですが、BuildしたスケッチをUploadした結果どっちも不可能に。

Serial.println()してもCOMポートは出て来ないし、PlatformIOからUploadしようとすると、

Looking for upload port...
Auto-detected: COM4
Forcing reset using 1200bps open/close on port COM4
Uploading .pio\build\pico\firmware.elf
rp2040load 1.0.1 - compiled with go1.15.8
.....................
*** [upload] Error 1
========================================== [FAILED] Took 12.91 seconds ===========

とアップロード先のCOMポートを正しく見つけられない(COM4はpicoと無関係)。

この場合はpicoのUSB接続に使用するドライバをZadigというツールを使ってインストールするとCOMポートが認識されるそうです。

toonrobotics.com

標準のUSBスタックだとこれで解決ですが、TinyUSBだとこれでもまだCOMポートが使えませんでした。

バイスマネージャーを開いて見てみると、ZadigでWinUSBを指定した場合は

"ユニバーサル シリアル バスバイス"に"TinyUSB Serial"という名前で出ます(Zadigでlibusbを指定した場合は別の場所に出ます)、COMポート一覧には出てません。

ここからもうひと手間。この"TinyUSB Serial"を右クリックして"ドライバーの更新"をクリック。

下の"コンピューターを参照してドライバーを検索"をクリック、

 

下の"コンピューター上の利用可能なドライバーの一覧から選択します"をクリック、

 

"USB シリアル デバイス"を選択して"次へをクリック"。すると、

 

COMポートとして認識されました。

この状態になればPlatformIOからUploadが可能になります、シリアル通信も可能です。
まだUploadに失敗する場合はUpload前にpicoをBOOTSELモードにしてください、BOOTSELボタンを押しながらUSBケーブルを挿すとUSBストレージとして認識されるアレです。USB抜き差しは面倒なのでBOOTSELボタンを押しながらRESETボタンを押す→離すでもいいです。picoは他のRP2040搭載ボードと違ってRESETボタン無いので↓で。

nuneno.cocolog-nifty.com


一度Uploadに成功すると次から手動でBOOTSELモードに入らなくてもUploadできるようになると思います。

 

 

USBストレージとして認識すらされない→一旦pico関連デバイスを片っ端から削除

 

前述のTinyUSBの認識で苦戦してる途中でいろいろ試したら、状況は更に悪化してBOOTSELモードに入ってもUSBストレージとして認識されない状態に。まさかpico買い直さないと!?と焦りましたが、別のPCに繋ぐとUSBストレージとして認識されました。

つまり問題はPC側にある、ということでいろいろ検索して引っかかったのが公式フォーラムの以下のやり取り。

Can't upload any .uf2 (Solved) - Raspberry Pi Forums

この解答を参考にしながらデバイスマネージャーを操作してみました。

まずメニューバーの"表示"の中の"デバイス(コンテナー別)"を選択、同じく"表示"の中の"非表示のデバイスの表示"をクリックしてチェックを入れる。

そしてpico関連だと思われるデバイスを片っ端からアンインストール。
具体的には、見慣れないデバイスやRP2等のそれらしい名前のデバイスがあったらダブルクリックしてプロパティを表示、"イベント"タブを選択してイベント一覧のタイムスタンプを確認し、pico関連のインストールや更新がきっかけでその日時にデバイスが新規作成されたと推測される場合はpico関連のデバイスだろうということでデバイスをアンインストールします、プロパティを閉じてデバイスを右クリックして"デバイスのアンインストール"を選択し出てきたウィンドウの"アンインストール"をクリック。

いろんなデバイスを消した所でpicoをBOOTSELボタンを押しながらUSBケーブルを接続したら、無事USBストレージとして認識されました。焦った。