Raspberry Pi GPIO 模拟器

在笔记本或台式机上开发 Raspberry Pi GPIO 项目时,用一个小型模拟器替代 RPi.GPIO 会很有用。这样可以在把代码放到真实的 Pi 上运行之前,先测试导入路径、控制流程和输出逻辑。

方法一:使用简单的本地桩模块

在项目目录中创建一个名为 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 或事件检测,就需要扩展这个桩模块,或者使用功能更完整的模拟器。

方法二:使用 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