この半導体不足の中、STM32もRX71も在庫が全くなく
創作意欲がどんどん削がれていくことを実感している中、
唯一と言っていいほど在庫が枯渇せず安定供給されている(ように見える)
Raspberry Pi Pico(RP2040 MCU)に手を出して暇つぶししようと思い立ち、
環境構築で意外に手こずったので誰かが同じ轍を踏むと考えてメモ。
やりたいこと
Windows上だけで完結する、可能な限りWindowsの環境変数を汚さずに手順が簡素な
RP2040(with Pico SDK)のC++コンパイル環境を整えたい。
MicroPythonは無視。デバッグ環境も無視。
コンパイルしてRaspberry Pi Picoに直接書き込める「UF2」ファイルを生成できることがゴール。
開発環境構築
単体でダウンロードすべきもの
- Visual Studio Code(通称、VSCode) https://code.visualstudio.com/#alt-downloads
- Python for Windows 3.9以上 https://www.python.org/downloads/windows/
(Pythonなんてつかわねーよ!!C++で開発するんだよ!って思ってても、
Pico SDKの内部でPython利用してるのでインストール必須)
- MSYS2 https://www.msys2.org/
(Mingw-w64単体でもできなくはないけど、ARM GCCをMSYS2に内包させたほうがコンパクトでWindowsを汚さずに済む)
- Pico SDK https://github.com/raspberrypi/pico-sdk
(gitでpico-sdkのファイル丸ごとcloneしてもいいし、zipでダウンロードして任意の場所に展開するのもアリ)
インストールとかの手順
すでにインストールされているなら、不足分設定のみを実施。
実施順序はあまり関係ないが、最終的にVSCode側とPico SDK側でそれぞれの項目が自動認識される必要がある。
- Visual Studio Codeのインストール
- Visual Studio Codeの拡張機能のインストール
- Python for Windowsのインストール
- MSYS2のインストール
- MSYS2の追加パッケージのインストール
- Pico SDKの設置
- Windowsの環境変数の確認
- テンプレート用プロジェクトの作成
- 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」に修正する。

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



上記までいけたらあとは道なりにインストール終わるのを待つだけ。
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は今後コンパイル時毎回使用するので、一時ディレクトリとかではなく、
それ専用に作ったディレクトリに置いておいたほうがいい。

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

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


「MSYS2内部のARM GCCコンパイラの場所」 を追加
すでに内部スクリプトか何かで設定されているのなら何もしなくていい

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

作成したフォルダの中に、「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上からは自動認識されるハズだけど、念のためビルド内容確認しておく。

ここで重要なのは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。

あとは生成されたuf2ファイルをMCUに書き込んで、トライ&エラーでデバッグしていく地獄の日々の始まり。
uf2ファイルをRaspberry Pi Picoに書き込む方法は他のサイトで腐るほど紹介されてるので割愛。
テンプレートからの自分のプログラムの作成の流れ
一応だいたい流れはつかめたと思うけど、応用性ゼロの人のために
テンプレートから自分のプログラム作成の方法を紹介。
- テンプレートプロジェクトフォルダを任意の場所にコピー
- コピーしたプロジェクトフォルダの名前を任意に変更(MyProject1など、半角英字のみで記号特殊文字含まないこと)
- VSCodeを起動し、プロジェクトフォルダを開く
- 「build」フォルダは前のキャッシュ含んでる可能性があるので、初回は削除する
- CMakeLists.txtの中にある、10行目の「project()」の中の部分を任意に変更
(ここで指定した名前でuf2ファイルが生成される)
(もちろん半角英字のみで特殊文字含まないこと) - ソースコードを任意に編集
- ビルドボタン押して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