Программа с форума # Движение робота по линии работает.
Упрощенная который я написал не работает.
Всё ясно. Значит с библиотекой ftTA2py.so всё нормально. Программа не работает т.к. в вашем исходном коде есть проблема с проверкой состояния кнопки вот в этой части:
if SW == 0:
MotorL.setSpeed(0)
MotorR.setSpeed(512)
# Движение по линии остановлено
else:
txt.stopAll()
time.sleep(0.02)
Команды, которые находятся после условного оператора else, будут выполняться всегда, когда кнопка нажата. Соответственно вызов txt.stopAll() будет выключать все выходы контроллера. Условный оператор if else надо использовать по другому. Ниже пример правильной программы. Сравните со своей. Рекомендую почитать про условные операторы в официальной документации.
import ftrobopy
import time
# Движение робота по линии
# Подключаемся к контроллеру TXT
# Чтобы программа работала на TXT автономно, конструктору класса ftrobopy должен быть передан параметр use_TransferAreaMode=True
txt = ftrobopy.ftrobopy(use_TransferAreaMode=True)
# Создаём переменные для каждого сигнала
I3 = txt.input(3) # Кнопка - вход TXT 03
MotorL = txt.motor(1) # Левый мотор - выход TXT 01
MotorR = txt.motor(2) # Правый мотор - выход TXT 02
while True:
SW = I3.state()
if SW == 1:
MotorL.setSpeed(512)
MotorR.setSpeed(0)
else:
MotorL.setSpeed(0)
MotorR.setSpeed(512)
time.sleep(0.02)
import ftrobopy
import time
# Движение робота по линии
# Подключаемся к контроллеру TXT
# Чтобы программа работала на TXT автономно, конструктору класса ftrobopy должен быть передан параметр use_TransferAreaMode=True
txt = ftrobopy.ftrobopy(use_TransferAreaMode=True)
# Создаём переменные для каждого сигнала
I3 = txt.input(3) # Кнопка - вход TXT 03
I4 = txt.input(4)
MotorL = txt.motor(1) # Левый мотор - выход TXT 01
MotorR = txt.motor(2) # Правый мотор - выход TXT 02
while True:
k1 = I3.state()
k2 = I4.state()
if k1 == 1:
MotorL.setSpeed(512)
else:
MotorL.setSpeed(0)
if k2 == 1:
MotorR.setSpeed(512)
else:
MotorR.setSpeed(0)
time.sleep(0.02)
Если вам надо управлять направлением вращения электродвигателя MotorL, то в вашем коде есть проблема - у вас два условных оператора if-else выполняются последовательно - это приводит к тому, что актуальным будет только последний выполненный блок кода из второго условного оператора if-else. Вам надо оформить проверку состояния k1 и k2 как логическую функцию и использовать другую конструкцию условного оператора - if-elif-else. Для начала составим таблицу истинности:
# Условие для комбинации 1
if k1==1 and k2==0:
MotorL.setSpeed(512)
# Условие для комбинации 2
elif k1==0 and k2==1:
MotorL.setSpeed(-512)
# Уловие для всех остальных комбинаций
else:
MotorL.setSpeed(0)
if k1==1 and k2==0:
MotorL.setSpeed(512)
elif k1==0 and k2==1:
MotorL.setSpeed(-512)
else:
MotorL.setSpeed(0)
if k3==1 and k4==0:
MotorR.setSpeed(512)
elif k3==0 and k4==1:
MotorR.setSpeed(-512)
else:
MotorR.setSpeed(0)
if k1==1 and k2==0:
MotorL.setSpeed(512)
elif k1==0 and k2==1:
MotorL.setSpeed(-512)
elif k3==1 and k4==0:
MotorR.setSpeed(512)
elif k3==0 and k4==1:
MotorR.setSpeed(-512)
else:
MotorL.setSpeed(0)
MotorR.setSpeed(0)
Отлично! Хочу обратить ваше внимание на то, что в приведенном вами коде проверка условий прервется сразу после первого истинного результата. Соответственно может получиться так, что будет выполнятся первая ветка условного оператора if-elif-else и до MotorR.setSpeed() дело не дойдет. С другой стороны я не знаю какую задачу вы решаете. Может быть вам нужно именно такое поведение.