Улучшение управления роботом Raspberry Pi RC - PullRequest
0 голосов
/ 29 августа 2018

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

Это мой текущий код:

import RPi.GPIO as GPIO
import curses

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)

screen = curses.initscr()
curses.noecho()
curses.cbreak()
screen.keypad(True)

try:
    while True:
        char = screen.getch()
        if char == curses.KEY_UP:
            GPIO.output(11,True)
            GPIO.output(13,True)
        elif char == ord('s'): 
            GPIO.output(7,False)
            GPIO.output(11,False)
            GPIO.output(13,False)
            GPIO.output(15,False)
            break
        elif char == curses.KEY_DOWN:
            GPIO.output(7,True)
            GPIO.output(15,True)
        elif char == curses.KEY_RIGHT:
            GPIO.output(7,True)
            GPIO.output(13,True)
        elif char == curses.KEY_LEFT:
            GPIO.output(11,True)
            GPIO.output(15,True)
        elif char == 10:
            GPIO.output(7,False)
            GPIO.output(11,False)
            GPIO.output(13,False)
            GPIO.output(15,False)
finally:
    curses.nocbreak()
    screen.keypad(False)
    curses.echo()
    curses.endwin()
    GPIO.cleanup()

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

1 Ответ

0 голосов
/ 20 сентября 2018

Проблема с вашим кодом заключается в том, что он изменяет GPIO только при нажатии кнопки. Это потому, что getch() То, что вы хотите, это

Чтобы получить желаемое поведение, необходимо, чтобы getch() возвращало значение, даже если ни одна кнопка не нажата. Есть два способа сделать это

  1. nodelay : это заставляет getch () немедленно возвращаться независимо от того, нажата ли клавиша или нет, если она не нажата, она вернет curses.ERR
  2. halfdelay : это заставляет getch () ждать до установленного промежутка времени, если в этот период времени не нажимается ни одна клавиша, возвращается curses.ERR

Сходство заключается в том, что оба возвращают curses.ERR , когда ни одна кнопка не нажата, поэтому вам нужно добавить этот регистр в оператор if

#this will shut off the GPIO when nothing is pushed
elif char == curses.ERR:
    GPIO.output(7,False)
    GPIO.output(11,False)
    GPIO.output(13,False)
    GPIO.output(15,False)

Но этот код не будет работать, пока вы не выполните настройку. Замените режим cbreak на режим, который мы используем

Метод 1: нодлеев

Преимущество этого метода в том, что он почти мгновенный. Как только вы отпустите кнопку, бот должен остановиться. Недостаток, это может потреблять много вычислительной мощности. Поскольку он будет выполнять цикл очень быстро, очень быстро устанавливать GPIO, быстро читать ключи и т. Д., Он будет выполнять много циклов, не выполняя при этом большой работы

screen = curses.initscr()
curses.noecho()
curses.nodelay(True)
screen.keypad(True)

Метод 2: полудержка

Преимущество этого метода в том, что он должен снизить нагрузку на процессор по сравнению с методом нодлаев. Недостатком является задержка после отпускания ключа. Поэтому после того, как вы отпустите клавишу, бот продолжит выполнение предыдущей команды в течение некоторого времени (в моем примере кода 0,7 секунды), прежде чем он остановится

#the delay units are tenths of seconds, or deciseconds
#this is a .7 second delay 7*0.10sec = 0.7 seconds
delay_in_deciseconds = 7 

screen = curses.initscr()
curses.noecho()
curses.halfdelay(delay_in_deciseconds)
screen.keypad(True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...