RP2040のPIO - ArduinoでPIO
- 2022/08/01
- 20:32
<前置き>
ここ数か月、RP2040のPIOについて調べていますが、今回はArduinoIDE下でPIOの動作を含んだ簡単なサンプルコードをRP2040に書き込んで動作させることができたという報告です。
さてPIOも含んだRP2040用のプログラム開発環境は現在のところ2つあると思います。
① MicroPython
② c/c++ sdk
MicroPythonでは早いタイミングでラッパーとしてPIOアセンブラを内包したため、PIOのコードをメインプログラムの中に記述することができ、開発作業を比較的容易に行うことができます。
一方、c/c++ sdkの方はCMakeを使って複数のソース・コードやライブラリを管理しながらPIOアセンブラ(pioasm)、GCCcompiler等を使ってuf2オブジェクトファイルを作ることになります。MicroPythonと比べると多少煩雑です。
そして私がよく利用しているArduino環境ではどうかと言うと、残念ながらまだ直接的、統合的な手段でPIOのプログラミングがサポートされていません。PIOアセンブラを使って別途PIOのアセンブラコードをコンパイルしておいて、その結果をメインプログラム(スケッチ)と組み合わせて利用するという手しかないのが現状のようです。
<きっかけ>
最近、ネット上のUsing the Raspberry Pi Pico SDKというページでRaspberry Pi Pico SDKがPIOアセンブラも含めてArduinoコアにすべて同梱されているという記述を見つけましたので、私のPCのHDDの中を確認してみたところ下記のフォルダにそれが見つかりました。加えてPIOアセンブラのバイナリ、pioasm.exeもサブフォルダ「tools」の中にありました(pioasmのソースのコンパイル不要!)。
Raspberry Pi Pico SDKがあるフォルダ:
C:\Users\ユーザ名\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\2.3.3\pico-sdk
そこでお試しとしてPIOを使うサンプルコードをコンパイルしてみることにしました。
使用したコードは、本家Raspberry PiのgitHubのpico-examples/pioにあったものです。どれも地味なものばかりで迷ったのですが、Raspberry Pi Pico本体だけで済ませられる「pwm」をピックアップしました。

<手順>
1. まず、上記のgitHubからソースファイルをPCにダウンロードしておきます。
・pwm.c ← c/c++ sdk用
・pwm.pio ← pioasm用
2. 次に、pwm.pioをPIOアセンブラを使ってアセンブルします。
・pwm.pioを適当なフォルダを作成してそこに入れます(ドキュメントフォルダがよいと思います)。
・同じフォルダにアセンブラ、pioasm.exeをコピーしておきます。
・コマンドプロンプトを開いて、上記のフォルダに移動します。
・pioasm.exe pwm.pio pwm.pio.hとタイプしてアセンブルを実行します。
・実にあっけなくオブジェクトファイルpwm.pio.hができます。
3. Arduino用スケッチを準備します。
・元のc/c++ sdk用メインプログラムのソースファイルです(比較参照用です)。
pwm.c(リネームしてください)
・ArduinoIDE用にポートしたものです。こちらを使います。
pwm.ino(リネームしてください)
ポートの際の留意点、主な変更点は以下の通りです。
①Raspberry Pi Pico SDKのコンテンツ由来でArduinoコアに組み込み済みと思われるライブラリ、関数はできるだけそのまま使いながら、お約束のsetup関数、loop関数がある形に整えました。
②Arduinoではデフォルトで標準出力関数printfが定義されていないので、Serial.printf関数に置き換えました。
③PIO関連の補助C関数で使われる変数はグローバル変数としてくくり出しました。
④理由は分かりませんがSerial.printf関数が起動後時間が経たないと動作しなかったので、300msの間スリープさせることにしました。
・このpwm.inoをArduinoのスケッチとして保存します。
4. Raspberry Pi Picoに書き込みます。
先の2.項で準備したpwm.pio.hをArduinoのスケッチ、pwm.inoと同じフォルダにコピーします。
Raspberry Pi PicoをPCにつないで、書き込みます(自己責任で行うこと!)。
<結果>
RasPicoのLEDに着目…「Lチカ」ならぬ「Lじわー」です。

Serial.printfも正しく動作しているようで、シリアルプロッタをみると鋸歯状の波形が規則的に繰り返し表示されます。

<感想>
率直に言ってPIOを使う意味が全くないプログラムではありましたが、ともかくArduinoIDEでPIOの動作を含むプログラムを作ることができました。私にとっては一歩前進です。
<今後の取り組み>
一応、PIOの構造や基本的な動作やPIOソースコードの冒頭部分に書かれるアセンブラ命令については理解したつもりですが、% c-sdk以降の部分やメインプログラムに書かれる補助C関数(pio_sm_、sm_comfig_、 pio_gpio_、…)の働きについては理解しきれていません。
頼りにしてきたインタフェース2021年8月号でも、分量が多いからか、これに関しては体系的な説明がありませんでしたが、Raspberry Pi Pico C/C++-SDKのpp.149-182に書かれていることが分かり読み始めています。
ここ数か月、RP2040のPIOについて調べていますが、今回はArduinoIDE下でPIOの動作を含んだ簡単なサンプルコードをRP2040に書き込んで動作させることができたという報告です。
さてPIOも含んだRP2040用のプログラム開発環境は現在のところ2つあると思います。
① MicroPython
② c/c++ sdk
MicroPythonでは早いタイミングでラッパーとしてPIOアセンブラを内包したため、PIOのコードをメインプログラムの中に記述することができ、開発作業を比較的容易に行うことができます。
一方、c/c++ sdkの方はCMakeを使って複数のソース・コードやライブラリを管理しながらPIOアセンブラ(pioasm)、GCCcompiler等を使ってuf2オブジェクトファイルを作ることになります。MicroPythonと比べると多少煩雑です。
そして私がよく利用しているArduino環境ではどうかと言うと、残念ながらまだ直接的、統合的な手段でPIOのプログラミングがサポートされていません。PIOアセンブラを使って別途PIOのアセンブラコードをコンパイルしておいて、その結果をメインプログラム(スケッチ)と組み合わせて利用するという手しかないのが現状のようです。
<きっかけ>
最近、ネット上のUsing the Raspberry Pi Pico SDKというページでRaspberry Pi Pico SDKがPIOアセンブラも含めてArduinoコアにすべて同梱されているという記述を見つけましたので、私のPCのHDDの中を確認してみたところ下記のフォルダにそれが見つかりました。加えてPIOアセンブラのバイナリ、pioasm.exeもサブフォルダ「tools」の中にありました(pioasmのソースのコンパイル不要!)。
Raspberry Pi Pico SDKがあるフォルダ:
C:\Users\ユーザ名\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\2.3.3\pico-sdk
そこでお試しとしてPIOを使うサンプルコードをコンパイルしてみることにしました。
使用したコードは、本家Raspberry PiのgitHubのpico-examples/pioにあったものです。どれも地味なものばかりで迷ったのですが、Raspberry Pi Pico本体だけで済ませられる「pwm」をピックアップしました。
<手順>
1. まず、上記のgitHubからソースファイルをPCにダウンロードしておきます。
・pwm.c ← c/c++ sdk用
・pwm.pio ← pioasm用
2. 次に、pwm.pioをPIOアセンブラを使ってアセンブルします。
・pwm.pioを適当なフォルダを作成してそこに入れます(ドキュメントフォルダがよいと思います)。
・同じフォルダにアセンブラ、pioasm.exeをコピーしておきます。
・コマンドプロンプトを開いて、上記のフォルダに移動します。
・pioasm.exe pwm.pio pwm.pio.hとタイプしてアセンブルを実行します。
・実にあっけなくオブジェクトファイルpwm.pio.hができます。
3. Arduino用スケッチを準備します。
・元のc/c++ sdk用メインプログラムのソースファイルです(比較参照用です)。
pwm.c(リネームしてください)
・ArduinoIDE用にポートしたものです。こちらを使います。
pwm.ino(リネームしてください)
ポートの際の留意点、主な変更点は以下の通りです。
①Raspberry Pi Pico SDKのコンテンツ由来でArduinoコアに組み込み済みと思われるライブラリ、関数はできるだけそのまま使いながら、お約束のsetup関数、loop関数がある形に整えました。
②Arduinoではデフォルトで標準出力関数printfが定義されていないので、Serial.printf関数に置き換えました。
③PIO関連の補助C関数で使われる変数はグローバル変数としてくくり出しました。
④理由は分かりませんがSerial.printf関数が起動後時間が経たないと動作しなかったので、300msの間スリープさせることにしました。
・このpwm.inoをArduinoのスケッチとして保存します。
4. Raspberry Pi Picoに書き込みます。
先の2.項で準備したpwm.pio.hをArduinoのスケッチ、pwm.inoと同じフォルダにコピーします。
Raspberry Pi PicoをPCにつないで、書き込みます(自己責任で行うこと!)。
<結果>
RasPicoのLEDに着目…「Lチカ」ならぬ「Lじわー」です。
Serial.printfも正しく動作しているようで、シリアルプロッタをみると鋸歯状の波形が規則的に繰り返し表示されます。
<感想>
率直に言ってPIOを使う意味が全くないプログラムではありましたが、ともかくArduinoIDEでPIOの動作を含むプログラムを作ることができました。私にとっては一歩前進です。
<今後の取り組み>
一応、PIOの構造や基本的な動作やPIOソースコードの冒頭部分に書かれるアセンブラ命令については理解したつもりですが、% c-sdk以降の部分やメインプログラムに書かれる補助C関数(pio_sm_、sm_comfig_、 pio_gpio_、…)の働きについては理解しきれていません。
頼りにしてきたインタフェース2021年8月号でも、分量が多いからか、これに関しては体系的な説明がありませんでしたが、Raspberry Pi Pico C/C++-SDKのpp.149-182に書かれていることが分かり読み始めています。