FC2ブログ

記事一覧

RP2040のPIO - ArduinoでPIO

<前置き>
ここ数か月、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」をピックアップしました。
rp2040_pio_pwmexample.jpg

<手順>
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じわー」です。
rp2040_pio_pwmled.gif

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

<感想>
率直に言って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に書かれていることが分かり読み始めています。


コメント

コメントの投稿

非公開コメント

プロフィール

vabenecosi

Author:vabenecosi
ン十年間アキバに通い続けるオジサンです。自転車&バイク=二輪で旅するのも好きです。
本ブログはリンクフリーです。
本ブログの記事の内容を元にした製作等の行為は全て自己責任で行ってください。
またコメントを頂いてもスパム対策、あるいは管理者の判断により返信しない場合や削除する場合がありますが、ご了承ください。
旅関係の記事を書くこともあるでしょうが、専ら「アルバム」にて旅の写真のみを提供するつもりです。「アルバム」はPC画面では右下方に、スマホ画面では左上のメニューボタンの中にリンクがあります。

アルバム

FC2カウンター

FC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンター