Raspberry PiのGPIOを操作する

echoコマンドで操作する

ターミナルのechoコマンドによる操作が可能なとき,それをBASICプログラムで代行することができます。
echo ○○ >□◆◇ を実行したいとき,
EXECUTE "/bin/bash" WITH ("-c", "echo ○○ >□◆◇")
のようにEXECUTE文で/bin/bashを呼び出してください。

C言語用共有ライブラリを使う

十進BASICでC言語用共有ライブラリを使うことができます。
基本的な仕様はDLLの関数を呼び出すを参照してください。
Linuxでは,共有ライブラリにはlibgpiod.soのように .so を末尾に持つファイル名が与えられています。“.DLL”の部分を“.so”に置き換えて読んでください。
WindowsのDLLにはstdcallとcdeclの別がありますが,Linuxでは無視(省略)してかまいません。

アドレス渡し(変数引数)

十進BASICの内部構造の都合上,DLLに変数引数として渡すことが可能な変数は,文字列変数に限定されます。
整数型変数を要求されるとき,文字列変数で代用します。
注.ASSIGN文における引数の扱いは,関数として定義しても副プログラムとして定義しても同じです。

CallBack関数の割り当て

共有ライブラリには,CallBack関数を要求するものがあります。
CallBack関数の使い方は,CallBack関数を参照してください。

GPIOを操作するプログラムの例

プログラム例は十進BASIC第3掲示版 Raspberry Pi GPIO を参照してください。
Raspberry PiのGPIOの仕様は,ハードウェアとOSのバージョンによって異なるようです。そのまま動作するとは限りません。
次の順に動作を確認しながら進めていくのが確実でしょう。
1. ターミナルからechoコマンドで操作する
2. echoコマンドをBASICから実行する
3. libgpiodの関数をBASICから利用する(ctxless系のHigh-lebel APIがあればそちらを優先して使う)
3'. libgpiodではなく,lgpioを使う。こちらのほうがコマンド体系が利用者本位かも。

libgpiod

Raspberry Pi OS (Bookworm)では,ターミナルで
sudo apt install libgpiod2 libgpiod-dev libgpiod-doc
を実行することでlibgpiodをインストールできます。
ctlxless系のマニュアルは,/usr/share/doc/libgpiod-dev/html/group__high__level.html にあります。
 (Webブラウザに上記アドレスをコピペしてください)
libgpiodの全体像は,/usr/share/doc/libgpiod-dev/html/modules.html で把握できます。

Raspberry Pi OS (Trixie)では,ターミナルで
sudo apt install libgpiod3 libgpiod-dev libgpiod-doc
を実行することでlibgpiodをインストールできます。
Bookwormのものから大きく変更されています。
全体のマニュアルは,/usr/share/doc/libgpiod-dev/html/topics.html にあります。
肝となる情報は /usr/share/doc/libgpiod-dev/html/gpiod_8h_source.html (gpiod.h) にあります。  GitHubにあるgpiod.hも同等です。
Github上で,マニュアルは https://libgpiod.readthedocs.io/en/latest/ にあります。そのうち,特に必要なのは libgpiod Core APIです。

Note.
関数値の扱い
結果型がvoidの関数は副プログラムに割り当ててください。
関数値がポインタの関数は,それをBASICの数値関数として定義しておくと,その値を,別の関数を呼び出すときに使えます。
ただし,char * が結果型であるとき,nullで終端された文字列であれば,BASICでも文字列として使えます。
引数の扱い
引数リストで, 型名 *引数名 の形が表示されている部分がアドレス渡しです。
別の関数で取得したポインタを渡すときは,数値型に設定してください。
新規の情報を渡したり,値を得たりするのが目的のときは,文字列型に設定します。
struct 型名 * となっている部分は,型の定義を調べて,それに対応するバイト数(以上)の文字列を充ててください。
constが前置された変数引数は,値を渡すために用いられるので,文字列式を充てることができます(変数でなくてよい)。
ただし,空文字列を充てるときは,chr$(0)としないと不具合が出ることがあります。

LGPIO

libgpiodに代わる選択肢としてlgpioがあります。lgpio C API
PWM, I2C, SPIにも対応しているので,libgpoidに限界を感じたら,こちらを試すとよさそうです。
インストールは PiMyLife Installing the LGPIO Library on the Raspberry Pi に従えば簡単。
十進BASICは,Ver. 0.9.4.1(以降)が必要です。 Ver. 0.9.4.0では,実行はできますが,終了後にフリーズするか,異常終了します。
BASICAccとParactBASICでの動作も確認しています。

Note.
arm64版十進BASICのASSIGN文で定義された関数の値は,64ビットレジスタの値を倍精度浮動小数点数に丸めたものです。
arm64では32ビット演算のとき64ビットレジスタの上位32ビットが0にセットされるので,int型の関数の値は,2^31より大きいとき2^32を引くことで得られます。


戻る