Двигайтесь вперед или назад на 4 мотора только при нажатии клавиши клавиатуры - PullRequest
2 голосов
/ 08 января 2020

Я пытаюсь создать машину-робот с 4 двигателями D C, и я пытаюсь управлять ею с P C с помощью S SH, я не могу найти что-нибудь, как я могу сделать робота двигаться вперед только тогда, когда нажата кнопка на клавиатуре,

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

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

import RPi.GPIO as GPIO
import curses
import keyboard


GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(31,GPIO.OUT)
GPIO.setup(33,GPIO.OUT)
GPIO.setup(35,GPIO.OUT)
GPIO.setup(37,GPIO.OUT)

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

try:
    while True:
        char = screen.getch()
        if char == ord('q'):
            break
        if keyboard.is_pressed('w'): #move forward all 4 motors(11,15,31,35)
            GPIO.output(11,True)
            GPIO.output(13,False)
            GPIO.output(15,True)
            GPIO.output(16,False)
            GPIO.output(31,True)
            GPIO.output(33,False)
            GPIO.output(35,True)
            GPIO.output(37,False)
            break

        elif char == ord('s') : #move backword all 4 motors(13,16,33,37)
            GPIO.output(11,False)
            GPIO.output(13,True)
            GPIO.output(15,False)
            GPIO.output(16,True)
            GPIO.output(31,False)
            GPIO.output(33,True)
            GPIO.output(35,False)
            GPIO.output(37,True)

        elif char == ord('a'): #move left(2 motors forward and 2 backward)
            GPIO.output(11,False)
            GPIO.output(13,True)
            GPIO.output(15,True)
            GPIO.output(16,False)
            GPIO.output(31,True)
            GPIO.output(33,False)
            GPIO.output(35,False)
            GPIO.output(37,True)

        elif char == ord('d'): # oposite from left to go right
            GPIO.output(11,True)
            GPIO.output(13,False)
            GPIO.output(15,False)
            GPIO.output(16,True)
            GPIO.output(31,False)
            GPIO.output(33,True)
            GPIO.output(35,True)
            GPIO.output(37,False)


        elif char == 10: # stop all the motors
            GPIO.output(11,False)
            GPIO.output(11,False)
            GPIO.output(15,False)
            GPIO.output(15,False)
            GPIO.output(31,False)
            GPIO.output(31,False)
            GPIO.output(35,False)
            GPIO.output(35,False)

finally:
    curses.nocbreak(); screen.keypad(0); curses.echo()
    curses.endwin()
    GPIO.cleanup()

1 Ответ

1 голос
/ 08 января 2020

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

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

import RPi.GPIO as GPIO
import curses
import keyboard
OUTPUTS = (11, 13, 15, 16, 31, 33, 35, 37) # Define the outputs you'll use as a "constant".

GPIO.setmode(GPIO.BOARD)
for output in OUTPUTS:
    GPIO.setup(output, GPIO.OUT) # A for loop replaces 8 copy-pasted lines.

def set_outputs_states(byte_string):
    for n, char in enumerate(byte_string): # Read e.g. "00001111" character by character.
        output = OUTPUTS[n]                # n-th character is linked to the n-th output.
        state = bool(char)                 # Change "0" or "1" into False or True.
        GPIO.output(output, state)         # Turn the selected output on or off.

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

try:
    while True:
        char = screen.getch()

        if char == ord('q'):
            break

        if keyboard.is_pressed('w'): #move forward all 4 motors(11,15,31,35)
            set_outputs_states("10101010") # Functions help reducing the size of your code.
            break

        elif char == ord('s') : #move backword all 4 motors(13,16,33,37)
            set_outputs_states("01010101")

        elif char == ord('a'): #move left(2 motors forward and 2 backward)
            set_outputs_states("01101001")

        elif char == ord('d'): # oposite from left to go right
            set_outputs_states("10010110")

        elif char == 10: # stop all the motors
            set_outputs_states("00000000")

finally:
    curses.nocbreak()
    screen.keypad(0)
    curses.echo()
    curses.endwin()
    GPIO.cleanup()
...