RaspberryPi Pico W 開発環境を Ubuntuで構築する

　前々回の投稿「RaspberryPi Pico の開発環境を Ubuntu と RaspberryPi 4 で構築する」で、Raspberry Pi 4 に Raspberry Pi Pico の開発環境を構築する方法を紹介しました。
[RaspberryPi Pico の開発環境を Ubuntu と RaspberryPi 4 で構築する (Qiita@pipito-yukio)](https://qiita.com/pipito-yukio/items/cad72f07ef441f7ef098)

　実際に Raspberry Pi 4 上の開発環境で各種センサーのアプリを作成・ビルドしてみるとあまりパフォーマンスが良くないなと感じました。そこで今回は Ubuntu PCに開発環境を構築する方法を解説します。
　Ubuntu PCを選択した理由は、**Windows PC に比べ遥かに環境構築が簡単なことです。**

以降 Raspberry Pi 4 はラズパイ４、Raspberry Pi Pico は ラズパイ Pico として説明します。

#### 問題点
   + ローカルPCのVSCodeからラズパイ４のVSCodeへの接続にそこそこ時間がかかる
   + ソースコードの反映(保存)に若干時間がかかる
   + SDカードの破損等の懸念


#### 環境構築手順

(1) 開発環境のみの構築でデバック環境は以下の理由により対象外とします。
　※ラズパイPicoを２台揃えるか、Raspberry Pi デバッグプローブなど別途必要になる為
(2) ```extras``` と ```playground``` もインストール対象外とします。
・[Interface - CQ出版: Pico用USBプログラミング 環境の構築 (PDF)](https://interface.cqpub.co.jp/wp-content/uploads/if2210_077.pdf)
・[raspberrypi/pico-extras](https://github.com/raspberrypi/pico-extras)
・[raspberrypi/pico-playground](https://github.com/raspberrypi/pico-playground)
　※1 ラズパイPicoの開発環境ではセットアップで同時にビルドされている
　※2 ビルドするのであればセットアップスクリプト ```pico_setup.sh``` を確認してください。

+ OS: Ubuntu 22.04
    + Gitがインストール済み
    + ラズパイPicoSDKとサンプルの取得
    + ラズパイOS向けArm用のツールチェーン、ビルドツールのインストール
    + VSCode がインストール済み
        + Microsoft C/C++ Extension Pack のインストール
        + Micfosoft CMake Tools のインストール

### 参考ドキュメント

#### 書籍

日本語で解説されている書籍は重要な情報源。特にこの書籍は様々な環境構築に詳しいです。

+ ラズベリー・パイ Pico/Pico W 攻略本 [CQ出版株式会社]
ISBN978-4-7898-4477-2 (2023 年 6 月 1日 第2版発行)
    + 第２章 開発環境２ … PCだけで Picoをプログラミング

#### 公式ドキュメント

英語ながら裏付けは本家公式ドキュメント

+ [Raspberry Pi Datasheets: Getting started with pico [PDF]](https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf)
    + Chapter 2. The SDK
        + 2.1. Get the SDK and examples
        + 2.2. Install the Toolchain
    + Chapter 7. Using Visual Studio Code

## ローカルPCの環境構築

### 1. ラズパイPico開発用ソースの取得

下記のディレクトリ構成でソースを取得する

```
~/pico/
  pico-sdk/
  pico-examples/
```

公式ドキュメント [2.1 Get the SDK and examples] 

(1) SDKの取得

```bash
$ cd ~/pico
$ git clone https://github.com/raspberrypi/pico-sdk.git --branch master
```

(1)-b. SDKのサブモジュール(lib)の初期化と最新のコミットで更新
```btstack```, ```cyw43-driver```, ```lwip```, ```mbedtls```, ```tinyusb```
```bash
$ cd pico-sdk
$ git submodule update --init
```

(2) サンプルの取得

１つ上の階層に戻って実行

```bash
$ cd ../
$ git clone https://github.com/raspberrypi/pico-examples.git --branch master
```

### 2. ツールチェーンのインストール

公式ドキュメント [2.2 Install the Toolchain] の例をそのまま実行

(1) パッケージ情報の更新

```bash
$ sudo apt update
```

(2) ツールチェーンとビルドツールのインストール

```bash
$ sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential
```
※1 build-essential は pythonをソースコードからビルドしている場合はすでにインストール済みです。
※2 ラズパイOSのpythonと UbuntuOSのpythonのバージョンは通常異なります。ラズパイOSのpython向けのアプリをローカルPCで作成する場合はソースコードからpythonをビルドすることが必要になります。
※3 pythonをソースコードからビルドする方法については下記Qiita投稿をご覧ください。
[Ubuntu環境 Raspberry Pi のpythonアプリ用にpythonをソースコードからビルドする](https://qiita.com/pipito-yukio/items/6aed846676a056363418)

### 3. ユーザーの環境変数編集

下記の環境変数を .bashrc に追加していたほうが後々の作業が楽になります。

+ 環境変数 **PICO_SDK_PATH** を ```.bashrc``` に追加する
+ 環境変数を反映させる

```bash
$ cd ~
$ echo "export PICO_SDK_PATH=$HOME/pico/pico-sdk" >> ~/.bashrc
$ . ~/.bashrc
```

### 4.サンプルのビルド

#### 4-1. cmake プリプロセス実行

+ サンプルのディレクトリ直下に build ディレクトリを作成
+ cmake プロプロセスオプションの設定
    + **PICO_BOARD=pico_w**
    ※ラズパイPico W を使う場合は必須
    + CMAKE_BUILD_TYPE=Release
    ※今回はデバックしないため指定。デフォルトはDebug

```bash
$ cd ~/pico/pico-examples
$ mkdir build
$ cd build
$ cmake .. -DPICO_BOARD=pico_w -DCMAKE_BUILD_TYPE=Release
```

下記のように出力されたらOKです。

※```pico-extras``` と ```pico-playground``` がセットアップされていないので、 ```xxxx submodule unavailable``` 等が出力されますが問題ありません。

```bash
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yukio/pico/pico-examples/build
```

#### 4-2. 点滅サンプルビルド (Pico W用)

Pico W 用の点滅サンプルは ```build/pico_w/wifi/blink``` に有ります

```bash
$ cd pico_w/wifi/blink/
$ make -j4
```

最終的に下記のように出力されたらOKです。※ビルド途中のコンソール出力は割愛します。

```bash
[100%] Linking CXX executable picow_blink.elf
[100%] Built target picow_blink
```

一番最後のファイル ```picow_blink.uf2``` を ラズパイPico W にコピーします

```bash
$ ls -lrt --time-style long-iso
合計 2888
-rw-rw-r-- 1 yukio yukio 143489 2024-03-06 15:34 Makefile
-rw-rw-r-- 1 yukio yukio   1154 2024-03-06 15:34 cmake_install.cmake
drwxrwxr-x 3 yukio yukio   4096 2024-03-06 15:34 CMakeFiles
-rw-rw-r-- 1 yukio yukio 275655 2024-03-06 15:45 picow_blink.elf.map
-rwxrwxr-x 1 yukio yukio 307260 2024-03-06 15:45 picow_blink.elf
-rw-rw-r-- 1 yukio yukio 740861 2024-03-06 15:45 picow_blink.hex
-rwxrwxr-x 1 yukio yukio 263368 2024-03-06 15:45 picow_blink.bin
-rw-rw-r-- 1 yukio yukio 672446 2024-03-06 15:45 picow_blink.dis
-rw-rw-r-- 1 yukio yukio 526848 2024-03-06 15:45 picow_blink.uf2
```

#### 4-3. ラズパイPico W の接続

+ [BOOTSEL] ボタンを押しながら ラズパイPicoとPCをUSBケーブルで接続
※SCSI ドイラブとして認識されています ※SDカードと同じ扱い

```bash
$ lsusb | grep RP2
Bus 004 Device 004: ID 2e8a:0003 Raspberry Pi RP2 Boot
$ sudo dmesg | tail | grep RP2
[ 4965.945223] scsi 7:0:0:0: Direct-Access  RPI  RP2          3    PQ: 0 ANSI: 2
$ ls -l /media/yukio/RPI-RP2/
合計 8
-r--r--r-- 1 yukio yukio 241  9月  6  2008 INDEX.HTM
-r--r--r-- 1 yukio yukio  62  9月  6  2008 INFO_UF2.TXT
```

#### 4-4. ラズパイPico W で実行

+ ```picow_blink.uf2``` をマウント先にコピー
※1 コピーが完了すると(数秒かかります)、自動でラズパイPico W がアンマウントされ内蔵のLEDが点滅します。
※2 マウント先を開いてバイナリをドラック&コピーすることもできます

```bash
$ cp picow_blink.uf2 /media/yukio/RPI-RP2/
```


![Dell_t7500_to_pico_connect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/7f5c8371-e541-427f-7994-2d379160c371.jpeg)

### 5.VSCodeの設定

サンプルプロジェクトを初めて開くと下記のような[キットのスキャン]プロンプトが開きます

+ 下記コンパイラーを選択
```GCC 10.3.1 arm-none-eabi コンパイラ C =/usr/bin/arm-none-eabi-gcc, CXX=/usr/bin/arm-none-eabi-g++```

![VSCode_0_setCompilor_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/6a53b54b-1f05-56f7-2829-77861a3fa674.png)

選択後 cmakeが実行され、buildディレクトリにビルド用(make)のファイル群が作成されます。

この状態でソースコードを開くとインクルードが波線のエラーになっています。

![VSCode_2_picow_blink_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/0302e2c6-ac6f-6f20-236f-ddc2ac22e3a4.png)

このエラーを解消するには手動でクロスコンパイラの設定を追加する必要があります。
```c_cpp_properties.json```
[公式ドキュメント Visual Studio Code: Docs > C++ > IntelliSense for cross-compiling](https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation)

更に上記ファイルのインクルードパスにラズパイPico SDKの環境変数を追加する必要があります。
[c_cpp_properties.json support for environment variables defined in ~/.bashrc used in "includePath" and "compilerPath" #11186](https://github.com/microsoft/vscode-cpptools/issues/11186)

　クロスコンパイラのインテリセンス設定ファイルを新規作成し、ラズパイPico SDKの環境変数を追加する。

```.vscode/c_cpp_porperties.json
{
  "configurations": [
    {
       "name": "Linux",
       "includePath": [
           "${workspaceFolder}/**",
           "${env:PICO_SDK_PATH}/**"
       ],
      "defines": [],
      "compilerPath": "/usr/bin/arm-none-eabi-g++",
      "cStandard": "c11",
      "cppStandard": "c++14",
      "IntelliSenseMode": "linux-gcc-arm"
    }
  ],
  "version": 4
}
```

作成したファイルを保存すると下記画面のような構成の変更ログが出力されます。

![VSCode_9_manulaCreateC_CPP_props.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/0b8d2f0f-0189-8d10-d0fc-3d38b8eb251b.png)

**更にラズパイPico W 用に cmake コマンドを再実行する必要があります。**
※1 キットの選択後に実行されるcmakeのターゲットはデフォルトで ラズパイPico用です。
※2 VSCodeのターミナルから実行できます。

```bash
yukio@Dell-T7500:~/pico/pico-examples/build$ cmake .. -DPICO_BOARD=pico_w -DCMAKE_BUILD_TYPE=Release
PICO_SDK_PATH is /home/yukio/pico/pico-sdk
PICO platform is rp2040.
Build type is Release
PICO target board is pico_w.
Using CMake board configuration from /home/yukio/pico/pico-sdk/src/boards/pico_w.cmake
Using board configuration from /home/yukio/pico/pico-sdk/src/boards/include/boards/pico_w.h
TinyUSB available at /home/yukio/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; enabling build support for USB.
BTstack available at /home/yukio/pico/pico-sdk/lib/btstack
cyw43-driver available at /home/yukio/pico/pico-sdk/lib/cyw43-driver
Pico W Bluetooth build support available.
lwIP available at /home/yukio/pico/pico-sdk/lib/lwip
Pico W Wi-Fi build support available.
mbedtls available at /home/yukio/pico/pico-sdk/lib/mbedtls
Skipping some Pico W examples as WIFI_SSID is not defined
Skipping some Pico W BTstack examples that require pico-extras
Adding 19 BTstack examples of type 'background'
Skipping TinyUSB dual examples, as TinyUSB hw/mcu/raspberry_pi/Pico-PIO-USB submodule unavailable
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yukio/pico/pico-examples/build
```

　これでラズパイPico W 用のソースのインテリセンスが有効になり、ヘッダーファイルも開けるようになります。

![VSCode_3_includeOK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/e2e65bcd-00f5-5c67-2249-4a8bc7e26063.png)

ヘッダーは ```settings.json``` に追加されます。

```.vscoce/settings.json
{
   "files.associations": {
      "stdlib.h": "c",
      "cyw43_arch.h": "c"
   }
}
```

### 最後に

　前々回はラズパイ４上で稼働するVSCodeをリモートから開いてビルドしていましたが、今回ホストPCのVSCodeから直接コードの作成・編集・ビルド・ターゲットへの投入ができるようになり格段に作業が捗るようになりました。

 参考までにインクルードパスとCMakeToolsキャッシュを下記に示します。

(1) コンパイラーのインクルードパス: ```/usr/include/newlib/```
 
```
stdio.h
string.h
math.h
...
```
(2) ラズパイPico SDK のインクルードバス
```$PICO_SDK_PATH/src/common/pico_stdlib/include/```
```
pico/
  stdlib.h
  binary_info.h
hardware/
  gpio.h
  adc.h
  spi.h
```

(3) CMakeToolsキャッシュディレクトリ

　**もしキットの選択を誤った場合は下記ファイルを削除すると、再度キットの選択プロンプトが表示されるのでやり直すことが出来ます。**

```~/.local/share/CMakeTools```
※これは私のUbuntu-22.04 環境の内容

```cmake-tools-kits.json
[
  {
    "name": "GCC 10.3.1 arm-none-eabi",
    "compilers": {
      "C": "/usr/bin/arm-none-eabi-gcc",
      "CXX": "/usr/bin/arm-none-eabi-g++"
    },
    "isTrusted": true
  },
  {
    "name": "GCC 11.4.0 x86_64-linux-gnu",
    "compilers": {
      "C": "/usr/bin/gcc",
      "CXX": "/usr/bin/g++"
    },
    "isTrusted": true
  },
  {
    "name": "GCC 12.3.0 x86_64-linux-gnu",
    "compilers": {
      "C": "/usr/bin/gcc-12"
    },
    "isTrusted": true
  },
  {
    "name": "GCC 9.5.0 x86_64-linux-gnu",
    "compilers": {
      "C": "/usr/bin/gcc-9"
    },
    "isTrusted": true
  }
]
```