鳥なき里のマイコン屋(143) ラズパイPico、PlatformIOでArduino

Joseph Halfmoon

半年くらい前にはラズパイPicoに対応していなかった筈のPlatformIOが「Arduinoプラットフォーム」でPico対応をしていました。自分では何もしていないのですが、PC上でラズパイPicoのオブジェクトを生成できるようになってました。ボーっとして生きていても「自動で」世間の変化に追従できる?ありがたし。

※「鳥なき里のマイコン屋」投稿順Indexはこちら

普段から、VSCode+PlatformIOの組み合わせにはお世話になっております。手元のボード類でもPlatformIOが対応しているものは多いです。ボードとプラットフォームを指定すれば自動でビルドからデバッグまで環境を準備してくれるので重宝しています。

ラズパイPicoを始めた2021年春の時点で、当然の期待もあってPlatformIOがラズパイPicoに対応していないかチェックしたのですが、その時点では対応がありませんでした。そこで、公式のドキュメントを読み、母艦ラズパイ4上にPico SDKで開発環境を整備して本日に至っております。これはこれで良かったですが。

SDKでの開発は、パソコン上のVSCodeからラズパイ4にリモート接続し、ラズパイ4上のPico用のツールチェーンを使ってビルドしてSWDでデバッグという形です。当然ラズパイPicoは母艦であるラズパイ4にUSB+SWD+ときどきUART接続とべったりです。

ところがこの間、長い事サボっていたPlatformIOのボードやプラットフォームなどのバージョンUPをかけていて気づきました。Raspberry Pi Picoがボード・サポートになっているじゃん。現状、サポートされるプラットフォームはArduinoのみだけれども。関連するPlatformIOのドキュメント・ページは以下です。

PlatformIO >> Boards >> Raspberry Pi Pico

さっそく、PlatformIO利用にてラズパイPicoに対して、吉例の「Lチカ」を試みてみることにいたしました。PC上でビルドして書き込みするので、ラズパイ4に接続しっぱなしになっていたラズパイPicoを引き剥がしてPCにUSB接続しなおします。

プロジェクトの開始

PC上に既にVSCode+PlatformIOがインストールしてあるので、新たなラズパイPicoのプロジェクトを開始するのは簡単です。PlatformIOのHome(起動済であれば、ステータスバーの下の「おうち」アイコンクリックで開きます)を開き、新規プロジェクトを開始するProject Wizardを呼び出し、プロジェクト名、ターゲットボード、プラットフォームの3つを指定すれば後は良きに計らってくれます。このProject Wizard画面を先頭のアイキャッチ画像にかがげました。これだけでツールチェーンからライブラリなど必要なソフト一式自動インストールしてくれるのでとても楽です(初回はダウンロードに時間かかりますが。)

吉例のArduino式Lチカコードをビルドしているところが以下に。なお、ラズパイPicoのオンボードUSER LEDには25番ピンが接続しています、念のため。

vscode_pc000

母艦のラズパイ4のSWDからは引き剥がしてしまったので、ビルドしたおブジェクトコードは、PCに接続したUSB経由で書き込むしかありません。

BOOTSELボタンを押しながらUSB接続しなおすか、ボタン押しながらRUN端子(RESET端子。皆さん同様私もトグルスイッチとりつけてあります)にRESETをいれるかしてBOOTSELモードに突入。これでPCからストレージデバイスとして見えるようになります。ビルドディレクトリに生成されている .uf2 ファイルをそのドライブに転送すれば書き込みOK。ビルドディレクトリの様子が以下に

build000書き込めばプログラムがスタートします。Lチカしているところはこんな感じ。USER LEDは写真右上のBOOTSELボタンの右で黄緑色に光っているところ。
RPiPico_ArduinoBlink

シリアルポートにPrintできる確認

「普通の」Arduinoであると、USB接続のみでホストの仮想端末にむけて print が使えます。これがラズパイPicoのArduinoプラットフォームでもできることを確認しました。先ほどのLチカにシリアルに向けたprintを追加したコードがこちら。シリアルの速度はとりあえず9600とコンサバな設定。

#include <Arduino.h>

#define LED_PIN   (25)

int counter = 0;

void setup() {
  Serial.begin(9600);
  while(!Serial);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  Serial.println(counter++);
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

上記のコードに対応する、platformio.ini ファイルがこちら。

[env:pico]
platform = raspberrypi
board = pico
framework = arduino
monitor_port = com14
monitor_speed = 9600

なお、com14は、たまたま手元のPC上でそうだった、ということです。ホストによって番号異なります。デバイスマネージャーでご確認くだされ。なお、BOOTSELモードのままではUSBシリアルが見えてこないので、RESET信号を印加しなおすか、USBを一度抜いて再接続しなおしてデバイスマネジャーに仮想シリアルが現れるのを待つ必要ありかもしれません。

VSCodeの中でPlatformIOのシリアルモニタを呼び出せば、ちゃんと println したカウンタの内容が出力されてまいります。とりあえず Arduino伝統のprintfデバッグも出来るね(個人の意見です。)

なんだ、ラズパイPico、何気にArduinoできるんじゃん。知らなかったのはボーッと生きてた私だけ?

鳥なき里のマイコン屋(142) ラズパイPico、SDKでUart入出力 へ戻る

鳥なき里のマイコン屋(144) ラズパイPico、Arduino環境で外付けRTC接続 へ戻る