Raspberry Pi GPIO エミュレーター

ノートパソコンやデスクトップで Raspberry Pi の GPIO プロジェクトを開発するときは、RPi.GPIO を小さなエミュレーターに置き換えると便利です。これにより、実際の Pi でコードを実行する前に、インポートパス、制御フロー、出力ロジックをテストできます。

方法 1: シンプルなローカルスタブを使う

プロジェクトディレクトリに testRPiGPIO.py という名前のファイルを作成し、テスト中は RPi.GPIO の代わりにそれをインポートします。

import testRPiGPIO as GPIO

最小限のスタブは次のようになります。

#!/usr/bin/python

BOARD = "board"
BCM = "bcm"
OUT = "out"
IN = "in"
HIGH = 1
LOW = 0


def setwarnings(mode):
    print(mode)


def output(pin, value):
    print(pin, ":", value)


def setmode(mode):
    print(mode)


def setup(pin, value):
    print(pin, ":", value)


def cleanup():
    print("clean-up")

# End

この方法は、setmode()setwarnings()setup()output()cleanup() だけを呼び出す非常に単純なスクリプトには十分です。入力ピンを読み取る、プルアップまたはプルダウン定数を使う、PWM やイベント検出に依存する、といったプログラムの場合は、スタブを拡張するか、より機能の多いエミュレーターを使ってください。

方法 2: GPIO エミュレーターパッケージを使う

Pi GPIO Emulator をダウンロードし、プロジェクトフォルダーに展開します。その後、次のようにインポートします。

from EmulatorGUI import GPIO

pip でシミュレーターをインストールしたい場合は、次を使います。

pip install GPIOSimulator

その後、プロジェクトでは次のようにインポートします。

from RPiSim.GPIO import GPIO

パッケージ名やインポートパスは時間とともに変わることがあるため、pip show GPIOSimulator でインストール済みパッケージをローカルで確認し、インポートに失敗する場合はパッケージのドキュメントを確認してください。

対応しているメソッドには次のものがあります。

  • GPIO.setmode()
  • GPIO.setwarnings()
  • GPIO.setup()
  • GPIO.input()
  • GPIO.output()

次の例ではエミュレーターのインポートを使用しています。実際の Raspberry Pi では、これを import RPi.GPIO as GPIO に置き換えてください。

from EmulatorGUI import GPIO
# import RPi.GPIO as GPIO
import time
import traceback


def Main():
    try:
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)

        GPIO.setup(4, GPIO.OUT)
        GPIO.setup(17, GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup(18, GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup(21, GPIO.OUT, initial=GPIO.LOW)
        GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.setup(26, GPIO.IN)

        while True:
            if GPIO.input(23) == False:
                GPIO.output(4, GPIO.HIGH)
                GPIO.output(17, GPIO.HIGH)
                time.sleep(1)

            if GPIO.input(15) == True:
                GPIO.output(18, GPIO.HIGH)
                GPIO.output(21, GPIO.HIGH)
                time.sleep(1)

            if GPIO.input(24) == True:
                GPIO.output(18, GPIO.LOW)
                GPIO.output(21, GPIO.LOW)
                time.sleep(1)

            if GPIO.input(26) == True:
                GPIO.output(4, GPIO.LOW)
                GPIO.output(17, GPIO.LOW)
                time.sleep(1)

    except Exception as ex:
        traceback.print_exc()
    finally:
        GPIO.cleanup()  # This ensures a clean exit.


Main()

実機でテストする場合は、Raspberry Pi 上で公式の GPIO ライブラリに戻します。

import RPi.GPIO as GPIO

まずエミュレーター版を実行して制御ロジックを確認し、その後 Pi 上でハードウェア版を実行して、ピン番号、配線、プルアップまたはプルダウンの挙動、電圧出力を検証してください。

Leave a Reply