跑跑啦航模

树莓派控制舵机与步进电机教程

一、舵机控制基础

在本教程中,我们将探讨如何在树莓派上使用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仓库 —

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