windowsでのraspipicoの開発環境の構築 その1

下記の手順に関してまとめる。  

### 開発環境の構築

#### WSLのセットアップ

WSLのセットアップは、公式ページを参考にセットアップを行う。

Windows 10 バージョン 2004 以降 (ビルド 19041 以降) または Windows 11 を実行している必要がある。

https://docs.microsoft.com/ja-jp/windows/wsl/install


管理者の PowerShell または Windows コマンド プロンプトを起動して、下記のコマンドを実行する。

```sh
wsl --install
```

Ubuntuがインストールされたので次に、Linux ユーザー情報を設定する。

https://docs.microsoft.com/ja-jp/windows/wsl/setup/environment#set-up-your-linux-username-and-password

[スタート] メニューを使用してディストリビューション (既定では Ubuntu) を開き、Linux ディストリビューションのユーザー名とパスワードの作成をする。

パッケージの更新とアップグレードを行う。

```sh
sudo apt update && sudo apt upgrade
```

ここまで出来たら、WSLのセットアップは完了。

WSLは2もあり、バージョンを変更する場合は下記を参照。

https://docs.microsoft.com/ja-jp/windows/wsl/install#check-which-version-of-wsl-you-are-running

#### VScodeのセットアップ

エディタにはVScodeを使用する。
下記からダウンロードとインストールを行う。

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

インストールまで行ったら、初めにリモート接続用の拡張機能を追加する。
日本語化は、**Japanese Language Pack for Visual Studio Code**をインストールした。
ローカル環境に対して拡張機能タブで**c/c++**と検索して **c/c++ extention pack**をインストールする。

![拡張機能タブ](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220117/20220117231619.png)

次に、リモートエクスプローラーから、WSLへ接続を行う。

![リモートエクスプローラータブ](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220117/20220117231753.png)

接続を行った後から、リモート先へ拡張機能を追加する。
下記の拡張をインストールした。

- C/C++ Extension Pack (必須)
- Japanese Language Pack for Visual Studio Code (任意)

上記でエディタの環境構築は終了。

#### 必要なツールのセットアップ

WSL上のUbuntuの環境を構築する。
VScode上から、WSLに接続してUbuntuを操作する。
下記の図の**window+マーク**を選択し、wslに接続する。

![WSLの選択](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220118/20220118082111.png)

WSLへの接続が正しくされると下記のように表示される。

![WSL接続完了](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220118/20220118082210.png)

`ctrl + @`を押すとVScode上でターミナルが起動する。

最初に、パッケージのアップデート・アップグレードを行う。

```sh
sudo apt update && sudo apt upgrade
```

次に必要なパッケージをインストールする。

```sh
 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential git
```

下記の資料を参考にした。
基本的なことは下記に書いてあり、Raspberry Piからプログラムするのが一般的だが、
現在、とても値上がりしていたり、入手しにくい状況のため、今回は、windowsからの入門にすることとした。

https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html#raspberry-pi-pico-cc-sdk

https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf

https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf

#### LEDチカチカまでのプロジェクト作成ビルドまで

手順としては、下記のように行う。

- `pico-sdk`をクローンする。
-  `CmakeList.txt`にインクルード、編集する。
-  C/C++のソースを編集する。
- ビルドする。
- Raspberry Pi Picoへ送る

##### `pico-sdk`をクローンする。

下記のコマンドを使用して、`pico-sdk`をクローンする。

```sh
git clone https://github.com/raspberrypi/pico-sdk.git
```

[https://github.com/raspberrypi/pico-sdk.git:embed:cite]

今回は下記のようなフォルダ構成とする。
```sh
$ tree -L 1 ./
./
├── LEDblink
└── pico-sdk
```

##### `CmakeList.txt`にインクルード、編集する。

LEDblinkフォルダ下には下記のようなフォルダ構成とする。

```sh
$ tree -L 1 ./LEDblink
./LEDblink
├── CMakeLists.txt
└── src

$ tree ./src
./src
└── pico-display
    ├── CMakeLists.txt
    └── main.c
```

LEDblink/CMakeLists.txtは下記のようにした。
```cmake
cmake_minimum_required(VERSION 3.12)

set(ENV{PICO_SDK_PATH} "${HOME}/src/repo/pico/pico-sdk/" )

# Pull in SDK (must be before project)
include(../pico-sdk/external/pico_sdk_import.cmake)

project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.0")
    message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.3.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
endif()

# Initialize the SDK
pico_sdk_init()

add_compile_options(-Wall
        -Wno-format          # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
        -Wno-unused-function # we have some for the docs that aren't called
        -Wno-maybe-uninitialized
        )

add_subdirectory(src/pico-ledblink)
```

基本的には、サンプルプログラムから引用した。

https://github.com/raspberrypi/pico-examples

注目点は、下記の通り。

- `set(ENV{PICO_SDK_PATH} "${HOME}/src/repo/pico/pico-sdk/" )`
- `include(../pico-sdk/external/pico_sdk_import.cmake)`
- `add_subdirectory(src/pico-ledblink)`


`set(ENV{PICO_SDK_PATH} "${HOME}/src/repo/pico/pico-sdk/" )`および`include(../pico-sdk/external/pico_sdk_import.cmake)`は、サンプルを参考にPico-SDK使用するために設定する。

`add_subdirectory(src/pico-ledblink)`をして、プロジェクトを追加する。

LEDblink/src/CMakeLists.txt下は下記の通り。

```cmake
add_executable(pico_ledblink
    main.c
    )

# pull in common dependencies
target_link_libraries(pico_ledblink pico_stdlib)
```

pico_ledblinkのビルドとpico_ledblinkにライブラリをリンクする。

##### C/C++のソースを編集する。

```c
/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "pico/stdlib.h"

#define BACK_LIGHT_PIN 

int main() {
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while (true) {
        gpio_put(LED_PIN, 1);
        sleep_ms(250);
        gpio_put(LED_PIN, 0);
        sleep_ms(250);
    }
}
```

0.25秒おきに点滅するプログラムの完成。

##### ビルドする。

gcc-arm-none-eabiを使用してビルドを行う。

![キットのスキャン](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220119/20220119211144.png)

キットのスキャンを行い、gcc-arm-none-eabiを選択する。

![キットとビルド](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220119/20220119211338.png)

VScodeのウィンドウ下方に上記のように表示されていればいざ、ビルドする。

ビルドがされると`pico-ledblink.elf`が`.build/src/pico-display/pico_display.elf`に生成される。
このまま送っても動作しないため、`.uf2`に変換する。
変換するには、pico-sdk内に`elf2uf2`というツールがあるため、このツールを使用して変換する。

pico-sdkのプロジェクトを開き、プロジェクトをビルドする。
キットのスキャンを行い、gcc-arm-none-eabiを選択する。
そしてビルドすると、`./pico-sdk/build/elf2uf2/elf2uf2`が生成される。

そして、下記のコマンドを使用し`.uf2`に変換する。

```sh
../pico-sdk/build/elf2uf2/elf2uf2 build/src/pico-display/pico_ledblink.elf build/src/pico-display/pico_ledblink.uf2
```

この変換は、下記のサイトを参考にした。

https://mickey-happygolucky.hatenablog.com/entry/2021/02/22/122440

##### Raspberry Pi Picoへ送る。

Raspberry Pi Picoをパソコンに接続し、linux内でマウントを行うことで転送する。

https://qiita.com/pokobur/items/3d9214fe1810d5d63044

上記のサイトを参考にマウントを行った。

Raspberry Pi Picoをマウントするには、bootボタンを押したままUSBを接続する。
その後、下記のコマンドを実行する。今回は、windows上でDドライブにRaspberry Pi Picoがマウントされたことを前提としている。

```sh
$ sudo mkdir /mnt/d
$ sudo mount -t drvfs D: /mnt/d
```

上記によって下記のようにlinuxにRaspberry Pi Picoがマウントされる。

```sh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        251G  4.6G  234G   2% /
tmpfs           3.1G     0  3.1G   0% /mnt/wsl
tools           238G  201G   38G  85% /init
none            3.1G     0  3.1G   0% /dev
none            3.1G  8.0K  3.1G   1% /run
none            3.1G     0  3.1G   0% /run/lock
none            3.1G     0  3.1G   0% /run/shm
none            3.1G     0  3.1G   0% /run/user
tmpfs           3.1G     0  3.1G   0% /sys/fs/cgroup
drivers         238G  201G   38G  85% /usr/lib/wsl/drivers
lib             238G  201G   38G  85% /usr/lib/wsl/lib
C:\             238G  201G   38G  85% /mnt/c
D:              128M   20K  128M   1% /mnt/d
```

最後に、`$ cp build/src/pico-display/pico_display.uf2 /mnt/d/`を行うとPicoにコピーされる。

コピーされたのち、一回Picoを抜いて再度挿すとコピーした実行ファイルが実行される。

https://qiita.com/4580TAT/items/39d2dfe2a4d4b5e9c578