我目前正在从事一个基本的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()我遇到的问题是,它要求我按回车键来停止马达并改变方向,我希望设置它的方式是,例如,当向上键被按下并按住时,马达向前移动,而一旦释放出电机停止。
发布于 2018-09-19 21:54:41
代码的问题是,它只在按下按钮时才更改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模式。
方法1:无延迟
这种方法的优点是它几乎是瞬时的。一旦你放开钥匙,机器人就会停下来。缺点是,这可能会消耗大量的处理能力。由于它将非常快地执行循环,非常快地设置GPIOs,快速读取键等,因此它将执行许多周期,同时也不会完成很多实际工作。
screen = curses.initscr()
curses.noecho()
curses.nodelay(True)
screen.keypad(True)方法2:半延迟
与无延迟方法相比,该方法的优点是降低了处理器的使用率。缺点是在释放密钥后会出现延迟。因此,在您释放密钥之后,bot将在它停止之前继续执行前面的命令一段时间(在我的示例代码.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)https://stackoverflow.com/questions/52084828
复制相似问题