4、Arduino舵机控制:开发环境搭建与Servo库实战
舵机控制,说白了就是让电机转到你想要的精确角度。在阿克曼底盘里,前轮转向全靠它。我最早接触舵机时,以为接上电就能转,结果烧了两个舵机才明白——时序和库的用法才是关键。
这一章,咱们把Arduino环境搭好,把Servo库用熟。你跟着我走一遍,保证能让你手里的舵机指哪打哪。
4.1 Arduino开发环境搭建
先别急着接线。环境没搭好,后面全是坑。
第一步:下载IDE
去Arduino官网下个IDE,选2.x版本。我个人习惯用2.0.4,稳定,不折腾。下载后直接安装,一路默认就行。
第二步:安装驱动
插上你的Arduino板(我用的是Uno R3),电脑会提示安装驱动。如果没自动装,去设备管理器里手动更新驱动。嗯,这里要注意:有些山寨板子需要装CH340驱动,别问我怎么知道的——我曾经在客户现场折腾了半小时才发现是驱动问题。
第三步:选板子和端口
打开IDE,菜单栏选:
- 工具 → 开发板 → Arduino Uno
- 工具 → 端口 → 选你板子对应的COM口(Windows)或/dev/cu.usbmodem(Mac)
选好后,点一下「上传」按钮旁边的对勾图标,编译一个空程序。如果底部显示「编译完成,上传成功」,恭喜你,环境搭好了。
4.2 Servo库的使用
Arduino自带的Servo库,说白了就是帮你生成50Hz的PWM信号。舵机内部有个比较器,根据脉宽决定转多少度。
库的核心函数:
| 函数 | 作用 | 参数说明 |
|---|---|---|
Servo.attach(pin) |
绑定舵机到指定引脚 | pin:数字引脚号(如9、10) |
Servo.write(angle) |
设置舵机角度 | angle:0~180度 |
Servo.read() |
读取当前角度 | 返回int值 |
Servo.detach() |
释放舵机引脚 | 释放后舵机失去控制力 |
你想想看,为什么舵机要接在9、10、11这些引脚上?因为这些引脚支持硬件PWM,精度高。我试过用普通数字引脚模拟PWM,结果舵机抖得像筛糠——后来查手册才发现,Servo库默认用定时器1,而定时器1正好管着这几个引脚。
4.3 舵机角度控制示例
来,写个最简单的程序。让舵机从0度转到180度,再转回来。
#include <Servo.h>
Servo myServo; // 创建一个舵机对象
void setup() {
myServo.attach(9); // 舵机信号线接在D9引脚
Serial.begin(9600);
Serial.println("舵机控制示例启动");
}
void loop() {
// 从0度转到180度,每次增加1度
for (int angle = 0; angle <= 180; angle++) {
myServo.write(angle);
delay(15); // 每步延时15ms,让舵机有时间跟上
}
// 从180度转回0度
for (int angle = 180; angle >= 0; angle--) {
myServo.write(angle);
delay(15);
}
}
上传后,你会看到舵机臂来回摆动。为什么延时15ms?因为舵机内部电机响应需要时间。如果你设成1ms,舵机会跟不上,出现抖动甚至卡死。我在做阿克曼底盘时,转向舵机设了20ms延时,转向更平滑。
- Servo库自动处理PWM,你只需要写角度值
- 角度范围0~180度,但实际舵机可能只有170度行程
- 延时时间根据舵机型号调整,便宜的舵机需要更长延时
4.4 多舵机控制与避坑
阿克曼底盘需要两个舵机?其实一个就够了。但如果你非要控制多个,Servo库支持最多12个舵机对象。
#include <Servo.h>
Servo steeringServo; // 转向舵机
Servo cameraServo; // 摄像头云台舵机
void setup() {
steeringServo.attach(9);
cameraServo.attach(10);
}
void loop() {
steeringServo.write(90); // 转向回正
cameraServo.write(45); // 摄像头朝左
delay(1000);
steeringServo.write(135); // 右转
cameraServo.write(90); // 摄像头回正
delay(1000);
}
避坑指南:
- 我曾经把两个舵机共用一个电源,结果转向时摄像头舵机乱跳。后来给每个舵机单独供电,问题解决。
- 我曾经在loop里频繁调用attach(),导致舵机不断复位。记住:attach()只在setup里调用一次。
- 注意:Servo库会占用定时器,如果你同时用Tone()或PWM输出,可能会冲突。我一般用软串口避开这个问题。
4.5 知识体系梳理
下面这张图,把本章的核心逻辑串起来了。你一看就明白:从环境搭建到库函数,再到实际控制,每一步都是环环相扣的。
说白了,舵机控制就三件事:搭环境、调库、写角度。环境搭好了,库用对了,角度写准了,你的阿克曼底盘就能指哪打哪。我在实际项目中,还遇到过舵机线序接反的问题——信号线和电源线搞混,结果舵机纹丝不动。所以接线前,一定用万用表量一下,确认红线是5V,棕线是GND,橙线是信号。
公众号:蓝海资料掘金营,微信deep3321