树莓派我们去伺服控制
RaspberryPi pigame servo controll
我在我的 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()
但它没有检测到事件。我不停地敲击键盘,伺服系统就静止不动了。我对其进行了调试,但它从未检测到任何 keybord/mouse 事件。
请帮忙。
您的代码没问题,但如果没有 window,就无法接收 window 事件(如按键)。
在您的程序中添加 window 使其正常运行。
这是我的测试代码:
# 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()
并不理想,因为它会阻塞事件循环。您的 OS 可能认为您的应用程序已锁定,并提示用户终止它。最好使用实时时间戳手动实现此延迟 - 仅在时间 window 允许时才向伺服器发送更新。
我在我的 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()
但它没有检测到事件。我不停地敲击键盘,伺服系统就静止不动了。我对其进行了调试,但它从未检测到任何 keybord/mouse 事件。
请帮忙。
您的代码没问题,但如果没有 window,就无法接收 window 事件(如按键)。
在您的程序中添加 window 使其正常运行。
这是我的测试代码:
# 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()
并不理想,因为它会阻塞事件循环。您的 OS 可能认为您的应用程序已锁定,并提示用户终止它。最好使用实时时间戳手动实现此延迟 - 仅在时间 window 允许时才向伺服器发送更新。