Windows環境でPlatformIOを使ってRaspberry Pi Picoのソフトウェア開発をする時のエラーを解決!

Raspberry Pi Picoが動かない…(Windows11にて)
PlatformIOを使ってRaspberry Pi Picoのソフトウェア開発をしようとしたところ、初っ端から問題にぶち当たりました。どうやらWindows固有の問題のようです。その解決方法を記録しておきます(2022/10/16現在)。
環境はこんな感じ。
- Windows 11
- Visual Studio Code (ver. 1.67.2)
- PlatformIO導入済み
- PlatformIOでRaspberry Pi PicoのArduinoプロジェクトを作成
PlatformIOとRaspberry Pi Pico
Raspberry Pi Picoは様々な環境でプログラミングができます。一般的に用いられているのはMicroPythonが使えるThonny。この他にもCircuitPythonを使ったりArduino IDEを使ったりする方法もあります。もう一つの選択肢としてPlatformIOというものがあります。
PlatformIOのドキュメントを見ると
What is PlatformIO? (PlatformIOとは何ですか?)
PlatformIO is a cross-platform, cross-architecture, multiple framework, professional tool for embedded systems engineers and for software developers who write applications for embedded products.
PlatformIOはクロスプラットフォーム、クロスアーキテクチャ、マルチフレームワークの、組込みシステムエンジニアと組込み製品用のアプリケーションソフトウェア開発者のためのプロ向けツールです。
とあります。PlatformIOでは様々な組み込みボード用のプログラムをVisual Studio Codeのエディタでサクサク作ることができるのが特徴です。
PlatformIOでは公式のSDKを使ってC/C++で開発することもできますが、今回はArduinoプロジェクトとして設定しました。
RaspberryPi Picoにプログラムが送れない…
実際にPlatformIOでArduinoプロジェクトを作り、簡単なLEDの点滅プログラムをRaspberry Pi Picoに送ってみました。すると…

図1のようにアップロードに失敗してしまいました。コンソールをよく見ると”Auto-detected: COM1″となっています。
何が起きているのか?
では実際にデバイスマネージャーで確認してみます。するとポートのCOM1は別の機材で利用されていますが、Raspberry Pi PicoはCOM1として認識されていないことがわかります。

どうやらRaspberry Pi PicoのUSBドライバがインストールされておらず、正しく認識されていないようです。
USBドライバをインストールして解決だ!
そこで更にデバイスマネージャーをよく見てみると、”ほかのデバイス”のところに”RP2 Boot”と表示されています。これが接続したRaspberry Pi Picoです。これに正しいUSBドライバをインストールする必要がありそうです。

そこでWindows環境における汎用USBドライバWinUSBをインストールすることにします。
お手軽にWinUSBをインストールできるツールはいくつかあるようですが、Zadigを利用することにしました。今回はChocolatey経由でインストールしました。Zadigを起動し、RP2 Bootを選択してWinUSBをインストール。

そうすると該当するCOMポートが認識されてPlatformIOからプログラムが送れるようになりました。図5がその時のPlatformIOのコンソール画面ですが、”Auto-detected: COM3″と変化してその後のアップロードが実行されています。

ここで改めてデバイスマネージャを見てみると、図6のようにCOM3として新たにRaspberry Pi Picoが認識されるようになっています。以降はRaspberry Pi PicoがちゃんとCOMポートとして認識される様になりました。COM3はあくまでこの環境での話なので、環境によってはCOM3以外の別のポートが割り当たるかもしれません。


LEDの点滅プログラムもちゃんと動作しました!(図7)
追記:COMポートとして認識されないときの対処法
ドライバインストール後に別のRaspberry Pi Picoを接続してもユニバーサルシリアルバスデバイスのところにしか表示されず、COMポートとして認識されないケースがあるようです(図8)。

その場合は一旦ストレージに直接、シリアル通信を行うプログラムを書き込んでやるとCOMポートとして認識されるようです。リムーバブルドライブとして認識されない場合はRaspberry Pi PicoのBOOTSELボタンを押しながらUSBケーブルを差し込みます。
次にRaspberry Pi公式サイトのC/C++ SDKのページで配布されているサンプルである‘Hello World’ UF2をダウンロードします。
あとはリムーバブルドライブとして認識されているRaspberry Pi PicoにダウンロードしたUF2ファイルをドラッグアンドドロップ(図9)。するとリブートされ、COMポートとして認識されるようになります。
