class Signal -- 外部 I/O デバイスの制御と検知

Signal クラスは Pin クラスの単純な拡張です。「絶対的」な 0 と 1 の状態しか取れない Pin とは異なり、Signal は反転(アクティブロー)されているかどうかに応じて「アサート」(オン)または「デアサート」(オフ)の状態を取れます。言い換えると、Pin の機能に論理反転のサポートを追加しています。これは単純な追加のように見えるかもしれませんが、さまざまなボード間でポータブルな方法で多種多様な単純なデジタルデバイスをサポートするためにまさに必要なものであり、これは MicroPython の主要な目標の 1 つです。さまざまなユーザーがアクティブハイまたはアクティブローの LED、ノーマルオープンまたはノーマルクローズのリレーのいずれを持っていても、それぞれで動作する単一の見栄えのよいアプリケーションを開発でき、ハードウェア構成の違いをアプリの設定ファイル内の数行で吸収できます。

例:

from machine import Pin, Signal

# Suppose you have an active-high LED on pin 0
led1_pin = Pin(0, Pin.OUT)
# ... and active-low LED on pin 1
led2_pin = Pin(1, Pin.OUT)

# Now to light up both of them using Pin class, you'll need to set
# them to different values
led1_pin.value(1)
led2_pin.value(0)

# Signal class allows to abstract away active-high/active-low
# difference
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)

# Now lighting up them looks the same
led1.value(1)
led2.value(1)

# Even better:
led1.on()
led2.on()

Signal と Pin のどちらを使用すべきかについてのガイドは次のとおりです:

  • Signal を使用する場合: LED、マルチセグメント表示器、リレー、ブザーのような単純なオン/オフ(ソフトウェア PWM を含む!)デバイスを制御したい場合、またはノーマルオープンやノーマルクローズのボタン(ハイまたはローにプルされたもの)、リードスイッチ、湿度/炎検出器などのような単純なバイナリセンサーを読み取りたい場合。まとめると、GPIO アクセスを必要とする実際の物理デバイス/センサーがある場合は、おそらく Signal を使用すべきです。

  • Pin を使用する場合: より複雑なデバイスと通信するための高水準プロトコルやバスを実装する場合。

Pin と Signal の分割は、上記のユースケースと MicroPython のアーキテクチャに由来します。Pin は最小のオーバーヘッドを提供し、これはプロトコルをビットバンギングする際に重要になる場合があります。一方、Signal は Pin の上にわずかなオーバーヘッド(アクティブハイ対アクティブローのデバイスの違いを Python で手動実装する場合よりはるかに小さい!)と引き換えに追加の柔軟性を加えます。また、Pin はサポート対象の各ボードごとに実装する必要がある低水準オブジェクトですが、Signal は Pin が実装されれば無償で手に入る高水準オブジェクトです。

迷ったら、Signal を試してみてください! 繰り返しになりますが、Signal はアクティブロー対アクティブハイ信号のような面白みのない違いを開発者が扱う必要から解放し、他のユーザーが、単に LED やリレーが少し異なる方法で配線されているだけで動作しないことに苛立つことなく、あなたのアプリケーションを共有して楽しめるようにするために提供されています。

コンストラクタ

class machine.Signal(pin_obj: Pin, *, invert: bool = False)
class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)

Signal オブジェクトを作成します。構築方法は 2 通りあります:

  • 既存の Pin オブジェクトをラップする -- 汎用的で、どのボードでも動作します。

  • Pin コンストラクタの引数を直接渡す -- Pin が受け付けるのと同じ位置引数およびキーワード引数が、内部的に作成される Pin に転送されます。多くのボードで利用できますが、すべてではありません。

引数:

  • pin_obj -- ラップする既存の Pin インスタンス。

  • pin_args / pin_kwargs -- 基盤となるピンをインラインで構築する際に Pin コンストラクタに転送する引数。

  • invert -- True の場合、信号は反転(アクティブロー)されます。

メソッド

value(x: Any = None, /) int | None

このメソッドは、引数 x が指定されるかどうかに応じて、信号の値を設定および取得できます。

引数が省略された場合、このメソッドは信号レベルを取得します。1 は信号がアサート(アクティブ)されていることを、0 は信号が非アクティブであることを意味します。

引数が指定された場合、このメソッドは信号レベルを設定します。引数 x はブール値に変換できるものなら何でもかまいません。True に変換される場合、信号はアクティブになり、そうでない場合は非アクティブになります。

信号がアクティブであることと、基盤となるピンの実際の論理レベルとの対応は、信号が反転(アクティブロー)されているかどうかに依存します。非反転信号の場合、アクティブ状態は論理 1 に、非アクティブは論理 0 に対応します。反転/アクティブロー信号の場合、アクティブ状態は論理 0 に、非アクティブは論理 1 に対応します。

on() None

信号をアクティブにします。

off() None

信号を非アクティブにします。