如何解决树莓派pigame伺服控制
我在我的 RaspBerryPi 3 上连接了一个伺服器,我想控制它。 我目前正在使用 pygame 库。它已安装并且是最新版本。 这是我的代码:
# Import libraries
import RPi.GPIO as GPIO
import time
import pygame
from pygame.locals import *
pygame.init()
# Set GPIO numbering mode
GPIO.setmode(GPIO.BOARD)
# Set pin 11 as an output,and define as servo1 as PWM pin
GPIO.setup(11,GPIO.OUT)
servo = GPIO.PWM(11,50) # pin 11 for servo1,pulse 50Hz
# Start PWM running,with value of 0 (pulse off)
servo.start(0)
angle = 90.0
servo.ChangeDutyCycle(2+(angle/18))
time.sleep(0.5)
servo.ChangeDutyCycle(0)
changed = False
while 1:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if angle > 10:
angle = angle - 5
changed = True
elif event.key == pygame.K_d:
if angle < 170:
angle = angle + 5
changed = True
elif event.key == pygame.K_q:
break
if changed:
servo.ChangeDutyCycle(2+(angle/18))
time.sleep(0.5)
servo.ChangeDutyCycle(0)
time.sleep(1.5)
changed = False
#Clean things up at the end
servoH.stop()
GPIO.cleanup()
pygame.quit()
但它没有检测到事件。我一直按键盘上的键,伺服器只是静止不动。我调试了它,它没有检测到任何键盘/鼠标事件。
请帮忙。
解决方法
您的代码没问题,但没有窗口就无法接收窗口事件(如按键)。
向您的程序添加一个窗口使其工作正常。
这是我的测试代码:
# Import libraries
#import RPi.GPIO as GPIO
import time
import pygame
from pygame.locals import *
SCREEN_WIDTH = 600
SCREEN_HEIGHT= 400
BLACK = ( 0,0 )
YELLOW = ( 255,255,0 )
pygame.init()
screen = pygame.display.set_mode( ( SCREEN_WIDTH,SCREEN_HEIGHT ) )
"""
# Set GPIO numbering mode
GPIO.setmode(GPIO.BOARD)
# Set pin 11 as an output,and define as servo1 as PWM pin
GPIO.setup(11,GPIO.OUT)
servo = GPIO.PWM(11,50) # pin 11 for servo1,pulse 50Hz
# Start PWM running,with value of 0 (pulse off)
servo.start(0)
servo.ChangeDutyCycle(2+(angle/18))
time.sleep(0.5)
servo.ChangeDutyCycle(0)
"""
angle = 90.0
changed = False
running = True
font = pygame.font.SysFont( None,25 )
angle_label = font.render( "Angle: %4.2f" % ( angle ),True,YELLOW )
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if angle > 10:
angle = angle - 5
changed = True
elif event.key == pygame.K_d:
if angle < 170:
angle = angle + 5
changed = True
elif event.key == pygame.K_q:
break
if changed:
"""
servo.ChangeDutyCycle(2+(angle/18))
time.sleep(0.5)
servo.ChangeDutyCycle(0)
time.sleep(1.5)
"""
angle_label = font.render( "Angle: %4.2f" % ( angle ),YELLOW )
changed = False
# Update the display
screen.fill( BLACK )
screen.blit( angle_label,( 50,50 ) )
pygame.display.update()
#Clean things up at the end
"""
servoH.stop()
GPIO.cleanup()
"""
pygame.quit()
请注意,在 PyGame 代码中使用 time.sleep()
并不理想,因为它会阻塞事件循环。您的操作系统可能认为您的应用程序已锁定,并提示用户终止它。最好使用实时时间戳手动实现此延迟 - 仅在时间窗口允许时向伺服发送更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。