键盘控制问题
Keypad Control Problems
因此,对于我在 AP Comp Sci 的最终项目,我决定构建一个 Pi 和 Arduino 机器人,因为我要使用 Pi 通过它的数字输入(即 Arduino)来控制 Arduino,我想要创建和测试我的键盘控制,所以我将一些 LED 连接到 GPIO 并编写了以下代码:
import pygame
import RPi.GPIO as GPIO
pygame.init()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32,GPIO.OUT)
GPIO.setup(36,GPIO.OUT)
GPIO.setup(40,GPIO.OUT)
window = pygame.display.set_mode((800,600))
pygame.display.set_caption("Console")
def clearGP():
x=32
while x<=40 :
GPIO.output(x,False)
x= x+4
run = True
while run :
for event in pygame.event.get():
if (event.type==pygame.KEYDOWN):
keys = pygame.key.get_pressed()
if keys[pygame.K_s] and keys[pygame.K_a]:
GPIO.output(40,True)
GPIO.output(32,True)
elif keys[pygame.K_s] and keys[pygame.K_d]:
GPIO.output(40,True)
GPIO.output(36,True)
elif keys[pygame.K_w]:
GPIO.output(32,True)
GPIO.output(36,True)
elif keys[pygame.K_s]:
GPIO.output(40,True)
elif keys[pygame.K_d]:
GPIO.output(36,True)
elif keys[pygame.K_a]:
GPIO.output(32,True)
elif keys[pygame.K_t]:
run=False
clearGP()
GPIO.cleanup()
pygame.quit()
然而,当它应该一次输出到两个灯时例如当按下 a & s 时(在我的测试电路中)它只输出到一个!此外,指示灯在闪烁,非常快,而不是慢,我希望只要我按住键它就保持稳定,因为我希望我的机器人保持一致而不是紧张(就移动性而言)。我该怎么办?
P.S。我知道我用了 Pygame,这不是游戏。我只是认为它的按键跟踪比 Tkinter 更容易使用,因为我 Python 经验很少(我真的是 Java 人)
我认为,因为您在 'KEYDOWN' 事件中 运行 执行此操作,它会 运行 一旦检测到您按下的两个键中的第一个,即使你认为你同时按下了它们。因此,当您获得 key.get_pressed() 时,只有一个按钮被按下。
尝试删除这两行(并重新缩进),看看效果是否更好:
for event in pygame.event.get():
if (event.type==pygame.KEYDOWN):
它闪烁是因为您在每个周期都调用 clearGP(),因此您将在一个周期的 50% 时间内点亮 LED,并在另外 50% 的周期内将其关闭。仅当未按下键时才应关闭 LED,例如
if keys[pygame.K_a]:
GPIO.output(32,True)
else:
GPIO.output(32,False)
因此,对于我在 AP Comp Sci 的最终项目,我决定构建一个 Pi 和 Arduino 机器人,因为我要使用 Pi 通过它的数字输入(即 Arduino)来控制 Arduino,我想要创建和测试我的键盘控制,所以我将一些 LED 连接到 GPIO 并编写了以下代码:
import pygame
import RPi.GPIO as GPIO
pygame.init()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32,GPIO.OUT)
GPIO.setup(36,GPIO.OUT)
GPIO.setup(40,GPIO.OUT)
window = pygame.display.set_mode((800,600))
pygame.display.set_caption("Console")
def clearGP():
x=32
while x<=40 :
GPIO.output(x,False)
x= x+4
run = True
while run :
for event in pygame.event.get():
if (event.type==pygame.KEYDOWN):
keys = pygame.key.get_pressed()
if keys[pygame.K_s] and keys[pygame.K_a]:
GPIO.output(40,True)
GPIO.output(32,True)
elif keys[pygame.K_s] and keys[pygame.K_d]:
GPIO.output(40,True)
GPIO.output(36,True)
elif keys[pygame.K_w]:
GPIO.output(32,True)
GPIO.output(36,True)
elif keys[pygame.K_s]:
GPIO.output(40,True)
elif keys[pygame.K_d]:
GPIO.output(36,True)
elif keys[pygame.K_a]:
GPIO.output(32,True)
elif keys[pygame.K_t]:
run=False
clearGP()
GPIO.cleanup()
pygame.quit()
然而,当它应该一次输出到两个灯时例如当按下 a & s 时(在我的测试电路中)它只输出到一个!此外,指示灯在闪烁,非常快,而不是慢,我希望只要我按住键它就保持稳定,因为我希望我的机器人保持一致而不是紧张(就移动性而言)。我该怎么办?
P.S。我知道我用了 Pygame,这不是游戏。我只是认为它的按键跟踪比 Tkinter 更容易使用,因为我 Python 经验很少(我真的是 Java 人)
我认为,因为您在 'KEYDOWN' 事件中 运行 执行此操作,它会 运行 一旦检测到您按下的两个键中的第一个,即使你认为你同时按下了它们。因此,当您获得 key.get_pressed() 时,只有一个按钮被按下。
尝试删除这两行(并重新缩进),看看效果是否更好:
for event in pygame.event.get():
if (event.type==pygame.KEYDOWN):
它闪烁是因为您在每个周期都调用 clearGP(),因此您将在一个周期的 50% 时间内点亮 LED,并在另外 50% 的周期内将其关闭。仅当未按下键时才应关闭 LED,例如
if keys[pygame.K_a]:
GPIO.output(32,True)
else:
GPIO.output(32,False)