書こうと思った理由
RasPiPico の環境構築方法を調べると、めんどくさい手順が多すぎるのと、
最新の公式環境(VSCode で Raspberry Pi Pico拡張機能をインストール)ではうまくいかなかったので、慣れているPlatformIOを使いたかったです。
余計なツールはなるべくインストールしたくない。複雑な開発環境にしたくないという気持ちで書いてます。
出来上がる環境
Windows で VSCode を立ち上げて、
Raspberry pi Pico をBOOTSELボタンを押さずに差して、
PlatformIOから Upload を押せばプログラムを書き換えられる。
以下手順です。
環境構築手順
OS
Windowsです。Linuxには一切触りません。
VSCode のインストール
エディター・ビルド・アップロードまで行うツール。
有名どころなので割愛。
https://code.visualstudio.com/download
PlatformIO のインストール
PlatformIO は、 VSCodeの拡張機能として提供されており、マイコンボードの開発にとにかく役立つツール。
今回は ビルドのツールチェーン、ビルド設定、アップロードまですべて行ってもらいます。
これ一つあれば 世の中に転がってるWindowsラズパイ環境構築のめんどくささはなくなります。
公式は以下。
https://platformio.org/
VSCodeの拡張からインストールしてください。
PlatformIOプロジェクトの作成
PlatformIO のHome画面を開き、 New Projectします。
Project Wizard 画面で、Board欄に Raspberry Pi Pico を選択。 Pico Wでも同じで大丈夫です。
ここで重要なのが、 Use default location の確認です。
はてなマークにホバーすると、作成するプロジェクトのパスが書いてあるのですが、ここに日本語が含まれるとあとで問題が発生するので、日本語のパスは含めないようにしてください。
日本語パスが含まれていたら、Use default locationのチェックを外して、任意のフォルダを選択してください。
ここで生まれるプロジェクトの設定ファイル(platformio.ini)は以下です。第三者のリポジトリなどは使いませんよ!
[env:pico]
platform = raspberrypi
board = pico
framework = arduino
Hello worldを書く
プロジェクトフォルダ/src/main.cpp が生成されているので、ソースを開きます。
ソースコードの書き方は、 Arduino系の作法に従います。
#include "pico/stdlib.h"
や int main()
や stdio_init_all()
は不要です。
#include <Arduino.h>
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Hello world");
sleep_ms(1000);
}
Arduino系の作法に従って、 setup()
と loop()
を用意して、
シリアル出力(USB経由でシリアルモニターに文字を出力する)コードを書きました。
Raspberry Pi Pico のセットアップをする
ここで PlatformIO から Upload を押しても、私の場合はうまくいきませんでした。
COMの認識がうまくいっていないのが十中八九の原因です。
以下の方法を参考にして、Zadigで汎用WinUSBドライバーをインストールします。
どうしても初回だけは BOOTSELボタンを押しながら起動が必要です。
ビルド&アップロード
ソースコードをビルド&RaspberryPi に書き込みしていきます。
VSCode 右上のアップロードボタンを押してください。とってもわかりずらいです。
これでビルド&書き込み完了です。
動作の確認
PlatformIO内蔵のSerial Monitor を使っていきます。
VSCodeに別途インストールできる Serial Monitor 拡張や、 Teraterm、 ArduinIDEあたりでも確認できます。シリアルモニターならなんでもOK。
サンプルソースでは、モニタースピードを 115200
で実装しているので、シリアルモニターの設定も 115200に変更してください。
補足
platformio.ini の書き方
pico 用の書き方は以下。
ほかにもオプションはたくさんあります。
一般的なplatformio.ini の書き方は公式を見てください。
個人的によく使うのは build_flags
と monitor_speed
です。
build_flags
はデバッグフラグを立てたり、コンパイルオプション作ったり。
monitor_speed
は、PlatformIO に内包されている Serial Monitor のデフォルト値を変えてくれます。
書き込むファイルって何?どこ?
<プロジェクトフォルダ>\.pio\build\pico\firmware.elf.uf2
もしくは
<プロジェクトフォルダ>\.pio\build\pico\firmware.uf2
のどちらかが書き込まれてます。
どっちかは不明。
PlatformIO でアップロードエラーになる場合 その1 No accessible RP2040 devices in BOOTSEL mode were found.
アップロードのログで以下が出ている場合。
No accessible RP2040 devices in BOOTSEL mode were found.
ラズパイピコは、 白いボタン(BOOTSELボタン)を押しながら起動すると、プログラムの書き換えができるモードになります。
USBストレージ認識となり、xxxx.uf2ファイルをコピペやドラッグ&ドロップすることで書き込みできます。
今回はボタンを押しながら起動するめんどくささを省く環境なので、これが出ているということは環境構築がうまくいっていないです。
COM関係で失敗している可能性が高いです。汎用USBドライバはインストールしましたか?
PlatformIO でアップロードエラーになる場合 その2 rp2040load 1.0.1 - compiled with go1.15.8 のあとに [upload] Error 1 が出る
これはめちゃくちゃはまりました。
PlatformIOのCLIを使えるようにすると、詳細のログがわかります。
PlatformIOのCLI を使えるようにするのは、環境変数PATHにパスを通す必要があります。
パスは以下あたりにあります。たぶんどちらか。
- ユーザーディレクトリ.platformio\penv\Scripts
- C:.platformio\penv\Scripts
環境変数を設定したら、 VSCode を再起動してから、PlatformIOのターミナルを開きます。
以下のページを参考に、ターミナルで以下のコマンドを打つと、詳細の理由がわかります。
pio pkg exec -p tool-rp2040tools -c "picotool info"
私の場合は、パスに日本語が含まれていたため、PlatformIOの中でアップロードのために使用している picotool というツールのコマンドラインがうまくいってなさそうでした。
私のエラーログはこんな感じ。
IndexError: Traceback (most recent call last):
File "C:\.platformio\penv\Lib\site-packages\platformio\__main__.py", line 103, in
main
cli() # pylint: disable=no-value-for-parameter
^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1157, in __call__ return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\platformio\cli.py", line 85, in invoke return super().invoke(ctx)
^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\click\decorators.py", line 45, in new_func
return f(get_current_context().obj, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\.platformio\penv\Lib\site-packages\platformio\package\commands\exec.py",
line 57, in package_exec_cmd
if args[0].endswith(".py"):
~~~~^^^
IndexError: tuple index out of range
シリアルモニターにHello worldが出力されない
- 間違って BOOTSELボタンを押しながら起動してませんか?
-
-
Serial.print
ではなく、printf
を使ってませんか?(printfだとシリアルには出力されないです)
-
-
Serial.begin(115200);
はソースに書いてますか? - シリアルモニターのボーレート設定は 115200 になっていますか?
- ほかのCOMポートを選択していませんか?
アップロードがうまくいったときのPlatformIOのコンソール
参考にしてください。
Checking size .pio\build\pico\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [== ] 15.1% (used 40752 bytes from 270336 bytes)
Flash: [ ] 0.2% (used 4034 bytes from 2097152 bytes)
Configuring upload protocol...
AVAILABLE: cmsis-dap, jlink, picotool, raspberrypi-swd
CURRENT: upload_protocol = picotool
Looking for upload port...
Auto-detected: COM4
Forcing reset using 1200bps open/close on port COM4
Uploading .pio\build\pico\firmware.elf
rp2040load 1.0.1 - compiled with go1.15.8
..Loading into Flash: [ ] 0%
Loading into Flash: [= ] 5%
Loading into Flash: [=== ] 10%
Loading into Flash: [==== ] 16%
Loading into Flash: [====== ] 21%
Loading into Flash: [======== ] 27%
Loading into Flash: [========= ] 32%
Loading into Flash: [=========== ] 38%
Loading into Flash: [============ ] 43%
Loading into Flash: [============== ] 49%
Loading into Flash: [================ ] 54%
Loading into Flash: [================== ] 60%
Loading into Flash: [=================== ] 65%
Loading into Flash: [===================== ] 71%
Loading into Flash: [====================== ] 76%
Loading into Flash: [======================== ] 82%
Loading into Flash: [========================== ] 87%
Loading into Flash: [=========================== ] 93%
Loading into Flash: [============================= ] 98%
Loading into Flash: [==============================] 100%
まとめ
わざわざUSBケーブルの抜き差しや、ボタンを押しながら起動しなくても、Uploadボタンを押すだけでプログラムの書き換えができるようになりました。幸せ。