So-net無料ブログ作成
検索選択

Raspberry Pi用pigpio Library - その2 [Raspberry Pi]

昨日のpigpioライブラリの話の続き。昨日はコールバック、ソフトウェアPWM、第2SPIバスアクセス、bit bangについてざっと見た。今日は専用のバックグラウンドプロセスpigpiodの関連を概観する....

1.5  pigpiodデーモン

このライブラリの機能を他のプロセスやリモートで使えるようにしたデーモン(daemon)pigpiodである。pigpiod呼び出しのCベースのAPIが作られていて、pigpiod_if2という専用ライブラリをリンクすることで自分で書くことができる。プロセス間ではpipeを、リモートではsocketを経由してデーモンと通信できる。もちろん通信経路はプログラマには隠蔽されていて気にする必要はない。

また、RaspbianでGPIOをアクセスするためにはroot権限が必要だけど、pigpiodがその権限を引き受ける(pigpiodを起動するときにroot権限が必要)のでpigpiodと接続するプログラムはその必要がなくなる。Raspberry Piでそれがすごく便利、というわけではないけど、普通にpiユーザでログインしたときにいちいちsudoする必要はなくなる。

このデーモンは
  • リモートでpigpioを使う場合
  • pythonなどの言語ラッパからpigpioを使う場合
  • ローカルで複数のプロセスからpigpioを使う場合
などが想定されているようである(pigpioライブラリをリンクしたプログラムは一つのマシン上で一つしか起動できないのは他のライブラリと同じである)。

さらにクライアント側のpigpiod_if2ライブラリがコンパイルできない環境でも、
typedef struct
{
   uint32_t cmd;
   uint32_t p1;
   uint32_t p2;
   union
   {
      uint32_t p3;
      uint32_t ext_len;
      uint32_t res;
   };
} cmdCmd_t;
みたいな構造体にコマンドを詰めてsocketに流し込んでやれば使えるようにpigpiodが解釈できるコマンドがリストアップされていて、Linux以外のホストからでも使うことができる。

ちなみにOS X(macOS)では、クライアント側で必要なpigpiod_if2.cとcommand.cは幸いなことに32bitモードでは1箇所(clock_nanosleep関数。OS X(macOS)にはない)だけの修正でコンパイルできて、64bitモードではその修正とsize_tなどのワードサイズ(64bitモードではsize_tはunsigned long)の警告に対応する(簡単には無視する)だけでこちらもコンパイルできるので、pigpiodを制御するアプリ(もちろんsocket経由のネットワーク越し)は簡単に作ることができる。

まだあまりいろいろなことをやらせたわけではないが、OS Xからpigpiod_if2.hにある関数でRaspberry Pi上のpigpiodと通信できた。OS Xでの詳細は別途もう少し中身に突っ込んでからまとめることにする。

1.6  pigsコマンド

また、コマンドラインからpigpoidと通信できるpigsというのがあって、これを使って簡単にハードウェアのテストなんかがひょいひょいとできるし、シェルスクリプトだけでGPIOにアクセスできることになる。

本家サイトのページには、pigsコマンドは/devの名前付きパイプ(次節述)をアクセスするように書いてあるけど、ソースを見ればsocketを読み書きするようになっているので、リモートでも動く。だたしリモート接続のためには環境変数「PI_ENVADDR」にpigpiodが動いているホストのアドレス、「PI_ENVPORT」にポート番号を定義する必要がある。環境変数がないとアドレスは127.0.0.1(ローカル)に、ポート番号はpigpiodのデフォルトである8888に設定される。

ちなみに、このpigsもOS Xでコンパイルできて(いくつかの型変換の警告が出る)、実行できた。リモートでログインする手間の違いくらいでそれがすごく便利、というわけではないけど。

こういうのもunixを使い倒してる人ならではの発想だと思う。面白い。

ところでデフォルトのポート番号の8888は覚えやすいせいか、勝手にいろいろに使われている。重要なプロトコルと衝突することはなさそうだけど、気が付かないうちに他にも使われていそうなので、もう少し空いた番号を選んだほうがいいかもしれない。pigpiodにとっては本来エフェメラルポートの領域でも問題ないわけだし。

1.7  pigpiodのデバイスファイル

pigpiodを走らせるとデバイスファイルが3つできる。それぞれ
 
デバイスファイルのパス 役割
/dev/pigpio stdin
/dev/pigout stdout
/dev/pigerror stderr
 
となっている(/devの下にあるのでデバイスファイルに見えるけど、実態は名前付きパイプ - named pipe - である。pigpiodはmmapコールを使うのでルート権限でないと実行できない。そしてルート権限があれば/dev以下にでも名前付きパイプを作ることができる)。例えば/dev/pigpioに書き込んでもpigpiodへのコマンドと解釈されるようになっている。つまりローカルのpigsコマンドとまったく同じ動作をする。具体的にはechoなんかで/dev/pigpioにリダイレクトしてやればいい。したがって、シェルスクリプトやCでデバイスファイルに書き込むようなのを書いても、pigsコマンドやpigpiod_if2ライブラリを使ったのとまったく同じことができる。

もちろんデバイスファイル(名前付きパイプ)を参照するのでリモートでは使えないし、ソフトウェア技術的にはselectを呼ぶだけでできるのでたいしたものではないし、それほど便利でもないけど、なんとなく楽しい機能である。

1.8  スクリプト

pigpiodデーモンへのコマンドは当然通信が伴う。たくさんのコマンドをpigpiodに発行しようとすると通信がボトルネックになる。そこで一連のコマンドを「script」という形でpigpiodに渡してやって、その後そのスクリプトを実行させるということができるようになっている。スクリプト実行時にはコマンド送出の通信は発生しない。

スクリプトは非常に簡単なプログラミング言語になっていて、変数が使えて条件判断やラベルジャンプができるようになっている。ここまでやるか、とも思えるけど、Cで直接ライブラリを呼ぶように書けない人が高速な処理をしたいときには役に立つ。おそらくはpythonでの実行効率の向上が目的だったんだろう。

とはいうものの、このスクリプトが書ける人なら、Cも書けるだろうし、その方が手っ取り早い、という気もしないではない。pythonが律速したけどどうしてもpythonで完結したい、Cは使いたくない、という人用である。

1.9  piscope

pigpioのコールバック呼び出しの機能を使って、ロジックアナライザみたいな波形表示するアプリを作ったのがpiscopeである。gtkを使ったGUIを持って、ロジアナの表示がウィンドウにリアルタイムで出るようになっている。時間分解能やチャンネル数、トリガ条件なんかはハードウェアのロジアナに比べればずっと劣るけど、GPIOの0〜31ピン全部を使えば最大32チャンネルのロジアナのタイミング表示が手に入る。

ちなみにこれ
1016piscopewindow.png
は、piscopeをRaspberry Piで走らせて、OS XのXQuartz上に表示させたもの(接続のやり方なんかはこちらを参照していただきたい)で、
1016connections.jpg
みたいにして自分自身に戻して、pigsコマンドでPWMを発生させて、それをpiscopeで読んだものである。

大げさなロジアナを使うほどではないような簡単な回路のデバグには、こんなおもちゃのようなものでも役に立つ場面は十分ある。簡単でなかなか面白い。

1.10  トレードオフ

bcm2835など他のライブラリと実装の方針が全然違うので、面白い機能の一方でトレードオフもある。

pigpioを初期化すると少なくともひとつスレッドが起きて、pigpioを閉じるまでそのスレッドはずっと動き続ける。まだ定量的に比較していないのでなんとも言えないところもあるけど、pigpioを頻繁に呼び出すような、例えばさっきのpiscopeでは信号変化が頻繁だと専用スレッドが重くなるはずである。

Raspberry Piではあまりあり得ないけど、たくさんのプロセスが生きて動いているような環境では、pigpioが全体の足を引っ張るようなことも起こり得る。また後で負荷も調べてみる。

また、コールバックは便利だけど、それなりにレイテンシがあって、割り込みに比べるとかなり遅い。そのレイテンシもCPUコアの空き具合なんかにも依存することが考えられて、タイミングのクリティカルなところではもちろん使えない。

まあでも、そういうアプリケーションでは例えばbcm2835や他のものを使ったりすればいいだけの話である。

1.11  他言語ラッパ

pythonのラッパが開発者本人の手によって作られている。実は単純なラッパではなくて、pigpiodと通信するモジュールになっているので、pythonが動くプラットフォームならLinuxだけでなくWindowsやOS X(macOS)などどこでも使うことができる。

また、開発者以外によるjavaラッパや、Node.jsラッパが公開されている。特にNode.jsラッパはパソコンやスマホのブラウザからRaspberry PiのGPIOをアクセスするHTTP+javascriptのコードが簡単に書けるということになるので、ドキュメントが整備されることを期待したい。

次回から、Cから呼び出せる機能を順に取り上げていこうと思う....
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。
メッセージを送る