Лидар и сервопривод на Raspberry pi 4

#python #python-3.x #raspberry-pi #raspberry-pi4 #lidar

#python #python-3.x #raspberry-pi #raspberry-pi4 #лидар

Вопрос:

У меня есть две отдельные базы кода для Tf-mini (лидар) и серводвигателя. Я хочу, чтобы оба кода выполнялись одновременно. Я попытался объединить их в один код, но одновременно выполняется только один код. Пожалуйста, помогите переписать или отредактировать код.

Код для серводвигателя здесь:

     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")
  

Пожалуйста, помогите мне объединить эти два кода для одновременного запуска.

Комментарии:

1. вы можете запускать два файла Python одновременно, не изменяя свой код. Это может быть полезно: unix.stackexchange.com/questions/284510 /…

2. Я использую редактор thonny в raspbian os. Я не могу четко найти решение. Не могли бы вы уточнить?

Ответ №1:

Думаю, я понимаю вашу проблему. Оба сегмента кода управляются последовательно, и, следовательно, это создаст проблемы. Вот что вам нужно сделать (псевдокод):

 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 или https://pypi.org/project/RaspberryMotors/#description