树莓派pigame伺服控制

时间:2021-02-13 19:30:31

标签: python pygame raspberry-pi servo

我在我的 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()

但它没有检测到事件。我一直按键盘上的键,伺服器只是静止不动。我调试了它,它没有检测到任何键盘/鼠标事件。

请帮忙。

1 个答案:

答案 0 :(得分:0)

您的代码没问题,但没有窗口就无法接收窗口事件(如按键)。

向您的程序添加一个窗口使其工作正常。

这是我的测试代码:

# Import libraries
#import RPi.GPIO as GPIO
import time
import pygame
from pygame.locals import *

SCREEN_WIDTH = 600
SCREEN_HEIGHT= 400

BLACK  = (   0,   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 ), True, 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() 并不理想,因为它会阻塞事件循环。您的操作系统可能认为您的应用程序已锁定,并提示用户终止它。最好使用实时时间戳手动实现此延迟 - 仅在时间窗口允许时向伺服发送更新。

相关问题