Ардуино не может правильно выводить

Я новичок в python и средний в Arduino, и у меня возникла идея использовать их вместе для проекта. Я пытаюсь сделать машину Arduino + Python, которой я могу управлять с помощью своего компьютера. Я использовал Pyfirmata, и код кажется мне идеальным. Когда я запускаю код из CMD, у меня возникает странная ошибка/проблема. Я загрузил Standard Firmata в Arduino UNO. Я не получаю ошибок при загрузке или запуске, просто его вывод испорчен.

Вот код Python:

from pyfirmata import Arduino, util
import time

board = Arduino("COM3")

MotorLeft = board.get_pin('d:10:o') # Assigning output to PIN
MotorRight = board.get_pin('d:11:o') # Assisging output to PIN 

play = True

while play:
    control = input(
        print("Enter W, A or D to move forwards, left or right. Enter 0 to exit"))

    if control != 0:
        if control == "W" or "w":
            MotorRight.write(1)
            MotorLeft.write(1)
            time.sleep(1)
            MotorRight.write(0)
            MotorLeft.write(0)

        if control == "A" or "a":
            MotorLeft.write(1)
            time.sleep(1)
            MotorLeft.write(0)

        if control == "D" or "d":
            MotorRight.write(1)
            time.sleep(1)
            MotorRight.write(0)

        else:
            print("Invalid Commmand")

    else:
        print("Exited Succesfully")

    play = True

В настоящее время я не построил машину, я использую пару светодиодов, чтобы проверить работу двигателей и проверить код.

Вот ответ CMD:

Вот ссылка на выходное видео. Я ввел «W», что в идеале должно включать оба светодиода, однако оба они включаются, затем выключаются, а затем включаются и выключаются один за другим.

https://youtu.be/DjUkkpzF0so

, 👍2

Обсуждение

Можно ли увидеть, какой у вас код Arduino?, @smajli

@smajli, код Arduino - PyFirmata, @Juraj


1 ответ


Лучший ответ:

0

Я не могу это проверить, но, думаю, вам нужно изменить команды или, например:

if control == "W" or "w":

Изменить на

if ((control == 'W') or (control == 'w'))

И аналогично для других операторов if.

Также можно не проверять наличие элемента управления == 0, так как в противном случае это не будет символом.

Кроме того, в Python обычно используется конструкция elif (else if), поэтому вместо:

if control != 0:
    if control == "W" or "w":
        MotorRight.write(1)
        MotorLeft.write(1)
        time.sleep(1)
        MotorRight.write(0)
        MotorLeft.write(0)

    if control == "A" or "a":
        MotorLeft.write(1)
        time.sleep(1)
        MotorLeft.write(0)

    if control == "D" or "d":
        MotorRight.write(1)
        time.sleep(1)
        MotorRight.write(0)

    else:
        print("Invalid Commmand")

Вы можете написать:

if ((control == 'W') or (control == 'w')):
    MotorRight.write(1)
    MotorLeft.write(1)
    time.sleep(1)
    MotorRight.write(0)
    MotorLeft.write(0)

elif ((control == 'A') or (control == 'a')):
    MotorLeft.write(1)
    time.sleep(1)
    MotorLeft.write(0)

elif ((control == 'D') or (control == 'd')):
    MotorRight.write(1)
    time.sleep(1)
    MotorRight.write(0)

else:
    print("Invalid Commmand")

Кроме того, вы можете комбинировать или в списке (но я не могу это проверить, под рукой нет компилятора Python), например

if (control in ['W', 'w']):
,

Спасибо. попробую внести эти изменения, @SKAI

Спасибо! Этот проект работает сейчас! Вы знаете, что вызывает эту проблему? так что я могу избежать этой проблемы в будущем., @SKAI

Приятно слышать, что вы можете принять мой ответ, чтобы другие уведомили, что проблема решена., @Michel Keijzers

если control=='W' или 'w', так как 'w' не равно 0, это всегда будет верно, это то же самое, что написать if control=='W' или True, @Chad G