Raspberry pi 4 上的激光雷达和伺服

Lidar and Servo on Raspberry pi 4

我有两个独立的 Tf-mini(激光雷达)和伺服电机代码库。我希望这两个代码同时为 运行。我试图将它们组合成一个代码,但一次只有一个代码 运行s。请帮助重写或编辑代码。

此处伺服电机代码:

    import RPi.GPIO as GPIO
    import time
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(7, GPIO.OUT)
    p = GPIO.PWM(7, 100)
    t = 0.007
    r = 20 
    p.start(r)
    while True:
    for i in range(5,r):
            p.ChangeDutyCycle(i)
            print(i)
            time.sleep(t)
    for i in range(r,5,-1):
            p.ChangeDutyCycle(i)
            print(i)
            time.sleep(t)`

此处为激光雷达代码:

import time
import serial


ser = serial.Serial("/dev/ttyAMA0", 115200)
def read_data():
while True:
    counter = ser.in_waiting 
    if counter > 8:
        bytes_serial = ser.read(9)
        ser.reset_input_buffer()

        if bytes_serial[0] == 0x59 and bytes_serial[1] == 0x59: # this portion is for python3
            print("Printing python3 portion")            
            distance = bytes_serial[2] + bytes_serial[3]*256 # multiplied by 256, because the binary 
        data is shifted by 8 to the left (equivalent to "<< 8").                                              
        # Dist_L, could simply be added resulting in 16-bit data of Dist_Total.
            strength = bytes_serial[4] + bytes_serial[5]*256
            temperature = bytes_serial[6] + bytes_serial[7]*256
            temperature = (temperature/8) - 256
            print("Distance:"+ str(distance))
            print("Strength:" + str(strength))
            if temperature != 0:
                print("Temperature:" + str(temperature))
            ser.reset_input_buffer()

        if bytes_serial[0] == "Y" and bytes_serial[1] == "Y":
            distL = int(bytes_serial[2].encode("hex"), 16)
            distH = int(bytes_serial[3].encode("hex"), 16)
            stL = int(bytes_serial[4].encode("hex"), 16)
            stH = int(bytes_serial[5].encode("hex"), 16)
            distance = distL + distH*256
            strength = stL + stH*256
            tempL = int(bytes_serial[6].encode("hex"), 16)
            tempH = int(bytes_serial[7].encode("hex"), 16)
            temperature = tempL + tempH*256
            temperature = (temperature/8) - 256
            print("Printing python2 portion")
            print("Distance:"+ str(distance) + "\n")
            print("Strength:" + str(strength) + "\n")
            print("Temperature:" + str(temperature) + "\n")
            ser.reset_input_buffer()


            if __name__ == "__main__":
            try:
    if ser.isOpen() == False:
        ser.open()
    read_data()
except KeyboardInterrupt(): # ctrl + c in terminal.
    if ser != None:
        ser.close()
        print("program interrupted by the user")

请帮我把这两个代码同时合并到运行。

我想我明白了你的问题。两段代码都是顺序驱动的,因此会产生问题。这是你需要做的(伪代码):

loop forever:
     t1=start_time
     change duty cycle #remove the wait code
     poll the serial port #the ladar code
     t2=end_time
     if t2 - t1 < t:
        wait (t - (t2-t1))

作为我自己的老 Arduino 粉丝,我看到了处理伺服电机的困难。我有一个简单的库来为我完成大部分脏活。非常欢迎您通过以下两个链接中的任何一个使用我的图书馆: https://github.com/vikramdayal/RaspberryMotors or https://pypi.org/project/RaspberryMotors/#description