Повторяющийся процесс инициализации для широтно-импульсной модуляции на Raspberry Pi
В настоящее время я работаю над использованием широтно-импульсной модуляции с python на малиновом pi 3 b + для управления роботом c машина. Этот автомобиль, однако, требует некоторой калибровки, для которой я написал этот код. Цель этого кода - постоянно запрашивать ввод tl или tr, повернуть налево или повернуть направо и установить таймфрейм. Затем запускается функция, которая поворачивает робота вправо или влево.
Он работает с куском кода, Код 1, однако он будет запускаться только один раз и перемещать робота, а после этого он просто запросит входы, но не будет двигаться робот. С другой стороны, я написал фрагмент кода, Code 2, который, как я думал, решит мою проблему, однако на этот раз он просто не работает, заявив, что «one.ChangeDutyCycle (75) не определен».
Я считаю, что ошибка в том, что я прекращаю инициализацию ШИМ, однако я не знаю сложностей. Пожалуйста, помогите мне найти решение. Спасибо!
Код 1
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)
gpio.setwarnings(False)
gpio.cleanup()
def init():
gpio.setmode(gpio.BCM)
gpio.setup(4, gpio.OUT)
gpio.setup(17, gpio.OUT)
gpio.setup(27, gpio.OUT)
gpio.setup(22, gpio.OUT)
init()
one = gpio.PWM(4, 50)
two = gpio.PWM(17, 50)
three = gpio.PWM(27, 50)
four = gpio.PWM(22, 50)
one.start(0)
two.start(0)
three.start(0)
four.start(0)
def tl(tf):
init()
one.ChangeDutyCycle(75)
two.ChangeDutyCycle(0)
three.ChangeDutyCycle(75)
four.ChangeDutyCycle(0)
time.sleep(tf)
one.stop()
two.stop()
three.stop()
four.stop()
gpio.cleanup()
def tr(tf):
init()
one.ChangeDutyCycle(0)
two.ChangeDutyCycle(75)
three.ChangeDutyCycle(0)
four.ChangeDutyCycle(75)
time.sleep(tf)
one.stop()
two.stop()
three.stop()
four.stop()
gpio.cleanup()
while True:
a = input("tl or tr: ").lower()
b = input("time: ")
if a == "tl":
tl(float(b))
elif a == "tr":
tr(float(b))
elif a.startswith("q") == True:
break
else:
print("try again")
one.stop()
two.stop()
three.stop()
four.stop()
gpio.cleanup()
quit()
Код 2
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)
gpio.setwarnings(False)
gpio.cleanup()
def init():
gpio.setmode(gpio.BCM)
gpio.setup(4, gpio.OUT)
gpio.setup(17, gpio.OUT)
gpio.setup(27, gpio.OUT)
gpio.setup(22, gpio.OUT)
init()
def pwminit():
one = gpio.PWM(4, 50)
two = gpio.PWM(17, 50)
three = gpio.PWM(27, 50)
four = gpio.PWM(22, 50)
one.start(0)
two.start(0)
three.start(0)
four.start(0)
pwminit()
def tl(tf):
init()
pwminit()
one.ChangeDutyCycle(75)
two.ChangeDutyCycle(0)
three.ChangeDutyCycle(75)
four.ChangeDutyCycle(0)
time.sleep(tf)
one.stop()
two.stop()
three.stop()
four.stop()
gpio.cleanup()
def tr(tf):
init()
pwminit()
one.ChangeDutyCycle(0)
two.ChangeDutyCycle(75)
three.ChangeDutyCycle(0)
four.ChangeDutyCycle(75)
time.sleep(tf)
one.stop()
two.stop()
three.stop()
four.stop()
gpio.cleanup()
while True:
init()
pwminit()
a = input("tl or tr: ").lower()
b = input("time: ")
if a == "tl":
tl(float(b))
elif a == "tr":
tr(float(b))
elif a.startswith("q") == True:
break
else:
print("try again")
one.stop()
two.stop()
three.stop()
four.stop()
gpio.cleanup()