#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