4

我正在 Raspberry Pi 上使用 Python 进行一些测试。硬件是一系列连接到达林顿阵列 (ULN2803) 的 SPDT 继电器,该阵列连接到树莓派 B 的 GPIO。

如果我将 GPIO 引脚设置为高电平,则相应的继电器会拉动。如果我将其设置为低,它会释放。我可以使用循环将所有 GPIO:s 设置为高电平,并且所有继电器都拉动,除了最后一个(?)。但是,如果我run time.sleep()在循环将所有引脚设置为高电平后,它们都会自动设置为低电平。

检查下面的代码;当它运行时,它会遍历 8 个 GPIO:s,一次设置一个高电平,并在每个 GPIO 之间休眠 200 毫秒。这有效,但最后一个没有被激活。之后,它会休眠 1 秒,这会导致所有引脚变为低电平。然后它开始再次遍历它们,向后,关闭它们。一旦它向后开始,在第一次迭代中,一切都会再次变高。这是为什么?它不会发生在一个循环中,只是在它们之间。就像当 sleep() 在循环外运行时,一切都恢复到程序启动之前的状态。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
iopins = [4,7,8,9,10,11,17,18]

try:
    for x in iopins:
        GPIO.setup(x, GPIO.OUT)
        GPIO.output(x,0)

    while True:
        for x in iopins: #turn on.
            time.sleep(0.2)
            GPIO.output(x, GPIO.HIGH)

        time.sleep(1) #<-- causes all GPIOs to pull low...

        for y in reversed(iopins): #Turning off.
            GPIO.output(y, GPIO.LOW) #<--here all GPIOs pulls high upon first iteration
            time.sleep(0.2)

finally:
    GPIO.cleanup()

另一个奇怪的事情是,如果数组 IOPINS 只包含一个实体,它就不起作用。

4

1 回答 1

0

如果您删除time.sleep(1)最后一个继电器不起作用,因为它会在之后立即激活和停用。您可以在最后一个 for 循环中交换顺序:

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
iopins = [4,7,8,9,10,11,17,18]

try:
    for x in iopins:
        GPIO.setup(x, GPIO.OUT)
        GPIO.output(x,0)

    while True:
        for x in iopins: #turn on.
            time.sleep(0.2)
            GPIO.output(x, GPIO.HIGH)

        for y in reversed(iopins): #Turning off.
            time.sleep(0.2)
            GPIO.output(y, GPIO.LOW)                

finally:
    GPIO.cleanup()
于 2013-09-17T12:32:28.367 回答