树莓派控制舵机与步进电机教程
一、舵机控制基础
在本教程中,我们将探讨如何在树莓派上使用Python控制舵机。我们的目标是制作一个支持多自由度定位拍照的云台。
主要材料:
- 树莓派3/4/5 ×1
- 9G 180°微型舵机 ×2(如SG90)
- 电阻1KΩ ×2(可选,保护树莓派)
- 摄像头模块(可选)
- 迷你平移/倾斜相机平台

成品演示——舵机控制云台
##### PWM原理
树莓派不能直接输出模拟电信号,但可以使用PWM(脉宽调制)方法模拟。制作一个固定频率的数字信号,通过改变脉冲宽度来改变"平均"输出电压。

PWM工作原理示意图
对于舵机控制,使用"占空比"来定义舵机位置。

占空比与舵机位置对应关系
二、舵机接线
舵机连接到外部5V电源(绝不能直接从树莓派3.3V取电),数据引脚连接到树莓派GPIO:
- GPIO 17 → 仰角舵机(Tilt)
- GPIO 27 → 平移舵机(Pan)
不要忘记将GND连接在一起(树莓派–舵机–外部电源共地)。
可以在树莓派GPIO和舵机数据引脚之间串联一个1KΩ电阻,如果发生舵机故障,这将保护树莓派。

舵机接线实物图

接线示意图
三、舵机校准
以SG90舵机为例:
- 范围:180°
- 电源:4.8V(可使用USB 5VDC外部电源)
- 工作频率:50Hz(周期:20ms)
- 脉冲宽度:1ms到2ms
理论占空比计算:
- 0° → 1ms脉冲 → 占空比 ≈ 2.0%
- 90° → 1.5ms脉冲 → 占空比 ≈ 7.5%
- 180° → 2ms脉冲 → 占空比 ≈ 10%
实际测试中,SG90在3%~13%占空比范围内工作,对应0~180°。

示波器测试PWM信号
转换公式: `dutycycle = angle / 18 + 3`
四、Python舵机控制代码
单舵机控制脚本:
```python
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
def setServoAngle(servo, angle):
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()
if __name__ == '__main__':
import sys
servo = int(sys.argv[1])
GPIO.setup(servo, GPIO.OUT)
setServoAngle(servo, int(sys.argv[2]))
GPIO.cleanup()
```
使用:`sudo python3 angleServoCtrl.py 17 45`(将GPIO17的舵机转到45°)
双舵机云台控制脚本:
```python
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
pan = 27 # 水平
tilt = 17 # 垂直
GPIO.setup(tilt, GPIO.OUT)
GPIO.setup(pan, GPIO.OUT)
def setServoAngle(servo, angle):
assert angle >= 30 and angle <= 150
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()
if __name__ == '__main__':
import sys
if len(sys.argv) == 1:
setServoAngle(pan, 90)
setServoAngle(tilt, 90)
else:
setServoAngle(pan, int(sys.argv[1]))
setServoAngle(tilt, int(sys.argv[2]))
GPIO.cleanup()
```
使用:`sudo python3 servoCtrl.py 45 120`(水平45°、垂直120°)

双舵机云台机械结构
五、云台机械结构组装
将两个舵机作为云台进行组装,可以购买成品云台平台或自己搭建。

云台组装过程

组装好的云台
云台机制工作原理:
- 水平舵机(Pan)水平移动摄像机(方位角)
- 仰角舵机(Tilt)垂直移动摄像机(仰角)

云台移动机制说明
实际使用中,建议使用30°到150°的范围,足以满足摄像头需求。

电气连接完成后整体效果
六、自动循环测试
```python
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
pan = 27
tilt = 17
GPIO.setup(tilt, GPIO.OUT)
GPIO.setup(pan, GPIO.OUT)
def setServoAngle(servo, angle):
assert angle >=30 and angle <= 150
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()
if __name__ == '__main__':
for i in range(30, 160, 15):
setServoAngle(pan, i)
setServoAngle(tilt, i)
for i in range(150, 30, -15):
setServoAngle(pan, i)
setServoAngle(tilt, i)
setServoAngle(pan, 100)
setServoAngle(tilt, 90)
GPIO.cleanup()
```

舵机循环测试运行

示波器显示50Hz PWM信号
七、步进电机控制
除了舵机,树莓派也可以控制步进电机。
硬件准备:
- 28BYJ-48步进电机(带ULN2003驱动板)
- 树莓派GPIO
接线(ULN2003驱动板):
- IN1 → GPIO17
- IN2 → GPIO18
- IN3 → GPIO27
- IN4 → GPIO22
- VCC → 5V
- GND → GND
Python控制代码:
```python
import RPi.GPIO as GPIO
import time
STEP_SEQ = [
[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0],
[0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]
]
PINS = [17, 18, 27, 22]
GPIO.setmode(GPIO.BCM)
for pin in PINS:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, False)
def step_motor(steps, delay=0.002):
direction = 1 if steps > 0 else -1
steps = abs(steps)
for _ in range(steps):
for step in range(8):
for pin_idx, pin in enumerate(PINS):
GPIO.output(pin, STEP_SEQ[step][pin_idx])
time.sleep(delay)
STEP_SEQ.reverse()
for pin in PINS:
GPIO.output(pin, False)
try:
while True:
print("正转一圈...")
step_motor(512, 0.002)
time.sleep(1)
print("反转半圈...")
step_motor(-256, 0.002)
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
```

步进电机与驱动板连接示意图

步进电机工作演示
八、多个舵机控制扩展
如果同时控制多个电机,推荐使用PCA9685 PWM驱动板(I2C接口),最多可控制16路PWM输出,适合复杂机器人项目。

PCA9685驱动板扩展连接

完整调试现场
九、注意事项
绝对不能直接从树莓派3.3V取电给舵机:SG90约200mA,MG995约1A
步进电机驱动信号需要共地连接
数据引脚和舵机之间可串联1KΩ保护电阻
如需同时控制多个电机,推荐使用PCA9685 PWM驱动板
电机控制建议使用定时器而非sleep,避免阻塞主程序
树莓派同时控制两个以上舵机时需考虑总电流限制

项目代码文件和GitHub仓库

— 舵机控制云台成品 —

— PWM原理示意 —

— 占空比与舵机位置 —

— 舵机接线实物 —

— 接线示意图 —

— 示波器测试 —

— 双舵机云台结构 —

— 云台组装 —

— 组装好的云台 —

— 云台移动机制 —

— 电气连接完成 —

— 循环测试运行 —

— 示波器PWM信号 —

— 步进电机连接 —

— 步进电机工作 —

— PCA9685扩展 —

— 调试现场 —

— GitHub仓库 —
内容综合自:《基于树莓派的多舵机控制定位拍照云台》 + 综合整理

微信联系
淘宝联系