首先,我有Q设置为停止功能,为我的车,但我想使它,使汽车只移动时,一个关键是按下。例如,当我按W时,汽车向前行驶,但我必须使用Q来停止汽车。我想让它这样,我必须按住W键才能让车前进,当我松开W键时,我想让车停下来。
作为学校的一个项目,我已经在这方面工作了一段时间,但我一无所获,因为我不知道在谷歌上搜索什么,或者没有关于这个主题的信息。所以我来这里看看有没有人能帮我。提前感谢任何花时间帮助我解决问题的人。
这是我的代码。我不在乎你是否完全改变它来实现我想要的,只要它在我的场景中仍然有效。如果你需要更多的信息,请随时在评论中问我。
- 即使这是一个学校项目,我会把我的报告,我不得不在这里张贴这一点,谁找到一个修复的人将获得信贷的帮助。:)
import RPi.GPIO as io
io.setmode(io.BCM)
import time, sys, tty, termios
from termcolor import colored, cprint
motor1_in1_pin = 4
motor1_in2_pin = 17
io.setup(motor1_in1_pin, io.OUT)
io.setup(motor1_in2_pin, io.OUT)
motor2_in1_pin = 24
motor2_in2_pin = 25
motor2_in3_pin = 22
io.setup(motor2_in1_pin, io.OUT)
io.setup(motor2_in2_pin, io.OUT)
io.setup(motor2_in3_pin, io.OUT)
io.setup(18, io.OUT)
io.output(18, False)
io.setup(23, io.OUT)
io.output(23, False)
io.setup(27, io.OUT)
io.output(27, False)
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def motor1_forward():
io.output(motor1_in1_pin, True)
io.output(motor1_in2_pin, False)
def motor1_reverse():
io.output(motor1_in1_pin, False)
io.output(motor1_in2_pin, True)
def motor1_stop():
io.output(motor1_in1_pin, False)
io.output(motor1_in2_pin, False)
def motor2_forward():
io.output(motor2_in1_pin, True)
io.output(motor2_in2_pin, False)
io.output(motor2_in3_pin, False)
def motor2_reverse():
io.output(motor2_in1_pin, False)
io.output(motor2_in2_pin, True)
io.output(motor2_in3_pin, True)
def motor2_stop():
io.output(motor2_in1_pin, False)
io.output(motor2_in2_pin, False)
io.output(motor2_in3_pin, False)
def toggleLights():
global lightStatus
if(lightStatus == False):
io.output(18, True)
io.output(23, True)
lightStatus = True
else:
io.output(18, False)
io.output(23, False)
lightStatus = False
def toggleSteering(direction):
global wheelStatus
if(direction == "right"):
if(wheelStatus == "centre"):
motor1_forward()
wheelStatus = "right"
elif(wheelStatus == "left"):
motor1_stop()
wheelStatus = "centre"
if(direction == "left"):
if(wheelStatus == "centre"):
motor1_reverse()
wheelStatus = "left"
elif(wheelStatus == "right"):
motor1_stop()
wheelStatus = "centre"
io.output(motor1_in1_pin, False)
io.output(motor1_in2_pin, False)
io.output(motor2_in1_pin, False)
io.output(motor2_in2_pin, False)
io.output(motor2_in3_pin, False)
lightStatus2 = False
lightStatus = False
wheelStatus = "centre"
bold = "\033[1m"
reset = "\033[0;0m"
cprint("Jacksons Awesome Rc car Program", 'blue')
print " " +bold + "w/s:" +reset + " Acceleration"
print " " +bold + "a/d:" +reset + " Steering"
print " " +bold + "q:" +reset + " Brake"
print("l: lights")
print("p: Dishwasher")
while True:
char = getch()
if(char == "w"):
motor2_forward()
if(char == "q"):
motor2_stop()
if(char == "s"):
motor2_reverse()
if(char == "q"):
motor2_stop()
if(char == "a"):
toggleSteering("left")
if(char == "d"):
toggleSteering("right")
if(char == "l"):
toggleLights()
if(char == "o"):
cPrint("hi", 'red')
if(char == "p"):
print " " +bold + "Dishwasher is a mechanical device for cleaning dishes and eating-utensils. Dishwashers can be found in restaurants and private homes" +reset + " "
if(char == "x"):
cprint("Program Ended", 'red')
break
char = ""
io.cleanup()
1条答案
按热度按时间vawmfj5a1#
为什么不使用“elif”而不是“if”语句?用你的方法,如果键是“w”,那么你的程序仍然会通过并测试“a”,“d”,“l”......使用'elif',一旦它达到true条件,它就会停止检查其余的条件(为了效率)。
这是我想到的
它会检查按下的键,如果不是前进/后退命令,它会做它应该做的事情。如果它是一个前进/后退命令,它会在给定的时间内向那个方向移动,然后停下来检查下一个键是否被按下。
请记住,我只编辑了你的'while'循环。
注意到的其他问题:你似乎有两个马达,但只运行“马达2”。我看不到任何方向到'motor 1'。此外,如果1秒的时间限制对于正确的响应来说太长,则可以使用浮点数来缩短持续时间。