Raspberry Pi PicoをWSL(Windows Subsystem for Linux)で使う

[Raspberry Pi Pico](https://www.raspberrypi.org/products/raspberry-pi-pico/)を買ってみました。

環境構築の方法は**[Getting started with Raspberry Pi Pico](https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf)**に載っていますが、開発環境はRaspberry Pi 4上で構築するのが基本となっているようです。Windowsでのやり方も一応載っていますが、コマンドライン上での操作となるとWSL(Windows Subsystem for Linux)を使うのが便利なので、その方法をまとめてみました。

![DSC_3408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/5117b061-0f73-e48f-3331-cfd4a150bb9a.jpeg)

# 必要なもの 
- [Raspberry Pi Pico本体](https://www.switch-science.com/catalog/6900/) (できれば2枚)
 - 2枚あると片方をデバッグプローブにすることでJTAGデバッグが可能になるので便利です。
- [ピンヘッダ](https://www.switch-science.com/catalog/92/)
 - Raspberry Pi Picoにはピンヘッダがマウントされていないので、ブレッドボードに挿すためのピンヘッダを別途用意して、基板にはんだ付けする必要があります。
 - Picoの基板には両側に20ピンずつ2列、あとJTAGデバッグ用に3ピン必要なので、適宜折り取って20ピンのヘッダは基板の裏面に、3ピンのヘッダは基板の表面にはんだ付けします。
- [ブレッドボード](https://www.switch-science.com/catalog/313/)
 - Raspberry Pi Picoにいろいろ繋げて遊ぶために使います。
- [ジャンパワイヤ](https://www.switch-science.com/catalog/314/)
 - ブレッドボード上で配線をつなげたり、後述のUSBシリアル変換アダプタをつなぐのに必要です。通常はオス～オスタイプだけあれば良いですが、他の基板やケーブルとつなぐ際にはメスが必要になることもあるので、
[オス～オスタイプ](https://www.switch-science.com/catalog/314/)、
[オス～メスタイプ](https://www.switch-science.com/catalog/2294/)、
[メス～メスタイプ](https://www.switch-science.com/catalog/2295/)
を一通り揃えておけば、後で繋げるときにあれが足りない、というようなことがなくてよいと思います。
- [USBシリアル変換アダプタ](https://www.switch-science.com/catalog/2782/)
 - Raspberry Pi PicoのGPIOに出るシリアル(UART)出力をPCのターミナルソフトで見るために必要です。もちろん変換アダプタをPCにつなぐためのUSBケーブルも。

Raspberry Pi Picoにピンヘッダをはんだ付けすると、こんな感じになります。

![DSC_3410.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/e7f9c645-9b67-1916-ec41-4765cb210595.jpeg)

# 環境構築
Windows上に以下のアプリをインストールします。

- WSL(Windows Subsystem for Linux)
 - WSL上で動かすLinuxはUbuntu-20.04を推奨します。Ubuntu-18.04だと入っているCmakeが古いため、Pico SDKのビルドが通らないためです。
 - 既存の環境があってUbuntu-18.04を使用したい場合は、**[Ubuntu 18.04 に Cmake の Latest Release をインストールする](https://qiita.com/comachi/items/d0c1ce5d7b90fe30fced)** などを参考にして最新のCmakeに入れ替えてやることで使えるようになるようです。
 - WSLのバージョンはWSL1でもWSL2でも構いません。ビルドの速度はWSL2の方が圧倒的に速いのですが、JTAGデバッグの準備がそこそこ面倒です([こんな感じで](https://qiita.com/yunkya2/items/4e3d89f08b2237ef551f#wsl2%E3%81%AE%E5%A0%B4%E5%90%88))。
- USBシリアル変換アダプタのドライバ
 - 購入した変換アダプタに対応するものを使用します。 上記のリンク先にあるFTDIのチップの変換アダプタの場合は[FTDI社のドライバ](https://ftdichip.com/drivers/vcp-drivers/)を使用します。
- ターミナルソフト ([TeraTerm](https://ja.osdn.net/projects/ttssh2/releases/)など)
 - Pico SDKのシリアル接続のデフォルトは「115,200bps 8bit パリティなし ストップビット1」なので、通信パラメータもこのように設定しておきます。
- Visual Studio Code
 - "Remote - WSL" 機能拡張を入れておくと、WSL上のファイルもWindows上のものと同様に編集できます。

# WSL上の環境構築

**[Getting started with Raspberry Pi Pico](https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf)** の **Chapter 2. The Pico SDK** に従って以下を実行します。**Chapter 1. Quick Pico Setup** は 開発環境にRaspberry Pi 4を使う場合の設定手順なので、実行しないように!

```
$ cd ~/
$ mkdir pico
$ cd pico

$ git clone -b master https://github.com/raspberrypi/pico-sdk.git
$ cd pico-sdk
$ git submodule update --init
$ cd ..
$ git clone -b master https://github.com/raspberrypi/pico-examples.git

$ sudo apt update
$ sudo apt install cmake gcc-arm-none-eabi build-essential 
```
(Ubuntu-18.04の場合は、最後のapt installでcmakeはインストールせずに自前でビルドします)

Pico SDKの位置を環境変数`PICO_SDK_PATH`に設定しておきます。`.bashrc`に以下の記述を追加します。

```
export PICO_SDK_PATH=${HOME}/pico/pico-sdk
```

# サンプルアプリのビルドと実行

## Chapter 3. Blinking an LED in C

ビルドの手順はドキュメントと全く同一です。

```
$ cd pico-examples
$ mkdir build
$ cd build

$ cmake ..
Using PICO_SDK_PATH from environment ('/home/xxxx/pico-sdk')
PICO SDK is located at /home/xxxx/pico/pico-sdk
  .
  .
  .
-- Build files have been written to: /home/xxxx/pico/pico-examples/build

$ cd blink
$ make -j4
Scanning dependencies of target ELF2UF2Build
Scanning dependencies of target boot_stage2_original
[ 0%] Creating directories for 'ELF2UF2Build'
  .
  .
  .
[100%] Linking CXX executable blink.elf
[100%] Built target blink
```

実行もドキュメントの通りです。Raspberry Pi PicoのBOOTSELボタンを押しながらPCのUSB端子に接続するとマスストレージデバイスとして認識されるので、ビルドでできた`blink.uf2`をドラッグ&ドロップします。
ファイルのコピーが行われると、Raspberry Pi Picoが再起動してLED点滅を始めます。

ビルド直後のコマンドラインで、

```
$ explorer.exe .
```

を実行するとそのフォルダがWindowsのエクスプローラで表示されるので便利です。

ドキュメントでは **3.2.2. Using the command line** でコマンドラインでcpコマンドによって書き込む手順も紹介されていますが、WSLではこの手順はうまく動作しないようです。

**(追記)** WSLからPowerShellを呼び出してコマンドラインから書き込めるようにしました。[【小ネタ】WSL利用時のRaspberry Pi Picoへの書き込みをコマンドラインから行う](https://qiita.com/yunkya2/items/2c8bd3293e834de58d39) を参照してください。

## Chapter 4. Saying "Hello World" in C

ビルド・実行手順はChapter 3.同様です。UART出力を見る際は **9.2.5.1. UART output** を参考にして USBシリアル変換アダプタとジャンパワイヤで接続し、Windowsのターミナルソフトで見てください。