繁体   English   中英

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

[英]Interrupts with Python on the Raspberry Pi and RPi.GPIO does not work properly

我有一段用来控制继电器的Python代码。 我正在将SunFounder 2通道5V继电器屏蔽模块用于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. 初始化GPIO引脚。

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

您没有提到延迟时间。 如果您正在使用少于10ms循环 ,或者您实际上在使用interrupt ,那么这可能会使事情变得复杂。

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

线圈数据示例


我使用代码段进行了100ms和10ms的循环时间。 我发现线圈有大约5ms的延迟。 我想知道您的中断功能是否太快而无法错过它。

100mS循环

10mS循环,显示5mS延迟

我正在使用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继电器模块实际上是Low Activate

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

  1. 从In1断开gpio。

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

  3. 从In1断开Gnd,In1现在“浮动”,继电器停用,LED熄灭。

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

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

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

一种解决方法是提高GPIO信号。

光耦驱动继电器

中继测试结果

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM