![](/img/trans.png)
[英]Single Ultrasonic Sensor for Raspberry pi 2B+ not functioning from Pi Terminal
[英]Ultrasonic Sensors with Raspberry pi 2b+ creates compilation error
我已经设置了3个HC-SR04超声波传感器,可以与树莓派一起连续运行。 其中两个传感器可以完美工作,而另一个则非常不一致。 我已经多次更换了电线,传感器和面包板,以及更换了与传感器关联的触发和回波引脚。 我已经调试了代码,并在下面的代码中隔离了问题传感器:
import RPi.GPIO as GPIO
import time
TRIG1 = 13
ECHO1 = 15
##TRIG2 = 22
##ECHO2 = 18
##
##TRIG3 = 37
##ECHO3 = 40
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(TRIG1, GPIO.OUT)
GPIO.output(TRIG1, 0)
##GPIO.setup(TRIG2, GPIO.OUT)
##GPIO.output(TRIG2, 0)
##
##GPIO.setup(TRIG3, GPIO.OUT)
##GPIO.output(TRIG3, 0)
GPIO.setup(ECHO1, GPIO.IN)
##GPIO.setup(ECHO2, GPIO.IN)
##GPIO.setup(ECHO3, GPIO.IN)
while True:
time.sleep(0.1)
GPIO.output(TRIG1, 1)
time.sleep(0.00001)
GPIO.output(TRIG1, 0)
print("anything")
while GPIO.input(ECHO1) == 0:
print("Works")
time.sleep(1)
start1 = time.time()
while GPIO.input(ECHO1) ==1:
stop1 = time.time()
print("sensor 1:")
print (stop1-start1) * 17000
## time.sleep(0.1)
##
## GPIO.output(TRIG2, 1)
## time.sleep(0.00001)
## GPIO.output(TRIG2, 0)
##
## while GPIO.input(ECHO2) == 0:
## start2 = time.time()
##
## while GPIO.input(ECHO2) == 1:
## stop2 = time.time()
## print("sensor 2:")
## print (stop2-start2) * 17000
##
## time.sleep(0.1)
##
## GPIO.output(TRIG3, 1)
## time.sleep(0.00001)
## GPIO.output(TRIG3, 0)
##
## while GPIO.input(ECHO3) == 0:
## start3 = time.time()
##
## while GPIO.input(ECHO3) == 1:
## stop3 = time.time()
## print("sensor 3:")
## print (stop3-start3) * 17000
GPIO.cleanup()
读取“ print(“ anything”)“的行允许编译代码,但不读取任何距离,并将继续打印“ Works”,指示其在第一个while循环中连续运行。 出乎意料的是,当删除“ print(“ anything”)“行时,错误:
print (stop1-start1) * 17000
NameError: name 'start1' is not defined
打印到终端。 当与当前未注释的代码隔离开时,上面注释的代码与运行中的传感器的代码相同,而不会出错。 任何想法或建议,将不胜感激。
谢谢。
我认为您遇到了时序问题,这会导致您的代码根据“小的”时序变化而不同地运行。
您的代码由于未初始化start1而失败。
如果您的代码延迟(打印“任何内容”)有很大延迟,则while循环将运行并初始化start1
如果没有延迟,
GPIO.input(ECHO1)
将不等于零,while循环将不会运行,并且您会收到错误消息。
我认为您应该初始化变量,并且应该检查是否存在您不了解的计时要求。
另外请注意,在树莓派上运行python并不是实时系统,因此请注意实时限制,并注意使代码对时间敏感。
我认为您有申报问题。 首先,您需要声明然后声明全局。 我更改了行号6,7,40和44。
import RPi.GPIO as GPIO
import time
TRIG1 = 13
ECHO1 = 15
start1=0.00
stop1=0.00
##TRIG2 = 22
##ECHO2 = 18
##
##TRIG3 = 37
##ECHO3 = 40
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(TRIG1, GPIO.OUT)
GPIO.output(TRIG1, 0)
##GPIO.setup(TRIG2, GPIO.OUT)
##GPIO.output(TRIG2, 0)
##
##GPIO.setup(TRIG3, GPIO.OUT)
##GPIO.output(TRIG3, 0)
GPIO.setup(ECHO1, GPIO.IN)
##GPIO.setup(ECHO2, GPIO.IN)
##GPIO.setup(ECHO3, GPIO.IN)
while True:
time.sleep(0.1)
GPIO.output(TRIG1, 1)
time.sleep(0.00001)
GPIO.output(TRIG1, 0)
print("anything")
while GPIO.input(ECHO1) == 0:
print("Works")
time.sleep(1)
global start1
start1 = time.time()
while GPIO.input(ECHO1) == 1:
global stop1
stop1 = time.time()
print("sensor 1:")
print (stop1 - start1) * 17000
## time.sleep(0.1)
##
## GPIO.output(TRIG2, 1)
## time.sleep(0.00001)
## GPIO.output(TRIG2, 0)
##
## while GPIO.input(ECHO2) == 0:
## start2 = time.time()
##
## while GPIO.input(ECHO2) == 1:
## stop2 = time.time()
## print("sensor 2:")
## print (stop2-start2) * 17000
##
## time.sleep(0.1)
##
## GPIO.output(TRIG3, 1)
## time.sleep(0.00001)
## GPIO.output(TRIG3, 0)
##
## while GPIO.input(ECHO3) == 0:
## start3 = time.time()
##
## while GPIO.input(ECHO3) == 1:
## stop3 = time.time()
## print("sensor 3:")
## print (stop3-start3) * 17000
GPIO.cleanup()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.