Raspberry Pi Python 代码不会移动伺服
Raspberry Pi Python Code Won't Move Servo
所以我正在做一个涉及移动伺服电机的 Raspberry Pi 的小项目。在 Python 3 中的以下代码中,我首先以大约 45 度启动伺服。稍后在代码中,根据先前的角度确定不同的角度,并更改占空比。
def main():
#Import functions
import measure, move
import time
import RPi.GPIO as GPIO
#Declare Variables
Servo_pin = 35
angle = 45
freq = 50
#Setup board
GPIO.setmode(GPIO.BOARD)
GPIO.setup(Servo_pin, GPIO.OUT)
servo = GPIO.PWM(Servo_pin,freq)
#Determine Duty Cycle
dc = 1/18 * (angle) + 2
print("Starting Duty Cycle: ",dc)
#Start servo
servo.start(dc)
i = 1
#Determine angle based on previous angle
while True:
if (i == 0):
angle = 45
elif (i == 1):
angle = 90
elif (i == 2):
angle = 180
elif (i > 2):
angle = 45
i = 0
i = i+1
#Change servo's position
#Convert angle to Duty Cycle
dc = 1/18 * (angle) + 2
print("Setting Duty Cycle: ",dc)
#Change position
servo.ChangeDutyCycle(dc)
#Give servo time to finish moving
time.sleep(0.3)
main()
我将舵机连接到电池组(4 节 AA 电池),但舵机不会随着此代码移动。现在,我承认我是一个初学者,这可能真的很容易,如果是这样的话,我提前道歉。
感谢任何帮助!
根据 https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/sourceforge 上的文档,当表示 PWM 的实例变量超出范围时,PWM 将停止。您的两个函数都包含此行:servo = GPIO.PWM(pin,freq)
,创建一个局部变量 servo
,一旦到达函数末尾,该变量就会超出范围。一种解决方法是移动这些行:
import time
import RPi.GPIO as GPIO
# HERE you need to define which pin you are using
# I can't tell you how to do that
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
freq = 10.0 # or some other value to get started
servo = GPIO.PWM(pin,freq)
到脚本的顶部,然后从各个函数中删除这些行。现在 servo
将是一个全局变量,在程序运行期间的任何时候都不会超出范围。
可能还有其他问题。您是否有电压表或示波器来验证引脚是否按照您的预期运行?我一直在处理这种应用程序,在连接所有硬件之前了解拼图的小块是否真的在工作会很有帮助。没有什么是第一次就成功的:-)。
需要有共同点。我使用的是两个独立的面包板,没有连接公共接地。一旦我连接了一个公共地,伺服系统就开始按照我的意愿运行。
感谢您的编码帮助!
所以我正在做一个涉及移动伺服电机的 Raspberry Pi 的小项目。在 Python 3 中的以下代码中,我首先以大约 45 度启动伺服。稍后在代码中,根据先前的角度确定不同的角度,并更改占空比。
def main():
#Import functions
import measure, move
import time
import RPi.GPIO as GPIO
#Declare Variables
Servo_pin = 35
angle = 45
freq = 50
#Setup board
GPIO.setmode(GPIO.BOARD)
GPIO.setup(Servo_pin, GPIO.OUT)
servo = GPIO.PWM(Servo_pin,freq)
#Determine Duty Cycle
dc = 1/18 * (angle) + 2
print("Starting Duty Cycle: ",dc)
#Start servo
servo.start(dc)
i = 1
#Determine angle based on previous angle
while True:
if (i == 0):
angle = 45
elif (i == 1):
angle = 90
elif (i == 2):
angle = 180
elif (i > 2):
angle = 45
i = 0
i = i+1
#Change servo's position
#Convert angle to Duty Cycle
dc = 1/18 * (angle) + 2
print("Setting Duty Cycle: ",dc)
#Change position
servo.ChangeDutyCycle(dc)
#Give servo time to finish moving
time.sleep(0.3)
main()
我将舵机连接到电池组(4 节 AA 电池),但舵机不会随着此代码移动。现在,我承认我是一个初学者,这可能真的很容易,如果是这样的话,我提前道歉。
感谢任何帮助!
根据 https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/sourceforge 上的文档,当表示 PWM 的实例变量超出范围时,PWM 将停止。您的两个函数都包含此行:servo = GPIO.PWM(pin,freq)
,创建一个局部变量 servo
,一旦到达函数末尾,该变量就会超出范围。一种解决方法是移动这些行:
import time
import RPi.GPIO as GPIO
# HERE you need to define which pin you are using
# I can't tell you how to do that
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
freq = 10.0 # or some other value to get started
servo = GPIO.PWM(pin,freq)
到脚本的顶部,然后从各个函数中删除这些行。现在 servo
将是一个全局变量,在程序运行期间的任何时候都不会超出范围。
可能还有其他问题。您是否有电压表或示波器来验证引脚是否按照您的预期运行?我一直在处理这种应用程序,在连接所有硬件之前了解拼图的小块是否真的在工作会很有帮助。没有什么是第一次就成功的:-)。
需要有共同点。我使用的是两个独立的面包板,没有连接公共接地。一旦我连接了一个公共地,伺服系统就开始按照我的意愿运行。
感谢您的编码帮助!