Windows + VSCode + PlatformIO + Raspberry Pi Pico の環境構築

## 書こうと思った理由

RasPiPico の環境構築方法を調べると、めんどくさい手順が多すぎるのと、
最新の公式環境（VSCode で Raspberry Pi Pico拡張機能をインストール）ではうまくいかなかったので、慣れているPlatformIOを使いたかったです。
余計なツールはなるべくインストールしたくない。複雑な開発環境にしたくないという気持ちで書いてます。

## 出来上がる環境

Windows で VSCode を立ち上げて、
Raspberry pi Pico をBOOTSELボタンを押さずに差して、
PlatformIOから Upload を押せばプログラムを書き換えられる。

以下手順です。

## 環境構築手順

### OS

Windowsです。Linuxには一切触りません。

### VSCode のインストール

エディター・ビルド・アップロードまで行うツール。

有名どころなので割愛。
https://code.visualstudio.com/download

### PlatformIO のインストール

PlatformIO は、 VSCodeの拡張機能として提供されており、マイコンボードの開発にとにかく役立つツール。

今回は ビルドのツールチェーン、ビルド設定、アップロードまですべて行ってもらいます。

これ一つあれば 世の中に転がってるWindowsラズパイ環境構築のめんどくささはなくなります。

公式は以下。
https://platformio.org/

VSCodeの拡張からインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/7b80c5e8-0491-05de-e6c5-519c3c5529bf.png)

### PlatformIOプロジェクトの作成

PlatformIO のHome画面を開き、 New Projectします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/986b89c6-7317-205f-4169-0aec6da273f3.png)


Project Wizard 画面で、Board欄に Raspberry Pi Pico を選択。 Pico Wでも同じで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/e72cf004-b362-4a0a-5404-56b2f63a31a5.png)

ここで重要なのが、 Use default location の確認です。
はてなマークにホバーすると、作成するプロジェクトのパスが書いてあるのですが、ここに日本語が含まれるとあとで問題が発生するので、**日本語のパスは含めないようにしてください。**
日本語パスが含まれていたら、Use default locationのチェックを外して、任意のフォルダを選択してください。

ここで生まれるプロジェクトの設定ファイル（platformio.ini）は以下です。第三者のリポジトリなどは使いませんよ！

```
[env:pico]
platform = raspberrypi
board = pico
framework = arduino
```

### Hello worldを書く

プロジェクトフォルダ/src/main.cpp が生成されているので、ソースを開きます。

ソースコードの書き方は、 Arduino系の作法に従います。

`#include "pico/stdlib.h"` や `int main()` や `stdio_init_all()` は不要です。

```c
#include <Arduino.h>

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("Hello world");
  sleep_ms(1000);
}
```

Arduino系の作法に従って、 `setup()` と `loop()` を用意して、
シリアル出力（USB経由でシリアルモニターに文字を出力する）コードを書きました。


### Raspberry Pi Pico のセットアップをする

ここで PlatformIO から Upload を押しても、私の場合はうまくいきませんでした。

COMの認識がうまくいっていないのが十中八九の原因です。
以下の方法を参考にして、Zadigで汎用WinUSBドライバーをインストールします。

https://toonrobotics.com/win11_platio_2022_10_20/

どうしても初回だけは BOOTSELボタンを押しながら起動が必要です。

### ビルド＆アップロード

ソースコードをビルド＆RaspberryPi に書き込みしていきます。
VSCode 右上のアップロードボタンを押してください。とってもわかりずらいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/674dbba3-8d22-e1a0-5b16-d49c18a11c17.png)

初回起動時はビルドボタンになってるかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/1a277629-a755-fe64-82f9-7da17d8a6aa9.png)

これでビルド＆書き込み完了です。

### 動作の確認

PlatformIO内蔵のSerial Monitor を使っていきます。
VSCodeに別途インストールできる Serial Monitor 拡張や、 Teraterm、 ArduinIDEあたりでも確認できます。シリアルモニターならなんでもOK。

サンプルソースでは、モニタースピードを `115200` で実装しているので、シリアルモニターの設定も 115200に変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/85481bab-3f39-c534-f61e-2aabf5dcec6c.png)




## 補足

## platformio.ini の書き方

pico 用の書き方は以下。

https://docs.platformio.org/en/latest/boards/raspberrypi/pico.html

ほかにもオプションはたくさんあります。
一般的なplatformio.ini の書き方は公式を見てください。

https://docs.platformio.org/en/latest/projectconf/index.html

個人的によく使うのは `build_flags` と `monitor_speed` です。
`build_flags` はデバッグフラグを立てたり、コンパイルオプション作ったり。
`monitor_speed` は、PlatformIO に内包されている Serial Monitor のデフォルト値を変えてくれます。

### 書き込むファイルって何？どこ？

＜プロジェクトフォルダ＞\\.pio\build\pico\firmware.elf.uf2
もしくは
＜プロジェクトフォルダ＞\\.pio\build\pico\firmware.uf2
のどちらかが書き込まれてます。
どっちかは不明。


### PlatformIO でアップロードエラーになる場合　その１　No accessible RP2040 devices in BOOTSEL mode were found.

アップロードのログで以下が出ている場合。

```
No accessible RP2040 devices in BOOTSEL mode were found.
```

ラズパイピコは、 白いボタン（BOOTSELボタン）を押しながら起動すると、プログラムの書き換えができるモードになります。
USBストレージ認識となり、xxxx.uf2ファイルをコピペやドラッグ＆ドロップすることで書き込みできます。

今回はボタンを押しながら起動するめんどくささを省く環境なので、これが出ているということは環境構築がうまくいっていないです。
COM関係で失敗している可能性が高いです。汎用USBドライバはインストールしましたか？

https://community.platformio.org/t/upload-error-1-on-pio-with-raspberry-pi-pico/36841



### PlatformIO でアップロードエラーになる場合　その２　rp2040load 1.0.1 - compiled with go1.15.8　のあとに　[upload] Error 1　が出る

これはめちゃくちゃはまりました。

PlatformIOのCLIを使えるようにすると、詳細のログがわかります。
PlatformIOのCLI を使えるようにするのは、環境変数PATHにパスを通す必要があります。

パスは以下あたりにあります。たぶんどちらか。
* ユーザーディレクトリ\.platformio\penv\Scripts
* C:\.platformio\penv\Scripts

環境変数を設定したら、 VSCode を再起動してから、PlatformIOのターミナルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883973/5f8ccfec-105c-01b1-2b4b-0aed8b24344a.png)

以下のページを参考に、ターミナルで以下のコマンドを打つと、詳細の理由がわかります。

https://community.platformio.org/t/rp2040load-error-1/29326/2

```
pio pkg exec -p tool-rp2040tools -c "picotool info"
```

私の場合は、パスに日本語が含まれていたため、PlatformIOの中でアップロードのために使用している picotool というツールのコマンドラインがうまくいってなさそうでした。
私のエラーログはこんな感じ。

```
IndexError: Traceback (most recent call last):
  File "C:\.platformio\penv\Lib\site-packages\platformio\__main__.py", line 103, in 
main
    cli()  # pylint: disable=no-value-for-parameter
    ^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1157, in __call__    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1078, in main    
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\platformio\cli.py", line 85, in invoke    return super().invoke(ctx)
           ^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1688, in invoke  
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1688, in invoke  
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1434, in invoke  
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 783, in invoke   
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\click\decorators.py", line 45, in new_func
    return f(get_current_context().obj, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\.platformio\penv\Lib\site-packages\platformio\package\commands\exec.py", 
line 57, in package_exec_cmd
    if args[0].endswith(".py"):
       ~~~~^^^
IndexError: tuple index out of range
```

### シリアルモニターにHello worldが出力されない

* 間違って BOOTSELボタンを押しながら起動してませんか？
* * `Serial.print` ではなく、 `printf` を使ってませんか？（printfだとシリアルには出力されないです）
* `Serial.begin(115200);`はソースに書いてますか？
* シリアルモニターのボーレート設定は 115200 になっていますか？
* ほかのCOMポートを選択していませんか？


### アップロードがうまくいったときのPlatformIOのコンソール

参考にしてください。

```
Checking size .pio\build\pico\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [==        ]  15.1% (used 40752 bytes from 270336 bytes)
Flash: [          ]   0.2% (used 4034 bytes from 2097152 bytes)
Configuring upload protocol...
AVAILABLE: cmsis-dap, jlink, picotool, raspberrypi-swd
CURRENT: upload_protocol = picotool
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
..Loading into Flash: [                              ]  0%
Loading into Flash: [=                             ]  5%
Loading into Flash: [===                           ]  10%
Loading into Flash: [====                          ]  16%
Loading into Flash: [======                        ]  21%
Loading into Flash: [========                      ]  27%
Loading into Flash: [=========                     ]  32%
Loading into Flash: [===========                   ]  38%
Loading into Flash: [============                  ]  43%
Loading into Flash: [==============                ]  49%
Loading into Flash: [================              ]  54%
Loading into Flash: [==================            ]  60%
Loading into Flash: [===================           ]  65%
Loading into Flash: [=====================         ]  71%
Loading into Flash: [======================        ]  76%
Loading into Flash: [========================      ]  82%
Loading into Flash: [==========================    ]  87%
Loading into Flash: [===========================   ]  93%
Loading into Flash: [============================= ]  98%
Loading into Flash: [==============================]  100%
```


## まとめ

わざわざUSBケーブルの抜き差しや、ボタンを押しながら起動しなくても、Uploadボタンを押すだけでプログラムの書き換えができるようになりました。幸せ。