改善Raspberry Pi RC机器人的控制

时间:2018-08-29 19:30:41

标签: python raspberry-pi robotics

我目前正在开发一个基本的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()

我遇到的问题是,我需要按Enter键来停止电动机并改变方向,而我希望设置它的方式是例如,当向上键为<按住并按住,电动机将向前移动,并且一旦松开键,电动机就会停止。

1 个答案:

答案 0 :(得分:0)

您的代码的问题在于,仅在按下按钮时才更改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:半延迟

此方法的优点是,与nodelay方法相比,它应降低处理器使用率。 缺点是释放密钥后会有延迟。因此,释放密钥后,机器人会在停止之前继续执行上一个命令一段时间(在我的示例代码中为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)