首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >树莓Pi RC机器人控制的改进

树莓Pi RC机器人控制的改进
EN

Stack Overflow用户
提问于 2018-08-29 19:30:41
回答 1查看 165关注 0票数 0

我目前正在从事一个基本的Raspberry pi项目,我需要帮助改进它的控制。

这是我目前的代码:

代码语言:javascript
复制
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()

我遇到的问题是,它要求我按回车键来停止马达并改变方向,我希望设置它的方式是,例如,当向上键被按下并按住时,马达向前移动,而一旦释放出电机停止。

EN

回答 1

Stack Overflow用户

发布于 2018-09-19 21:54:41

代码的问题是,它只在按下按钮时才更改GPIO。这是因为getch()你想要的是

为了得到您想要的行为,您需要让getch()返回一个值,即使没有按下按钮。有两种方法可以做到这一点

  1. nodelay:这将使getch()立即返回,无论是否按下键,如果没有按下键,它将返回curses.ERR
  2. 半延迟:这使getch()等待到一定的时间,如果在这段时间内没有按键,则返回curses.ERR

相似性是,当没有按下按钮时,两者都会返回curses.ERR,因此您需要将该情况添加到if语句中。

代码语言:javascript
复制
#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,快速读取键等,因此它将执行许多周期,同时也不会完成很多实际工作。

代码语言:javascript
复制
screen = curses.initscr()
curses.noecho()
curses.nodelay(True)
screen.keypad(True)

方法2:半延迟

与无延迟方法相比,该方法的优点是降低了处理器的使用率。缺点是在释放密钥后会出现延迟。因此,在您释放密钥之后,bot将在它停止之前继续执行前面的命令一段时间(在我的示例代码.7秒内)。

代码语言:javascript
复制
#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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52084828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档