Python 带有覆盆子P和x130的多个超声波传感器;

Python 带有覆盆子P和x130的多个超声波传感器;,python,raspberry-pi,sensors,arduino-ultra-sonic,Python,Raspberry Pi,Sensors,Arduino Ultra Sonic,我对这里和编程都是新手。我有关于多个超声波传感器在树莓pi上使用的问题。我正在制造一辆自动驾驶汽车(有点像:)。我以前有一个传感器,只是在前面,我想在角落里再放两个,我正在尝试这两个传感器一起工作 我在编码方面有问题(我不能说我对python很了解,我是新手),我是如何处理cod的,但传感器工作不正常,测量错误,其中一个根本不工作 from picamera.array import PiRGBArray from picamera import PiCamera import numpy as

我对这里和编程都是新手。我有关于多个超声波传感器在树莓pi上使用的问题。我正在制造一辆自动驾驶汽车(有点像:)。我以前有一个传感器,只是在前面,我想在角落里再放两个,我正在尝试这两个传感器一起工作

我在编码方面有问题(我不能说我对python很了解,我是新手),我是如何处理cod的,但传感器工作不正常,测量错误,其中一个根本不工作

from picamera.array import PiRGBArray
from picamera import PiCamera
import numpy as np
import time
import cv2
import RPi.GPIO as GPIO
from time import sleep
def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)
    TRIG = 40
    ECHO = 38
    TRIG1 = 31
    ECHO1 = 29



    Motor1A = 16
    Motor1B = 18
    Motor1E = 22

    Motor2A = 13
    Motor2B = 11
    Motor2E = 15

    GPIO.setup(TRIG, GPIO.OUT)
    GPIO.setup(ECHO, GPIO.IN)
    GPIO.setup(TRIG1, GPIO.OUT)
    GPIO.setup(ECHO1, GPIO.IN)
    GPIO.setup(Motor1A, GPIO.OUT)
    GPIO.setup(Motor1B, GPIO.OUT)
    GPIO.setup(Motor1E, GPIO.OUT)

    GPIO.setup(Motor2A, GPIO.OUT)
    GPIO.setup(Motor2B, GPIO.OUT)
    GPIO.setup(Motor2E, GPIO.OUT)




    camera = PiCamera()
    camera.resolution =(640, 480)
    camera.framerate =32
    rawCapture=PiRGBArray(camera,size=(640,480))

    time.sleep(0.1)



    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):

        GPIO.output(TRIG, False)
        time.sleep(0.05)
        GPIO.output(TRIG1, False)
        time.sleep(0.05)

        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG1, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)
        GPIO.output(TRIG1, False)

        while GPIO.input(ECHO, ECHO1) == 1:
            pulse_start = time.time()

        while GPIO.input(ECHO, ECHO1) == 1:
            pulse_end = time.time()

        pulse_duration = pulse_end - pulse_start

        distance = pulse_duration * 17150

        distance = round(distance, 2)

        print("Mesafe:", distance - 0.5, "cm")

        if distance < 20:
            print ("Mesafe:", distance - 0.5, "cm Engel algilandi")
            GPIO.output(Motor1A, GPIO.LOW)
            GPIO.output(Motor1B, GPIO.HIGH)
            GPIO.output(Motor1E, GPIO.HIGH)

            GPIO.output(Motor2A, GPIO.HIGH)
            GPIO.output(Motor2B, GPIO.LOW)
            GPIO.output(Motor2E, GPIO.HIGH)



        else:
            print("Mesafe:", distance - 0.5, "cm")
            GPIO.output(Motor1A, GPIO.LOW)
            GPIO.output(Motor1B, GPIO.HIGH)
            GPIO.output(Motor1E, GPIO.HIGH)

            GPIO.output(Motor2A, GPIO.LOW)
            GPIO.output(Motor2B, GPIO.HIGH)
            GPIO.output(Motor2E, GPIO.HIGH)




        imgOriginal = frame.array

        imgHSV = cv2.cvtColor(imgOriginal, cv2.COLOR_BGR2HSV)
        imgThreshLow = cv2.inRange(imgHSV, np.array([0, 70, 50]), np.array([10, 255, 255]))
        imgThreshHigh = cv2.inRange(imgHSV, np.array([170, 70, 50]), np.array([180, 255, 255]))
        imgThresh = cv2.add(imgThreshLow, imgThreshHigh)
        imgThresh = cv2.GaussianBlur(imgThresh, (3, 3), 2)
        imgThresh = cv2.dilate(imgThresh, np.ones((5, 5), np.uint8))
        imgThresh = cv2.erode(imgThresh, np.ones((5, 5), np.uint8))
        intRows, intColums = imgThresh.shape
        circles = cv2.HoughCircles(imgThresh,cv2.cv.CV_HOUGH_GRADIENT,5,intRows/4)
        if circles is not None:

            print("kirmizi tabela algilandi.Dikkat !")


            for circle in circles[0]:
                x, y, radius = circle
                print("pozisyon x = " + str(x) + ", y = " + str(y) + ", radius = " + str(radius))
                cv2.circle(imgOriginal, (x, y), 3, (0, 255, 0), -1)
                cv2.circle(imgOriginal, (x, y), radius, (0, 0, 255), 3)
            #end for
        #end if

        else:
            print("yol serbest")


        cv2.imshow("Frame", imgOriginal)
        cv2.imshow("imgThresh",imgThresh)

        key = cv2.waitKey(1) & 0xFF

        rawCapture.truncate(0)

        if key == ord("q"):
            return


if __name__ == "__main__":
        main()
从picamera.array导入PiRGBArray
从picamera进口picamera
将numpy作为np导入
导入时间
进口cv2
将RPi.GPIO导入为GPIO
从时间上导入睡眠
def main():
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
TRIG=40
回声=38
TRIG1=31
ECHO1=29
电机1A=16
电机1B=18
电机1E=22
电机2A=13
电机2B=11
电机2e=15
GPIO.setup(触发,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.setup(TRIG1,GPIO.OUT)
GPIO.setup(ECHO1,GPIO.IN)
GPIO.setup(马达1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(电机1E、GPIO.OUT)
GPIO.setup(Motor2A,GPIO.OUT)
GPIO.setup(马达2B,GPIO.OUT)
GPIO.setup(电机2E、GPIO.OUT)
照相机=皮卡梅拉()
相机分辨率=(640480)
camera.framerate=32
rawCapture=PiRGBArray(摄像机,尺寸=(640480))
睡眠时间(0.1)
对于照相机中的帧。连续捕获(rawCapture,format=“bgr”,使用\u video\u port=True):
GPIO.output(触发,错误)
睡眠时间(0.05)
GPIO.output(TRIG1,False)
睡眠时间(0.05)
GPIO.output(触发,真)
睡眠时间(0.00001)
GPIO.output(TRIG1,True)
睡眠时间(0.00001)
GPIO.output(触发,错误)
GPIO.output(TRIG1,False)
而GPIO.input(ECHO,ECHO1)==1:
脉冲启动=时间。时间()
而GPIO.input(ECHO,ECHO1)==1:
脉冲结束=时间。时间()
脉冲持续时间=脉冲结束-脉冲开始
距离=脉冲持续时间*17150
距离=圆形(距离,2)
打印(“台面:”,距离-0.5,“厘米”)
如果距离小于20:
打印(“Mesafe:,距离-0.5,“厘米Engel algilandi”)
GPIO.输出(马达1A,GPIO.低)
GPIO.输出(马达1b,GPIO.高)
GPIO.输出(电机1E、GPIO.高)
GPIO.输出(马达2A,GPIO.高)
GPIO.输出(马达2B,GPIO.低)
GPIO.输出(电机2E,GPIO.高)
其他:
打印(“台面:”,距离-0.5,“厘米”)
GPIO.输出(马达1A,GPIO.低)
GPIO.输出(马达1b,GPIO.高)
GPIO.输出(电机1E、GPIO.高)
GPIO.输出(马达2A,GPIO.低)
GPIO.输出(马达2B,GPIO.高)
GPIO.输出(电机2E,GPIO.高)
imgOriginal=frame.array
imgHSV=cv2.CVT颜色(IMG原始,cv2.COLOR_BGR2HSV)
imgThreshLow=cv2.inRange(imgHSV,np.array([0,70,50]),np.array([10,255,255]))
imgThreshHigh=cv2.inRange(imgHSV,np.数组([170,70,50]),np.数组([180,255,255]))
imgThresh=cv2.add(imgThreshLow,imgThreshLow)
imgThresh=cv2.GaussianBlur(imgThresh,(3,3,2)
imgThresh=cv2.扩张
imgThresh=cv2.侵蚀(imgThresh,np.侵蚀((5,5,np.uint8))
intRows,intColums=imgThresh.shape
圆=cv2.HoughCircles(imgThresh,cv2.cv.cv_-HOUGH_梯度,5,intRows/4)
如果圆不是无:
印刷品(“kirmizi tabela algilandi.Dikkat!”)
对于圆中的圆[0]:
x、 y,半径=圆
打印(“pozisyon x=“+str(x)+”,y=“+str(y)+”,radius=“+str(radius))
cv2.圆(imgOriginal,(x,y),3,(0,255,0),-1)
cv2.圆(imgOriginal,(x,y),半径,(0,0,255),3)
#结束
#如果结束
其他:
打印(“yol serbest”)
cv2.imshow(“帧”,imgOriginal)
cv2.imshow(“imgThresh”,imgThresh)
key=cv2.waitKey(1)和0xFF
rawCapture.truncate(0)
如果键==ord(“q”):
返回
如果名称=“\uuuuu main\uuuuuuuu”:
main()

有些代码是关于pi摄像头的,不必管它们,但我可以说,当我只使用一个传感器时,代码工作正常。你能用一个传感器发布工作代码吗?此外,您是否检查了每个传感器是否单独使用工作代码工作?你不应该像现在这样组合超声波传感器的回波信号(每个传感器的回波时间不同,因此读取的距离也不同)。您应该单独测量每个传感器的距离,然后根据读取的所有距离做出最终决定。还有一件事,您还需要注意超声波传感器不会相互干扰。音速为340米/秒或大约34.300厘米/秒。因此,每1毫秒的误差将导致读数出现34.300厘米的误差。我不确定python上的计时精度,但最好减少由于来自不同超声波传感器的反射而产生错误的机会,因此理想情况下,您应该隔离它们,或者物理隔离,或者一次对一个进行采样。我检查了每个传感器的工作情况,并使用工作代码,但无法将它们组合起来。我明白你的意思,但我也想到了这个解决方案,但我不能像你说的那样包装一个代码。你能帮我吗?顺便说一句,我验证了传感器测量,有一些重要的代码,使它正确。我不确定隔离,我说我是非常新的和搜索现在。我会考虑的。