クラス Signal -- 外部 I/O デバイスの制御と検知¶
Signal クラスは Pin
クラスを単純に拡張したものです。Pin の場合は 0 と 1 の「絶対」の状態のみですが、Signal は反転(負論理: active-low)しているかどうかにかかわらず、「アサート」(オン)または 「デアサート」(オフ)状態にできます。つまり、Pin の機能に論理反転サポートを追加しています。これは単純な追加に思えるかもしれませんが、それはまさに MicroPython の主な目標の1つである、さまざまなボード間で移植性のある方法で幅広いシンプルなデジタルデバイスをサポートするために必要なものです。正論理(active-high)または負論理(active-low)の LED のどちらか、通常開( normally open)または通常閉(normally close)のリレーのどちらを使っているかに関係なく、それぞれに対応した単一の見栄えの良いアプリケーションを開発し、ハードウェア構成の違いをアプリの設定ファイルのわずか数行で把握できます。
サンプルコード:
from machine import Pin, Signal
# # ピン0に正論理のLEDがあるものとする
led1_pin = Pin(0, Pin.OUT)
# ピン1に負論理のLEDがあるものとする
led2_pin = Pin(1, Pin.OUT)
# Pin クラスを使って両方とも点灯するには、
# それらを異なる値に設定する必要がある。
led1_pin.value(1)
led2_pin.value(0)
# Signal クラスは正論理/負論理の違いを抽象化できる
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)
# それらを点灯するのは同じようにできる
led1.value(1)
led2.value(1)
# さらに見栄えを良くできる:
led1.on()
led2.on()
Signal と Pin のどちらを使うかの指針は次のとおりです:
Signal の利用: LED、マルチセグメントディスプレイ、リレー、ブザーなどの単純なオン/オフ(ソフトウェアPWMを含む)でデバイス、または通常開または通常閉のボタン、リードスイッチ、湿気/火気検知器などなどの単純なバイナリセンサーを制御したい場合。要約すると、GPIO アクセスを必要とする実際の物理デバイス/センサーがある場合は、おそらく Signal を使うべきでしょう。
Pin の利用: より複雑な機器と通信するために、より高いレベルのプロトコルやバスを実装する場合。
Pin と Signal を分けたのは、上記のユースケースと MicroPython のアーキテクチャーが理由となっています。Pin は、オーバーヘッドが最も低いため、ビットバンギングプロトコルでは重要になります。Signal は Pin の上に追加の柔軟性を追加しますが、わずかなオーバーヘッドがあります(Python で正論理と負論理のデバイスの違いを手動で実装した場合よりははるかに小さいですが)。また、Pin はサポートボードごとに実装する必要がある低レベルのオブジェクトですが、Signal は Pin を実装してしまえば使える高レベルのオブジェクトです。
疑問がある場合は Signal を試してみてください! 繰り返しになりますが、負論理や正論理の信号のようなような望まない違いを処理する必要性から開発者を保護し、他のユーザーがアプリケーションを共有して楽しむことができるようにします。LED やリレーがわずかに異なる方法で配線されていて動かなかったというようなイライラが起きなくなるでしょう。
コンストラクタ¶
- class machine.Signal(pin_obj, invert=False)¶
- class machine.Signal(pin_arguments..., *, invert=False)
Signalオブジェクトを作成します。作成する方法は2つあります。
既存の Pin オブジェクトをラップして構築します - どのボードにも使えるユニバーサルな方法です。
必要な Pin パラメータを Signal コンストラクタに直接渡して構築します。中間の Pin オブジェクトを作成する必要がありません。多くのボードで使えますが、すべてのボードで使えるわけではありません。
引数は次のとおりです:
pin_obj
は既存の Pin オブジェクトです。pin_arguments
は Pin のコンストラクタに渡すものと同じ引数です。invert
- True の場合、信号が反転されます(負論理)。
メソッド¶
- Signal.value([x])¶
このメソッドは引数
x
を与えているかどうかにより、シグナルの値を設定または取得します。引数を省略した場合、この信号レベルを取得します。1 は信号がアサート状態(アクティブ)であり、0 は信号が非アクティブであることを意味します。
引数を与えた場合、このメソッドは信号レベルを設定します。引数
x
はブール型に変換できるものなら何でも構いません。変換後の値がTrue
であれば、信号はアクティブとなり、False
であれば非アクティブとなります。信号がアクティブであることとその下にあるピンの実際のロジックレベルとの対応は、信号が反転している(負論理)かどうかによって異なります。反転していない信号の場合、アクティブ状態は論理 1、非アクティブ状態は論理 0 に対応します。反転/負論理の信号の場合、アクティブ状態は論理 0、非アクティブ状態は論理 1 に対応します。
- Signal.on()¶
信号を有効にします。
- Signal.off()¶
信号を無効にします。