Программа на Питоне для мобильного робота

Обсуждаем модели и конструкции, построенные своими руками
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Программа на Питоне для мобильного робота

Сообщение Muaed »

Код: Выделить всё

$ ls
C-Program       Python          SoundFiles      run.sh
Cloud           ROBOPro         TxtControlMain
Data            Scratch         libs
$ cd Python
$ ls -al
total 304
drwxr-xr-x    5 ROBOPro  ROBOPro       1184 Jan  1 01:56 .
drwxr-xr-x   10 ROBOPro  ROBOPro       1048 Jan  1 01:15 ..
-rw-r--r--    1 ROBOPro  ROBOPro         50 Jan  1 01:16 .gitignore
drwxr-xr-x    2 ROBOPro  ROBOPro        368 Jan  1 01:19 Doc
-rw-r--r--    1 ROBOPro  ROBOPro         24 Jan  1 01:16 __init__.py
drwxr-xr-x    2 ROBOPro  ROBOPro        952 Jan  1 01:19 examples
-rw-r--r--    1 ROBOPro  ROBOPro       9624 Jan  1 01:16 ftTA2py.so
-rw-r--r--    1 ROBOPro  ROBOPro     143911 Jan  1 01:16 ftrobopy.py
-rw-r--r--    1 ROBOPro  ROBOPro     111082 Jan  1 01:23 ftrobopy.pyc
-rw-r--r--    1 ROBOPro  ROBOPro       1219 Jan  1 01:56 new1.py
-rw-r--r--    1 ROBOPro  ROBOPro       1608 Jan  1 01:31 p00.py
-rw-r--r--    1 ROBOPro  ROBOPro       1824 Jan  1 01:23 p000.py
-rw-r--r--    1 ROBOPro  ROBOPro       1608 Jan  1 01:39 p11.py
-rw-r--r--    1 ROBOPro  ROBOPro       1343 Jan  1 01:43 p111.py
-rw-r--r--    1 ROBOPro  ROBOPro        416 Jan  1 01:16 setup.py
drwxr-xr-x    2 ROBOPro  ROBOPro        376 Jan  1 01:20 src
-rw-r--r--    1 ROBOPro  ROBOPro        232 Jan  1 01:28 web-server.py
$
Программа с форума # Движение робота по линии работает.
Упрощенная который я написал не работает.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Программа на Питоне для мобильного робота

Сообщение Mr.Kubikus »

Muaed писал(а):
18 дек 2021, 16:12
Программа с форума # Движение робота по линии работает.
Упрощенная который я написал не работает.
Всё ясно. Значит с библиотекой 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)
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Программа на Питоне для мобильного робота

Сообщение Muaed »

Пробные программы proba4.py работает а rob.py не работает.
Программы набраны в кодировке UTF-8

proba4.py

Код: Выделить всё

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)

rob.py

Код: Выделить всё

import ftrobopy
import time

txt=ftrobopy.ftrobopy(use_TransferAreaMode=True)

I1=txt.input(1)
I2=txt.input(2)
MotorL=txt.motor(1)
MotorR=txt.motor(2)

while True:
    k1=I1.state()
    k2=I2.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)

Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Программа на Питоне для мобильного робота

Сообщение Mr.Kubikus »

Muaed писал(а):
20 дек 2021, 16:16
Пробные программы proba4.py работает а rob.py не работает.
В программе rob.py ошибка в строке 20 - отсутствует двоеточие после if k2==1. Должно быть так:

Код: Выделить всё

    if k2==1:
        MotorR.setSpeed(512)
    else:
        MotorR.setSpeed(0)
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Программа на Питоне для мобильного робота

Сообщение Muaed »

Как выбрать режим реверса двигателя?

Код: Выделить всё

if k1==1:
       MotorL.setSpeed(512)
    else:
       MotorL.setSpeed(0)

    if k2==1:
       MotorL.setSpeed(-512)
    else:
       MotorL.setSpeed(0)
   
при таком варианте работает только k2.
Без ветви k2(если убрать из программы) -> k1 работает.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Программа на Питоне для мобильного робота

Сообщение Mr.Kubikus »

Muaed писал(а):
21 дек 2021, 10:08
Как выбрать режим реверса двигателя?
Если вам надо управлять направлением вращения электродвигателя MotorL, то в вашем коде есть проблема - у вас два условных оператора if-else выполняются последовательно - это приводит к тому, что актуальным будет только последний выполненный блок кода из второго условного оператора if-else. Вам надо оформить проверку состояния k1 и k2 как логическую функцию и использовать другую конструкцию условного оператора - if-elif-else. Для начала составим таблицу истинности:

Код: Выделить всё

| # | k1 | k2 | MotorL |
|---|----|----|--------|
| 1 | 1  | 0  |  512   |
| 2 | 0  | 1  | -512   |
| 3 | 0  | 0  |  0     |
| 4 | 1  | 1  |  0     |
Теперь код:

Код: Выделить всё

# Условие для комбинации 1
if k1==1 and k2==0:
    MotorL.setSpeed(512)
# Условие для комбинации 2
elif k1==0 and k2==1:
    MotorL.setSpeed(-512)
# Уловие для всех остальных комбинаций
else:
    MotorL.setSpeed(0)
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Программа на Питоне для мобильного робота

Сообщение Muaed »

Код: Выделить всё

 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)
теперь работает только k1 и k3
Muaed
Сообщения: 27
Зарегистрирован: 19 окт 2021, 12:38

Re: Программа на Питоне для мобильного робота

Сообщение Muaed »

Спасибо теперь все в норме

Код: Выделить всё

 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)

Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 996
Зарегистрирован: 22 окт 2010, 23:57

Re: Программа на Питоне для мобильного робота

Сообщение Mr.Kubikus »

Muaed писал(а):
21 дек 2021, 14:51
Спасибо теперь все в норме
Отлично! Хочу обратить ваше внимание на то, что в приведенном вами коде проверка условий прервется сразу после первого истинного результата. Соответственно может получиться так, что будет выполнятся первая ветка условного оператора if-elif-else и до MotorR.setSpeed() дело не дойдет. С другой стороны я не знаю какую задачу вы решаете. Может быть вам нужно именно такое поведение.
С уважением, Григорий
GitHub FB ВК
Ответить