发布时间: 2026-05-14
你可曾碰到过这般情景:当着手去组装一个机械臂或者云台之际,把舵机连接到树莓派上后却一点反应都没有,又或者仅仅只能转到一个方向,而代码运行好了之后舵机却剧烈地抖动?这是源于树莓派和舵机之间是需要一套精准的控制指令的。本文会直接给出经验证过的树莓派舵机控制代码,并且一步一步地引领你去完成接线、代码编写以及调试,以此确保你的舵机能依照预期转动到任何角度。
重要关键结论:操控控制舵机仅仅只需要通过三个步骤来达成——要正确无误地连接电源、信号线以及地线;需运用50Hz的PWM信号;还要计算并且发送对应于0°到180°的占空比值(2.5%到12.5%)。从这之后所有的相关内容全部都是依照这三个具体的动作而开展进行发展的。
一旦要开展代码的运行,前提必然是得先将树莓派与舵机在物理层面的连接保证无差错。就拿最为普遍常见的180°舵机来讲呀,它存在着三根线呢。
棕色/黑色:地线(GND)
红色:电源正极(5V)
橙色/黄色:信号线(PWM)
接线表(使用树莓派GPIO接口):
解答高频疑难问题:舵机出现不转动或者是抖动的情况,百分之九十的缘由是供电不足。树莓派5V输出时候最大电流大概是500mA,驱动一个净重9g的小舵机还算可以;倘若要驱动更大扭矩规格的或者是多个舵机,那就一定要使用外部5V稳压电源(好比手机充电头加上可调降压模块),还需要把树莓派的GND跟外部电源的GND进行连接。
具有树莓派的情况下,推荐运用以及RPi.GPIO库(此为系统自身所带)。将终端予以打开,去确认是否已经安装:
c " RPi.GPIO"
若无报错则已安装。否则执行:
sudo apt
sudo apt rpi.gpio
下述代码,达成把舵机逐个转到,从零度转向九十度,转向一百八十度,而后回转,复制留存成.py。
RPi.GPIO as GPIO
time
# 使用BCM编号方式
GPIO.(GPIO.BCM)
# 设置为输出
GPIO.setup(18, GPIO.OUT)
# 创建PWM对象,频率50Hz(舵机标准)
pwm = GPIO.PWM(18, 50)
# 初始占空比0(停止输出)
pwm.start(0)
def (angle):
"""
将舵机转到指定角度(0~180度)
占空比计算公式:角度/180 (12.5 2.5) + 2.5
其中2.5%对应0度,12.5%对应180度
"""
if angle < 0:
angle = 0
if angle > 180:
angle = 180
duty = angle / 180.0 (12.5 2.5) + 2.5
pwm.(duty)
time.sleep(0.5) # 等待舵机转动到位
pwm.(0) # 停止发送信号,减少抖动和发热
try:
while True:
print("转到0度")
(0)
time.sleep(1)
print("转到90度")
(90)
time.sleep(1)
print("转到180度")
(180)
time.sleep(1)
:
print("程序退出")
pwm.stop()
GPIO.()
代码核心解析:
![]()
该语句所执行的操作是,通过特定方式生成了这样一种脉冲信号,其频率为50Hz,周期时长为20ms,并且与涵盖所有标准形式的舵机在内的控制协议相契合,此操作借助了GPIO.PWM对与18相关的端口进行操作来加以实现。
占空比的计算公式是通过校准得出的,其计算结果为:2.5%时对应0°,12.5%时就对应180°。假定你的舵机实际所属范围存在差异(比如0°对应的是0.5ms高电平,而180°对应的是2.5ms)伟创动力舵机,那么能够依据公式去进行调整,该公式为:占空比等于(高电平时间ms除以20ms)再乘以100%。0.5ms除以20ms等于2.5%,2.5ms除以20ms等于12.5%。
将PWM的占空比设置为0极为关键,这一操作是,每当转动至指定位置后便止住输出PWM信号,如此这般能够避免舵机毫无休止地抖动以及出现过热状况,懂了吧。
在终端执行:
.py
如果你看到舵机依次转动到三个位置,说明成功。
常见错误及解决方法:
若舵机全然不动,需检查电源线有无接反,要测量红色线与黑色线之间电压是否为5V,还得确认信号线所连接的是不是(BCM)。
光是朝着单一方向进行转动并且角度并不精准,这表明占空比的下限或者上限偏离了标准数值,手动去修改代码里的2.5以及12.5,每次按照增减0.2来进行测试,比如说有些舵机下限需要达到3.0%才会产生响应。
舵机出现剧烈抖动的情况,一般而言这是由于树莓派供电不稳定所导致的,又或者是在转动之后没有停止PWM。可以试着在每帧转动以后调用(0),并采用外部电源进行供电。
要是需要同时操控多个舵机,比如说机械臂,那么每个舵机就需要一个单独的GPIO引脚。紧接着出现这样的情况,以下代码控制两个舵机各自转到不一样的角度:
RPi.GPIO as GPIO
time
GPIO.(GPIO.BCM)
pins = [18, 17] # 两个舵机信号线接和
pwms = []
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
pwm = GPIO.PWM(pin, 50)
pwm.start(0)
pwms.(pwm)
def (, angle):
duty = angle / 180.0 (12.5 2.5) + 2.5
.(duty)
time.sleep(0.5)
.(0)
try:
(pwms[0], 0) # 舵机1到0度
(pwms[1], 90) # 舵机2到90度
time.sleep(2)
(pwms[0], 180)
(pwms[1], 0)
time.sleep(2)
:
for pwm in pwms:
pwm.stop()
GPIO.()
留意,管控多个舵机之际,一定要运用外部5V供电,电流起码2A往上,要不树莓派会重新启动或者被烧坏。
0至270度的舵机,其0度对应着高电平0.5毫秒,此高电平占空比为2.5%伟创动力,270度对应着2.5毫秒,该2.5毫秒占空比为12.5%,公式保持不变,只是角度参数能够输入0至270。
![]()
有着 360°连续旋转功能的这样一类舵机,它没办法去控制角度,仅仅能够对速度以及方向进行控制,当占空比处于 1.5ms(也就是 7.5%)的时候会致使停止,一旦小于 1.5ms 便会朝着逆时针方向旋转,而大于 1.5ms 则会朝着顺时针方向旋转,代码需要改成。
def (speed): # speed: 100~100, 负值逆时针
duty = 7.5 + (speed / 100.0) * 2.5
pwm.(duty)
曾经过多次反复进行验证,树莓派去控制舵机的实质就是要生成一个周期为20ms的PWM信号,并且这个信号的高电平宽度处于0.5至2.5ms之间。而你仅仅需要:
1. 按接线表连接舵机(特别注意供电共地)
2. 运行上面提供的代码(已包含占空比精确计算公式)
3. 每次转动后调用(0)防止抖动
这三点缺一不可。
现在就去操作:
准备,有树莓派,其为任何型号,有一个标准180°舵机,还有三根杜邦线。
照着第1节的接线表连接。
复制第3节的代码到树莓派,保存并运行。
观察舵机是否顺序转到0°、90°、180°。
要是碰到任何问题,那就回到第4节的常见错误列表那儿对照排查。你无需任何别的库,也不需要复杂的配置,这套代码在树莓派2B上实测通过了,这套代码在树莓派3B上实测通过了,这套代码在树莓派4B上实测通过了,这套代码在树莓派Zero上实测通过了。
最终得出的结论是:所有关于舵机控制的问题,都能够被归结为“PWM频率是不是正确、占空比范围是不是相匹配、供电是不是足够”。本文所提供的代码以及调试的方法,能够覆盖99%的树莓派舵机应用场景。把这段代码保存成你自己的标准模板,往后任何关于树莓派加上舵机的项目,直接重复使用就行。