Windows上のVScodeでRP2040(Raspberry Pi Pico)のC++開発環境(コンパイルからuf2ファイル生成まで)を整える

この半導体不足の中、STM32もRX71も在庫が全くなく
創作意欲がどんどん削がれていくことを実感している中、
唯一と言っていいほど在庫が枯渇せず安定供給されている(ように見える)
Raspberry Pi Pico(RP2040 MCU)に手を出して暇つぶししようと思い立ち、
環境構築で意外に手こずったので誰かが同じ轍を踏むと考えてメモ。

やりたいこと

Windows上だけで完結する、可能な限りWindowsの環境変数を汚さずに手順が簡素な
RP2040(with Pico SDK)のC++コンパイル環境を整えたい。
MicroPythonは無視。デバッグ環境も無視。
コンパイルしてRaspberry Pi Picoに直接書き込める「UF2」ファイルを生成できることがゴール。


開発環境構築

単体でダウンロードすべきもの


インストールとかの手順

すでにインストールされているなら、不足分設定のみを実施。
実施順序はあまり関係ないが、最終的にVSCode側とPico SDK側でそれぞれの項目が自動認識される必要がある。

  1. Visual Studio Codeのインストール
  2. Visual Studio Codeの拡張機能のインストール
    1. 「C/C++」のインストール
    2. 「C++ Intellisense」のインストール
    3. 「CMake Tools」のインストール (CMake拡張機能もくっついてくる)
    4. 「CMake Tools」の設定の変更
  3. Python for Windowsのインストール
  4. MSYS2のインストール
  5. MSYS2の追加パッケージのインストール
    1. MSYS2の最新アップデート適用
    2. 「base-devel」、「mingw-w64-x86_64-toolchain」パッケージの追加
    3. 「mingw-w64-x86_64-cmake」パッケージの追加
    4. 「mingw-w64-x86_64-arm-none-eabi-gcc」パッケージの追加
  6. Pico SDKの設置
  7. Windowsの環境変数の確認
  8. テンプレート用プロジェクトの作成
  9. VSCodeでのコンパイル確認

インストール手順の詳細

基本的にWindows 10の64bit環境を想定してます。

1. Visual Studio Codeのインストール

特筆するべき部分なし。普通にダウンロードして普通にインストール

環境変数は編集するのメンドクサイので、インストール時に自動で入れてもらうようにチェックつける。


2. Visual Studio Codeの拡張機能のインストール

インストールしたVScodeを起動して、拡張機能ペイン(Ctrl+Shift+X)を呼び出して、
それぞれ拡張機能を検索して入れていくだけ。

 2-1. 「C/C++」のインストール

 Microsoft公式が出してるやつ。似たような名前のやついっぱいあるけど、
 たぶん一番上に公式のやつが表示されるので間違うことはないはず。

 2-2. 「C++ Intellisense」のインストール

 たぶん「C/C++」のインストール終わった段階でVScodeが「こんなんもどう?」って宣伝してくるはず。
 宣伝してこなかったらまた検索してインストール。

 製作者はMicrosoft公式じゃなくて、「austin」って表示されてるやつ。

 2-3. 「CMake Tools」のインストール

 「CMake Tools」で検索したらドンピシャで出てくる。Microsoft公式のやつ。
 これをインストールしたら、製作者「twxs」の「CMake」も一緒にくっついてくる。

▼2-3が終わった時点で、拡張機能は下記のようにインストールされているはず。
(べつにこれ以外の拡張機能が入っていても問題はない)

インストール済み拡張機能画面の画像

 2-4. 「CMake Tools」の設定の変更

 「CMake Tools」の「CMake:Generator」が「MinGW Makefiles」以外の値になっていたら、
 「MinGW Makefiles」に修正する。

CmakeTools設定変更の画面
▲CMake Toolsの設定変更

3. Python for Windowsのインストール

ダウンロードしてきたものをインストールしていくだけだけど、
途中の画面で環境変数に関する部分がデフォチェックOFFで出てくるので、チェックをつけることを忘れずに!

Pythonインストール画面説明画像
▲インストールウィザード最初の画面。まずここでトラップ
Pythonインストール画面説明画像2
▲2つ目の画面。たぶん全部チェック不要だけど不安なので下三つにチェック
Pythonインストール画面説明画像3
▲3つ目の画面。一番上は「パソコン初心者にありがちなユーザー名に全角文字入れてる人」がいることを想定。

上記までいけたらあとは道なりにインストール終わるのを待つだけ。


4. MSYS2のインストール

MSYS2の環境変数は自分で入れないといけないので、インストール時は特筆すべき事項なし。
公式ドキュメント(https://www.msys2.org/)の「4.」までの手順に沿ってインストールすればOK。


5. MSYS2の追加パッケージのインストール

 5-1. MSYS2の最新アップデート適用

 公式ドキュメント(https://www.msys2.org/)の「5.」から「6.」の項目。最新アップデートを適用。
 なんのひねりもなく、MSYS2起動させて、「pacman -Syu」叩いて適宜「y」押してアプデ。
 終わったら「pacman -Su」 叩いて適宜「y」押してアプデ。

 5-2. 「base-devel」、「mingw-w64-x86_64-toolchain」パッケージの追加

 公式ドキュメント(https://www.msys2.org/)の「7.」の項目。
 コマンド「pacman -S –needed base-devel mingw-w64-x86_64-toolchain」 叩いて
 適宜「y」押してMinGWのdevel関係ツールのインストール。

 この手順で、MSYS2内部に「make」コマンドが入る。

 5-3. 「mingw-w64-x86_64-cmake」パッケージの追加

 ここから公式ドキュメントにはない設定。

 コマンド「pacman -S mingw-w64-x86_64-cmake」を叩いて
  適宜「y」押してMinGWのCMake関係ツールのインストール 。

 この手順で、MSYS2内部に「cmake」コマンドが入る。

 5-4. 「mingw-w64-x86_64-arm-none-eabi-gcc」パッケージの追加

 こちらも公式ドキュメントにはない設定。

 コマンド「pacman -S mingw-w64-x86_64-arm-none-eabi-gcc」を叩いて
 適宜「y」押してMinGW内部に、「Arm GCCコンパイラー環境」を導入。

 この手順で、MSYS2内部に「arm cortex用gcc、g++」コマンドが入る。


6. Pico SDKを設置

Raspberry財団公式の「Pico SDK」がGithubに公開されているので、それをとってきて、
今後定期的に使用するディレクトリに展開設置するだけ。

「Git」コマンドが使える人はgit cloneとかで任意のディレクトリにコピー取ってくる。
(git submodule add https://github.com/raspberrypi/pico-sdk.git とか)

「Git」コマンド使いたくない人は、Githubのページ(https://github.com/raspberrypi/pico-sdk)からzipでダウンロードしてきたものを
zip展開して置けば大丈夫。

このSDKは今後コンパイル時毎回使用するので、一時ディレクトリとかではなく、
それ専用に作ったディレクトリに置いておいたほうがいい。

GithubからZIPダウンロードする方法の画像
▲意地でもGit系コマンドを使いたくない人用

ここで、「pico-sdk」が展開された場所を、環境変数に登録する必要がある。
具体的に書くと、「LICENSE.TXT」が入っているディレクトリが「pico-sdk」のルートで、
「PICO_SDK_PATH」に登録するべきもの。

PICO_SDK_PATHに設定するべき場所確認方法画像

7. Windowsの環境変数の確認

コンパイルのために、「MSYS2内部のARM GCCコンパイラの場所」と「PICO_SDK_PATH」を登録しておく必要があるので、
Windowsの環境変数設定画面に登録していく。

環境変数をスタートメニューで検索する方法画像
▲実はスタートメニューから環境変数設定画面を呼び出せる
環境変数編集画面画像
▲システム側でもユーザー側でもどっちでもいいので「Path」の環境変数を編集して、
「MSYS2内部のARM GCCコンパイラの場所」 を追加
 すでに内部スクリプトか何かで設定されているのなら何もしなくていい
環境変数編集画面画像2
▲同じ画面でユーザー環境変数にPICO_SDK_PATHを新規追加する
  すでに内部スクリプトか何かで設定されているのなら何もしなくていい

8. テンプレートプロジェクトの作成

毎回めんどくさい処理をせず、フォルダごとコピーして、
一部分だけ名前変えればコンパイル通せるようにカスタマイズした
「テンプレートプロジェクト」を作成する。

まず、空のフォルダを作成。

空フォルダ作成の画面画像
▲どこでもいいし、どんな名前でもいいので、空のフォルダを作成する

作成したフォルダの中に、「CMakeLists.txt」と「main.cpp」という名前の新規テキストファイルを作成。

空のテキスト作成したときの画像
▲テンプレートディレクトリ内に、空の新規ファイルを作成して名前を 「CMakeLists.txt」と「main.cpp」 に

そして、それぞれの中身を下記のように編集。
(CMakeLists.txtは CMAKE_C_COMPILER と CMAKE_CXX_COMPILER に注意)

# Set minimum required version of CMake
cmake_minimum_required(VERSION 3.12)
set(CMAKE_C_COMPILER C:/msys64/mingw64/bin/arm-none-eabi-gcc.exe)
set(CMAKE_CXX_COMPILER C:/msys64/mingw64/bin/arm-none-eabi-g++.exe)

# Include build functions from Pico SDK
include($ENV{PICO_SDK_PATH}/pico_sdk_init.cmake)

# !!!! SET PROJECT NAME !!!!
project(ZZZZ_TEMPLATE)

# Creates a pico-sdk subdirectory in our project for the libraries
pico_sdk_init()

# Tell CMake where to find the executable source file
add_executable(${PROJECT_NAME} 
    main.cpp
)

# Link to pico_stdlib (gpio, time, etc. functions)
target_link_libraries(${PROJECT_NAME} 
    pico_stdlib
)

# Enable usb output, disable uart output
pico_enable_stdio_usb(${PROJECT_NAME} 1)
pico_enable_stdio_uart(${PROJECT_NAME} 0)

# Create map/bin/hex/uf2 files
pico_add_extra_outputs(${PROJECT_NAME})

CMAKE_C_COMPILER は、MSYS2内に内包したARM GCCの「arm-none-eabi-gcc.exe」のフルパスを記述する。
CMAKE_CXX_COMPILER は、MSYS2内に内包したARM GCCの「arm-none-eabi-g++.exe」のフルパスを記述する。
(上記のソースはいずれもデフォルトでインストールした時のものを記載してる)

もちろんパス記述の際はディレクトリの区切りに「¥(半角YENまたはバックスラッシュ)」は使えないぞ☆

#include <stdio.h>
#include "pico/stdlib.h"

int main() {

    const uint led_pin = 25;

    // Initialize LED pin
    gpio_init(led_pin);
    gpio_set_dir(led_pin, GPIO_OUT);

    // Initialize chosen serial port
    stdio_init_all();

    // Loop forever
    while (true) {

        // Blink LED
        printf("BLINK LED\r\n");
        gpio_put(led_pin, true);
        sleep_ms(1000);
        gpio_put(led_pin, false);
        sleep_ms(1000);
    }
}

改行コードはCR/LFのままで、文字コードはUTF-8 BOMなし(Windows 10の標準)で保存。

これでテンプレートプロジェクトの作成は完了。


9. VSCodeでのコンパイルの確認

さきほど作成した作成したテンプレートプロジェクトをフォルダごと別の場所にコピーし、
VSCodeでそのフォルダを開いてコンパイルが通るかどうか確認する。

ここまでの手順でVSCode上からは自動認識されるハズだけど、念のためビルド内容確認しておく。

VSCodeビルド設定するときの画面画像
▲テンプレートフォルダのコピーをVSCodeで開いたときの画面。それぞれ画面下の設定項目を確認してビルドしてみる

ここで重要なのはARM GCCのコンパイラ(GCC 10.XX arm–none-eabi)が項目に表示され、設定できること
この時点で「 GCC 10.XX arm–none-eabi 」が画面に現れないのであれば、
VSCodeが自動検出に失敗している。つまり、
環境変数設定がミスってるか、
VSCodeかWindowsを起動しっぱなし環境変数更新されていないか、
そもそもARM GCCまたはCMakeが正しく入ってない(MSYS2側の設定ミス)

プリビルド時点では、ソースコードにエラーっぽい赤線でるけど、ほとんどの場合別原因なのでスルーでOK。
(ヘッダファイルが見つからないとか uint や true false が定義されていない とか。)

VSCodeの出力ペイン(Ctrl + Shift + U)に、プリビルドが正しく通らない理由が出てるのでよく目を通して対応すること。

プリビルドが通った場合は、出力ペインに
[cmake] — Configuring done
[cmake] — Generating done
が表示されているはず。(初回プリビルドはGenerating doneが出るまでちょっと時間かかる)

テンプレートフォルダのbuildフォルダは自動生成で何回でも生成できるので、
設定ミスったら設定を適切に編集しなおしてから、buildフォルダ削除してビルドをやり直せばOK。

VSCodeでビルド成功したときの画面画像
▲ビルド&コンパイルが成功したら、uf2ファイルがbuildフォルダ内に生成される

あとは生成されたuf2ファイルをMCUに書き込んで、トライ&エラーでデバッグしていく地獄の日々の始まり。
uf2ファイルをRaspberry Pi Picoに書き込む方法は他のサイトで腐るほど紹介されてるので割愛。


テンプレートからの自分のプログラムの作成の流れ

一応だいたい流れはつかめたと思うけど、応用性ゼロの人のために
テンプレートから自分のプログラム作成の方法を紹介。

  1. テンプレートプロジェクトフォルダを任意の場所にコピー
  2. コピーしたプロジェクトフォルダの名前を任意に変更(MyProject1など、半角英字のみで記号特殊文字含まないこと)
  3. VSCodeを起動し、プロジェクトフォルダを開く
  4. 「build」フォルダは前のキャッシュ含んでる可能性があるので、初回は削除する
  5. CMakeLists.txtの中にある、10行目の「project()」の中の部分を任意に変更
    (ここで指定した名前でuf2ファイルが生成される)
    (もちろん半角英字のみで特殊文字含まないこと)
  6. ソースコードを任意に編集
  7. ビルドボタン押してuf2ファイル生成→Picoに書き込む→デバッグ→バグってたらbuildフォルダ削除して6. の手順にもどる

参考になったサイト

How to Set Up Raspberry Pi Pico C/C++ Toolchain on Windows with VS Code
https://shawnhymel.com/2096/how-to-set-up-raspberry-pi-pico-c-c-toolchain-on-windows-with-vs-code/

Raspberry Pi Pico C/C++ SDK 環境構築 on Windows 10
https://qiita.com/iwatake2222/items/33b4cd3a39da5a44dc02

Raspberry Pi PicoをC/C++で制御するのをWindows内で完結させる
https://qiita.com/y-chan/items/96e379bc1912e0067ce2

Raspberry Pi Pico and RP2040 – C/C++ Part 1: Blink and VS Code
https://www.digikey.co.uk/en/maker/projects/raspberry-pi-pico-and-rp2040-cc-part-1-blink-and-vs-code/7102fb8bca95452e9df6150f39ae8422

コメントを残す