覆盆子pi GPIO上的怪异python bug:s

时间:2013-09-17 11:33:29

标签: python time raspberry-pi gpio

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

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

检查以下代码;当它运行时,它会迭代8个GPIO:s,一次设置一个高,并在每个之间休眠200ms。这样可行,但最后一个不会被激活。之后,它会休眠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只包含一个实体,则它不起作用。

1 个答案:

答案 0 :(得分: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()