Мне нужна помощь со скриптом Python, который я пытаюсь адаптировать для конкретной потребности - PullRequest
1 голос
/ 27 июля 2011

Я новичок в Python, обычно использую Perl.

У меня есть Arduino, подключенный к некоторым сервоприводам, которые я использую для управления веб-камерой, рассматриваемый скрипт отлично работает, сервоприводы получают инструкции и делают то, что должны:

    #!/usr/bin/env python
    import serial

    usbport = '/dev/ttyACM0'

    # Set up serial baud rate
    ser = serial.Serial(usbport, 9600, timeout=1)


    def move(servo, angle):
        '''Moves the specified servo to the supplied angle.

        Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
         the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
       ser.write(chr(255))
       ser.write(chr(servo))
       ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180.\n"

В основном команда для приведенного выше сценария:

    python
    import servo
    servo.move(1, 180)

Я преобразовал сценарий для приема ввода из командной строки, однако программа, похоже, не работает. Может кто-нибудь выяснить, что я делаю не так, вот моя версия:

    #!/usr/bin/env python
    import serial
    import sys

    try:
            servo = int(sys.argv[1])
            angle = int(sys.argv[2])
    except IndexError:
            print ('a servo and angle are required')
    sys.exit(2)

    # Set up serial baud rate
    usbport = '/dev/ttyACM0'
    ser = serial.Serial(usbport, 9600, timeout=1)

    def move(servo, angle):
        '''Moves the specified servo to the supplied angle.

    Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
          the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
        ser.write(chr(255))
        ser.write(chr(servo))
        ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180. You typed:"
        print servo
        print angle
    move(servo, angle)

В основном команда для приведенного выше сценария:

    servo.py 1 180

Я знаю, что скрипт работает должным образом, как будто я говорю ему сделать 1 181, я получаю ошибку, что угол выходит за пределы диапазона, поэтому я полностью озадачен, почему информация не передается в сериал /arduino.

Большое спасибо за любую помощь и извините за длинную почту.

Gilbert

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Рядом с @ Боевой ответ , на этой части:

try:
        servo = int(sys.argv[1])
        angle = int(sys.argv[2])
except IndexError:
        print ('a servo and angle are required')
sys.exit(2)

# Set up serial baud rate

Вы должны также открыть sys.exit (2). Из-за этого программа завершает работу сразу после получения аргументов.

1 голос
/ 27 июля 2011

Похоже, что ваш отступ после определения функции неверен.Должно быть:

def move(servo, angle):
    '''Moves the specified servo to the supplied angle.

    Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
          the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
        ser.write(chr(255))
        ser.write(chr(servo))
        ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180. You typed:"
        print servo
        print angle

(обратите внимание, что блок if ... else имеет отступ)

0 голосов
/ 27 июля 2011

Ваш отступ в принципе неверен.

Смотрите этот фрагмент:

try:
        servo = int(sys.argv[1])
        angle = int(sys.argv[2])
except IndexError:
        print ('a servo and angle are required')
sys.exit(2)

Вызов sys.exit(2) всегда выполняется!Так что программа ничего не делает.

0 голосов
/ 27 июля 2011

Зачем адаптировать оригинальный скрипт? Просто используйте это:

import servo
servo.move(int(argv[1]), int(argv[2]))

Я не уверен, произошло ли это при вставке кода в stackoverflow, но отступы имеют недостатки во многих местах. Пожалуйста, проверьте это тоже:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...