[英]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。 请让我们知道问题出在哪里
我阅读了您的程序段,发现它与中断无关。 标题中的“中断”一词可能使人们感到恐惧。
您的代码可以通过下面的两步伪代码来描述。
初始化GPIO引脚。
将引脚设置为高电平,延迟,将引脚设置为低电平。
您没有提到延迟时间。 如果您正在使用少于10ms的循环 ,或者您实际上在使用interrupt ,那么这可能会使事情变得复杂。
我建议您删除中断部分,并使任何循环都超过10ms,这是线圈的最大工作时间,如下所示。
我使用代码段进行了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 。
为了验证我的猜测,您可以执行以下操作。
从In1断开gpio。
将Gnd连接到In1,继电器激活,LED接通。
从In1断开Gnd,In1现在“浮动”,继电器停用,LED熄灭。
将5V0连接到In1,与上面的3.相同。
原因之一可能是您的gpio逻辑高信号(通常为2.4V〜2.9V)不够高。
In1可能需要3.0V +才能停用。
一种解决方法是提高GPIO信号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.