Linux ドライバーを使用した Python の Pi IoT

1/3 ページ

Linux の GPIO ドライバーは、以前は GPIO sysfs でしたが、現在は GPIO キャラクター ドライバーではありません。 最新の方法で GPIO 制御を行う方法をご覧ください。

このコンテンツは、新しく出版された本からのものです。

Python でのラズベリーパイ IoT Linux ドライバーを歌う

ハリー・フェアヘッド & マイク・ジェームス

アマゾンから購入。

コンテンツ

  1. IoT 向けの Pi の選択
  2. Python 入門
  3. ドライバー: 最初のプログラム
  4. GPIO キャラクタードライバー ***新着!!
  5. I/O コントロールを使用する GPIO
  6. GPIO イベント

  7. デバイスツリー
    抜粋: DHT22
  8. 一部の電子機器

  9. パルス幅変調
    抜粋:PWM
  10. SPI デバイス

  11. I2C の基礎
    抜粋: I2C
  12. I2C Linux ドライバー

  13. 高度な I2C

  14. センサードライバー

  15. ドライバーのさらなる進化

  16. 付録 I

GPIO キャラクタードライバー

IoT に関する限り、基本的な Linux ドライバーは GPIO ドライバーであり、個々の GPIO ラインへのアクセスを提供します。 これは別の組み込みドライバーで、前の章で紹介した LED ドライバーと似ていますが、キャラクター ドライバーであり、少し異なる方法で使用されます。

ほとんどの場合、デバイスが一連の GPIO ラインを介して接続されている場合、通常は特定のデバイス ドライバーを使用します。 このようにして、GPIO ラインとその実行内容をほとんど無視できます。 ただし、完全なドライバーが過剰になる単純な状況がまだあります。 ボタンまたは LED をインターフェースしたい場合は、Linux LED ドライバー (前の章を参照) や入力ドライバーさえある場合でも、GPIO ラインを直接制御するのが最も直接的な方法です。

最近まで、Linux で GPIO を操作する標準的な方法は、sysfs インターフェイスを使用することでした。 その使用を支持する多くの記事を目にし、それを利用する多くのプログラムに遭遇するでしょう。 ただし、GPIO sysfs は 2016 年末に Linux 4.8 で廃止され、2020 年にカーネルから削除される予定です。もちろん、Linux ディストリビューションが最新のカーネルを利用するには時間がかかります。 執筆時点で、Pi OS は 2 年前にリリースされた Linux 4.19 を使用しています。 それにもかかわらず、sysfs GPIO は間もなく削除され、レガシー ソフトウェアに対処するためにそれについて知る必要がありますが、新しいプロジェクトには使用しないでください。

その代替は GPIO キャラクター デバイスであり、これは表面的には古い sysfs インターフェイスのように見えますが、多くの大きな違いがあります。 これにはいくつかの利点がありますが、やや複雑であり、コマンド ラインからは使用できなくなりました。つまり、プログラムのみのインターフェイスです。 これは、かなり標準的で、コマンド ラインからの GPIO 制御を可能にする単純なユーティリティ プログラムがいくつかあるということです。 これらについては、章の最初の部分で説明しますが、新しいインターフェイスで作業する主な方法になる可能性は低いです。 libgpiod (リブまれ G一般的な P課す 入力/出力 GPIO ラインへの単純なアクセスには必要ありませんが、この章で説明します。

GPIO キャラクターデバイス

GPIO を操作するための新しいアプローチは、Pi OS の最新バージョンにプリインストールされていますが、以前のバージョンではサポートされていません。 /dev ディレクトリを見ると、インストールされている各 GPIO コントローラーに対応するファイルが見つかります。 少なくとも以下が表示されます。

/dev/gpiochip0

これは、メインの GPIO コントローラーと、それが提供するすべての GPIO ラインを表します。 sysfs がどのように機能するかを知っていれば、コンソールからファイルを読み書きする方法についての説明を期待しているかもしれません。 この場合、ほとんどの作業はコマンド ラインからは使用できない入出力制御システム コール ioctl() を使用して実行されるため、ファイルの読み取りと書き込みはほとんど役に立ちません。 ioctl の使用は典型的なキャラクター ドライバーですが、GPIO ドライバーの使用は、後述する他のファイル指向ドライバーとは大きく異なることを意味します。 次の章では、ioctl を使用して GPIO キャラクター デバイスを直接制御する方法について説明します。

コマンド ラインから GPIO を調べたい場合は、主に新しいデバイス インターフェイスの使用例として作成されたいくつかのツールをインストールする必要があります。 これを行うには、最初にそれらと、後で Python バインディングで使用する C libgpiod ライブラリをインストールする必要があります。

sudo apt-get install gpiod libgpiod-dev libgpiod-doc

ライブラリを使用してドライバーにアクセスしたくない場合は、インストールする必要はありません。GPIO ドライバーは Linux カーネルの一部として読み込まれ、すぐに使用できます。

ユーティリティ

インストールされるスタンドアロン アプリケーションは次のとおりです。

インストールされているすべての GPIO コントローラーを一覧表示します。

gpio1

指定された GPIO コントローラーによって提供されるすべての GPIO ラインを一覧表示します。

gpio2

デバイス ツリーを編集して、特定のライン名を付けることができます。 それらに適切な固定名を付ける場合は、次のようにします。

gpiofind 名前

GPIO ラインの番号を返します。

これを使用して、1 回の操作で任意の数の GPIO ラインを設定できます。 コマンドの形式は次のとおりです。

gpiset オプション チップ名/番号 =

<オフセット2>=<値2>
オプションは次のとおりです。
-l, –active-low は、回線のアクティブ状態を低に設定します
-m, –mode= 値を設定した後に何をすべきかをプログラムに指示します

exit: すぐに終了、デフォルト
wait: ユーザーが ENTER を押すのを待ちます
time: 指定された時間スリープする
シグナル: SIGINT または SIGTERM を待つ

-s, –sec=ドライ 待機する秒数
-u, –usec=USEC 待機するマイクロ秒数
-b, –background は制御端末から切り離します

ラインの状態の変化は、コマンドの実行中にのみ持続することに注意してください。 つまり、効果を確認するには、wait または time を使用する必要があります。 例えば:

gpioset -m wait 0 4=0 17=1

gpiochip 0 GPIO4 を 0 に、GPIO17 を 1 に設定し、ユーザーが Enter キーを押すまで待機します。

gpioget コマンドは、テキストとして指定された行の状態を返します。

gpioget chip name/number  

例えば:

gpioget 0 4 17

gpiochip0 の GPIO4 と GPIO17 の現在の状態を表示します。

gpiomon コマンドを使用すると、poll システム コールを使用して入力行の変更を監視できます。

gpiomon options chip name/number <offset 1> 

オプションは次のとおりです。

 -n, --num-events=NUM	exit after processing NUM events
 -s, --silent		don't print event info
 -r, --rising-edge	only process rising edge events
 -f, --falling-edge	only process falling edge events
 -F, --format= FMT	specify custom output format FMT
Format specifiers: %o: GPIO line offset %e: event type (0 - falling edge, 1 - rising edge) %s: seconds part of the event timestamp %n: nanoseconds part of the event timestamp

たとえば、GPIO4 と GPIO17 の変更を監視するには、次のようにします。

gpio3

これらのユーティリティは便利で、スクリプトで使用して GPIO ラインを制御できます。 たとえば、次のように保存するとします。

while true
do
 gpioset -m time -s 1 0 4=0 17=1
gpioset -m time -s 1 0 4=1 17=0
done

binky.sh というテキスト ファイルを作成し、その実行権限を所有者に設定すると、コンソールで実行し、GPIO4 と GPIO17 に接続された 1 組の LED を点滅させることができます。 GPIO ラインのいずれかが使用されている場合、スクリプトはエラー メッセージを返すことに注意してください。 また、GPIO ラインは gpioset コマンドの実行中にのみ使用されることにも注意する必要があります。つまり、ラインはコマンドの開始時に開かれ、終了すると閉じられるため、ラインは入力に戻ります。

シェル スクリプトと GPIO ユーティリティを使用すると長い道のりを歩むことができますが、遅かれ早かれ Python を使用したくなるでしょう。

.

Leave a Comment

Your email address will not be published. Required fields are marked *