Raspberry Pi和RPi.GPIO上的Python中断无法正常工作

时间:2015-10-19 20:44:01

标签: python raspberry-pi

我有一段用于控制中继的Python代码。我正在使用SunFounder 2 Channel 5V Relay Shield Module for Arduino

请参阅下面的代码部分,了解我们如何初始化相关GPIO以及如何在发生中断时激活它们。

    def initGPIO ():
         GPIO.setmode(GPIO.BOARD)   
         GPIO.setup(23, GPIO.OUT, initial=GPIO.LOW)

: : :

    def onLight(delay): 
        GPIO.output(23,True)
        time.sleep(delay)
        GPIO.output(23,False)

问题是,一旦onLight被调用,继电器始终处于ACTIVATE模式。尽管我试图在延迟后尝试在GPIO 23上输出0V。请告诉我们问题的位置

1 个答案:

答案 0 :(得分:0)

我读了你的程序段,发现它与中断无关。也许这就是"中断"在标题中吓跑了人们。

您的代码可以通过下面的2步伪代码来描述。

  1. init GPIO pin。

  2. 将引脚设置为高电平,延迟,将引脚设置为低电平。

  3. 你没有提到延迟时间。如果您使用循环时间小于10毫秒,或者您实际上正在使用中断,则可能会使事情变得复杂。

    我建议您移除中断部分,并使任何循环超过10ms,这是线圈的最大操作时间,如下所示。

    example coil data

    我使用代码段进行100ms循环和10ms循环时间。我发现线圈延迟约5ms。我想知道你的中断函数是否太快而不能错过它。

    100mS loop

    10mS loop, showing 5mS delay

    我正在使用HCT125将gpio引脚信号从3V3逻辑上移到5V0逻辑,因为我担心3v3信号不够强(可能导致电路不工作),如下所述。

    我编写了以下测试程序,无论是否使用HCT125都可以使用。

    # *** relay01.02 tlfong01 2018mayhkt1627 ***
    #!/usr/bin/python3
    # Description
    #   Function = loop turning relay on/off 
    #   Hardware = rpi3B
    #   Logical level 3V3 to 5V0 up shifter = HCT125
    #   Software = stretch 2018Apr, python3.6.4
    #   Relay = phtotcoupler 807C
    #   Coil = Songle SRD-05VDC-SL-C
    # Note: this program works with or without the up shifter HCT125
    
    import RPi.GPIO as GPIO
    from time import sleep
    
    # *** Config ***
    
    relayPin = 20
    
    # *** Setup cleanup ***
    
    def setGpioMode():
        GPIO.setwarnings(False) 
        GPIO.setmode(GPIO.BCM)
        return
    
    def cleanupGpio(): 
        GPIO.cleanup()
        return
    
    def setupDigiOutPin(digiOutPin):
        GPIO.setup(digiOutPin, GPIO.OUT)
        GPIO.output(digiOutPin, GPIO.LOW)    
        return
    
    # *** Set high/low/toggle digiOutPin ***
    
    def setDigiOutPinHigh(digiOutPin):  
        GPIO.output(digiOutPin, GPIO.HIGH)
        return
    
    def setDigiOutPinLow(digiOutPin): 
        GPIO.output(digiOutPin, GPIO.LOW)
        return
    def toggleDigiOutPin(digiOutPin, highSeconds, lowSeconds, toggleCount): 
        for i in range(toggleCount):
            setDigiOutPinHigh(digiOutPin)
            sleep(highSeconds)
            setDigiOutPinLow(digiOutPin)
            sleep(lowSeconds)
        return
    
    # *** Init/Cleanup/Test ***
    
    def init():
        setGpioMode()
        setupDigiOutPin(relayPin)
        return
    
    def cleanup():
        cleanupGpio()
        return
    
    def test():
        print('Begin turning on/off relay every 100mS')
        init()
        toggleDigiOutPin(digiOutPin = relayPin, highSeconds = 0.1, lowSeconds = 0.1, toggleCount = 10000)
        print('End of test')
        cleanup()
        return
    
    def main():
        test()
        return
    
    # *** Main ***
    
    if __name__ == '__main__':
        main()
    
    # *** End ***
    

    您的问题中提到的继电器,SunFounder 2通道DC 5V继电器模块带光电耦合器低电平触发器扩展板实际上是低电平激活

    要验证我的猜测,您可以执行以下操作。

    1. 从In1断开gpio。

    2. 将Gnd连接到In1,继电器激活,LED开启。

    3. 从In1断开Gnd,现在"浮动",继电器停用,LED关闭。

    4. 将5V0连接到In1,与上面的3.相同。

    5. 一个可能的原因是您的gpio逻辑高信号(通常为2.4V~2.9V)不够高。

      In1可能需要3.0V +才能停用。

      一个解决方法是加强GPIO信号。

      photocoupler driven relay

      relay test results

      enter image description here