我目前正在开发一个基本的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键来停止电动机并改变方向,而我希望设置它的方式是例如,当向上键为<按住并按住,电动机将向前移动,并且一旦松开键,电动机就会停止。
答案 0 :(得分:0)
您的代码的问题在于,仅在按下按钮时才更改GPIO。这是因为getch()
您想要的是
要获得所需的行为,即使没有按任何按钮,也需要getch()
返回一个值。有两种方法可以做到这一点
相似之处是当没有按下任何按钮时,两者都会返回 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 模式替换为我们正在使用的任何模式
此方法的优点是它几乎是瞬时的。一旦您放开钥匙,机器人就会停止。 缺点是,这可能会消耗大量处理能力。由于它将非常快速地执行循环,非常快速地设置GPIO,快速读取键等,因此它将执行很多周期而又没有完成很多实际工作
screen = curses.initscr()
curses.noecho()
curses.nodelay(True)
screen.keypad(True)
此方法的优点是,与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)