从玩具到机器人:MG90S舵机在Arduino和树莓派上的花式玩法(附Python/Arduino代码)
从玩具到机器人:MG90S舵机在Arduino和树莓派上的花式玩法(附Python/Arduino代码)
你是否曾想过,一个售价不到20元的小小舵机,能成为机器人、互动装置甚至艺术创作的核心部件?MG90S这款微型舵机以其出色的性价比和可靠的性能,成为创客和教育领域的宠儿。不同于工业级舵机的复杂配置,MG90S让初学者也能快速实现机械运动控制——无论是制作会打招呼的机械手、自动追踪的摄像头云台,还是随风摆动的互动雕塑。
本文将带你跳出传统单片机开发的复杂环境,用Arduino和树莓派这两大创客神器,探索MG90S的无限可能。我们将从最基础的舵机摆动开始,逐步深入到多舵机协同控制、外部传感器联动等实用场景,所有代码即拿即用,让你在30分钟内就能看到实物动起来!
1. 认识你的MG90S:小身材大能量
MG90S是一款180度旋转的微型舵机,重量仅13.4克,却能够产生1.8kg·cm的扭矩。它采用标准的三线控制接口(电源、地线、信号),工作电压范围为4.8V-6V。与普通直流电机不同,舵机内部集成了控制电路和齿轮组,能够精确停留在指定角度。
典型参数对比表:
| 特性 | MG90S | SG90 | MG996R |
|---|---|---|---|
| 扭矩 | 1.8kg·cm | 1.2kg·cm | 10kg·cm |
| 工作电压 | 4.8-6V | 4.8-6V | 4.8-7.2V |
| 重量 | 13.4g | 9g | 55g |
| 响应速度 | 0.1s/60° | 0.12s/60° | 0.18s/60° |
注意:舵机在堵转时电流会急剧上升,长时间堵转可能导致烧毁,建议搭配散热片使用。
实际使用中,MG90S的齿轮耐用性比SG90更好,而体积又比MG996R小巧,特别适合以下场景:
- 机械臂的关节驱动
- 智能小车的转向控制
- 摄像头云台的俯仰调节
- 互动艺术装置的动态部件
2. Arduino极简控制:5行代码让舵机动起来
Arduino平台最大的优势在于其简化的硬件抽象层,即使没有电子基础的开发者也能快速上手。控制MG90S只需要使用内置的Servo库,无需关心底层PWM生成细节。
2.1 基础接线与供电方案
正确的供电是舵机稳定工作的前提。虽然可以直接从Arduino的5V引脚取电,但当多个舵机同时工作时,建议采用外接电源方案:
Arduino控制电路:
[USB供电] → [Arduino板] → 信号线(PWM)
↘ 地线(GND)
[外部电源] → [舵机电源+]
↘ [共地连接至Arduino GND]
材料清单:
- Arduino Uno/Nano ×1
- MG90S舵机 ×1
- 5V 2A电源适配器 ×1
- 面包板及跳线若干
2.2 Servo库的魔法
Arduino IDE已经内置了Servo库,它抽象了底层硬件细节,提供了极其简单易用的API:
#include <Servo.h>
Servo myservo; // 创建舵机对象
void setup() {
myservo.attach(9); // 将舵机信号线接在数字引脚9
}
void loop() {
myservo.write(0); // 转到0度位置
delay(1000); // 等待1秒
myservo.write(90); // 转到中间位置
delay(1000);
myservo.write(180); // 转到180度位置
delay(1000);
}
这个基础示例演示了如何让舵机在0°、90°、180°三个关键位置间循环运动。实际项目中,你可能需要更平滑的运动效果,这时可以使用 for 循环实现渐变:
void loop() {
for(int pos = 0; pos <= 180; pos += 1) { // 每次增加1度
myservo.write(pos);
delay(15); // 给舵机留出运动时间
}
for(int pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
提示:MG90S的实际角度范围可能略有偏差,可以通过校准找到真实的0°和180°位置。有些舵机可能需要
write(5)才能到达物理0°位置。
3. 树莓派Python控制:GPIO的艺术
树莓派作为一款微型计算机,适合需要复杂逻辑或网络功能的项目。Python的简洁语法加上丰富的库支持,让舵机控制变得异常灵活。
3.1 硬件连接注意事项
树莓派的GPIO引脚输出电流有限,必须遵循以下规则:
- 永远不要直接从树莓派取电驱动舵机
- 使用独立的5V电源为舵机供电
- 确保树莓派与外部电源共地
推荐连接方案:
树莓派 GPIO18 (PWM) → 舵机信号线(黄色)
外部5V电源+ → 舵机电源线(红色)
外部电源- → 舵机地线(棕色) → 树莓派GND
3.2 RPi.GPIO库实战
RPi.GPIO是树莓派最常用的GPIO控制库,虽然需要手动配置PWM参数,但提供了更精细的控制:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 50) # 引脚18,频率50Hz
pwm.start(0) # 初始占空比0%
def set_angle(angle):
duty = angle / 18 + 2 # 角度转占空比公式
pwm.ChangeDutyCycle(duty)
time.sleep(0.3) # 等待舵机到位
try:
while True:
set_angle(0)
set_angle(90)
set_angle(180)
except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()
关键参数解析:
- 50Hz:舵机标准控制频率
- 占空比计算:
2%对应0°,12%对应180° - 每次改变角度后需要适当延时,让舵机有足够时间运动
3.3 GPIOZero的优雅实现
如果你更喜欢更高级的抽象,GPIOZero库提供了更简洁的API:
from gpiozero import AngularServo
from time import sleep
servo = AngularServo(18, min_angle=0, max_angle=180, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000)
while True:
servo.angle = 0
sleep(1)
servo.angle = 90
sleep(1)
servo.angle = 180
sleep(1)
GPIOZero自动处理了PWM参数转换,但需要注意:
min_pulse_width和max_pulse_width需要根据舵机规格调整- 某些舵机可能需要校准这两个参数才能准确到达极限位置
4. 创意项目实战:从单舵机到智能系统
掌握了基础控制后,让我们看看如何将MG90S应用到实际项目中。以下是三个不同复杂度的创意方案。
4.1 简易太阳追踪器(单舵机)
利用光敏电阻实现自动追光:
#include <Servo.h>
Servo tracker;
const int LDR1 = A0; // 左侧光敏
const int LDR2 = A1; // 右侧光敏
int threshold = 50; // 灵敏度阈值
void setup() {
tracker.attach(9);
Serial.begin(9600);
}
void loop() {
int val1 = analogRead(LDR1);
int val2 = analogRead(LDR2);
int diff = val1 - val2;
if(abs(diff) > threshold) {
int currentPos = tracker.read();
int newPos = constrain(currentPos + map(diff, -512, 512, -10, 10), 0, 180);
tracker.write(newPos);
}
delay(100);
}
元件布局:
[光敏电阻1] ← 10cm → [舵机支架] ← 10cm → [光敏电阻2]
↑
[太阳能板]
4.2 三自由度机械臂(多舵机协同)
控制三个MG90S实现简单抓取动作:
from gpiozero import AngularServo
from time import sleep
# 初始化三个舵机
base = AngularServo(17, min_angle=0, max_angle=180)
elbow = AngularServo(22, min_angle=0, max_angle=180)
gripper = AngularServo(23, min_angle=0, max_angle=90)
def move_servo(servo, start, end, step=1, delay=0.05):
for angle in range(start, end, step):
servo.angle = angle
sleep(delay)
# 抓取动作序列
move_servo(base, 90, 45) # 底座左转
move_servo(elbow, 90, 135) # 肘部下降
move_servo(gripper, 0, 90) # 夹爪打开
move_servo(elbow, 135, 100) # 轻微抬起
move_servo(gripper, 90, 0) # 夹爪闭合
move_servo(elbow, 100, 60) # 抬起到高位
move_servo(base, 45, 90) # 底座回中
重要提示:多舵机系统需要确保电源供应充足,建议使用5V 3A以上的电源,并为每个舵机并联100μF电容滤波。
4.3 网络控制云台(树莓派高级应用)
通过网页远程控制舵机云台:
from flask import Flask, render_template_string
import RPi.GPIO as GPIO
app = Flask(__name__)
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 50)
pwm.start(0)
HTML = '''
<!DOCTYPE html>
<html>
<body>
<h1>舵机云台控制</h1>
<input type="range" min="0" max="180" oninput="setAngle(this.value)">
<script>
function setAngle(angle) {
fetch(`/angle/${angle}`);
}
</script>
</body>
</html>
'''
@app.route('/')
def index():
return render_template_string(HTML)
@app.route('/angle/<int:angle>')
def set_angle(angle):
duty = angle / 18 + 2
pwm.ChangeDutyCycle(duty)
return 'OK'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
运行后,在局域网内任何设备访问树莓派IP地址,都能看到一个滑动条控制器,实时调整舵机角度。这个方案可以轻松扩展为:
- 添加摄像头实现远程监控
- 集成人脸追踪算法
- 增加多舵机控制维度
5. 性能优化与常见问题解决
在实际项目中,你可能会遇到各种舵机控制问题。以下是经过验证的解决方案。
5.1 提高控制精度的技巧
抖动问题处理:
- 在舵机电源端并联100-470μF电容
- 使用
pwm.set_pwm_freq(60)提高PWM频率(某些库支持) - 在机械结构中增加减震材料
位置校准方法:
void calibrate() {
for(int i=0; i<=180; i+=10) {
myservo.write(i);
delay(1000);
Serial.print("Angle: ");
Serial.print(i);
Serial.print("°, Actual: ");
Serial.println(readPotentiometer()); // 接电位器测量实际角度
}
}
5.2 电源噪声抑制方案
多舵机系统的供电设计:
[5V 5A电源] → [电容阵列] → [电源分配板]
├→ [舵机1]
├→ [舵机2]
└→ [舵机3]
推荐元件:
- 低ESR电解电容:100μF 16V (每舵机1个)
- 陶瓷电容:0.1μF (每舵机1个)
- 二极管:1N4007 (防止反向电流)
5.3 机械结构优化建议
- 使用3D打印的舵机支架时,选择PETG材料比PLA更耐用
- 在舵机输出轴和负载间增加减速机构可以提升扭矩
- 对于频繁运动的关节,定期添加润滑油(如白色锂基润滑脂)
# 舵机寿命测试脚本
import time
from gpiozero import AngularServo
servo = AngularServo(18)
cycles = 0
try:
while True:
servo.angle = 0
time.sleep(0.5)
servo.angle = 180
time.sleep(0.5)
cycles += 1
print(f"已完成 {cycles} 次循环")
except KeyboardInterrupt:
print(f"总循环次数: {cycles}")
通过这个测试可以评估舵机在持续工作条件下的性能衰减情况。质量合格的MG90S通常能完成5万次以上的满幅摆动。
更多推荐


所有评论(0)