Arduino舵机控制实战:从下拉电阻到PWM信号,打造自动挥舞旗帜的庆祝帽

Arduino舵机控制PWM信号
于 2026-06-02 13:24:29 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目概述与核心思路

最近为了庆祝自己的一个小里程碑,我动手做了一个挺有意思的小玩意儿——一个能自动挥舞旗帜的庆祝帽。这帽子本质上是一个可穿戴的互动装置,核心是利用Arduino Uno控制两个微型舵机,让它们像啦啦队队员一样摆动旗帜。这个项目虽然看起来简单,但它麻雀虽小五脏俱全,完整地串联了从硬件选型、电路搭建、代码编写到最终组装调试的整个创客流程。对于刚接触Arduino和舵机的朋友来说,它是一个绝佳的练手项目,既能快速看到成果获得成就感,又能深入理解数字信号控制执行器的基本原理。而对于有经验的朋友,它则提供了一个有趣的载体,可以在此基础上扩展更复杂的互动逻辑或机械结构。

这个项目的核心思路非常清晰:用一个微控制器(Arduino)作为大脑,接收来自物理世界(按钮)的触发信号,然后通过程序逻辑驱动两个执行器(舵机)做出特定的、有表现力的动作(挥舞旗帜)。整个系统的信息流是单向且确定的:输入(按钮)→ 处理(Arduino程序)→ 输出(舵机动作)。理解了这个闭环,就等于掌握了绝大多数互动装置的基本设计范式。我选择用9g微型舵机,主要是考虑到它的尺寸、重量和功耗都非常适合戴在头上,不会给佩戴者带来负担。用竹签和橡皮筋来固定旗帜杆,则是一种快速原型(Rapid Prototyping)的典型思路,强调功能的快速验证而非外观的完美,这在实际的项目开发初期非常实用。

2. 核心元件解析与选型考量

2.1 控制核心:Arduino Uno

在这个项目中,我选择了经典的Arduino Uno R3作为主控板。选择它有几个很实际的理由。首先,它的普及度极高,资料、社区支持和兼容库都非常丰富,遇到任何问题几乎都能找到解决方案。其次,它提供了14个数字I/O口和6个模拟输入口,对于控制两个舵机和一个按钮来说绰绰有余,为后续可能的扩展(比如增加LED灯效或传感器)留出了空间。最重要的是,Uno板载了16MHz的晶振和5V/3.3V稳压输出,能够稳定地为舵机和外围电路供电。

注意:虽然Uno的USB口或DC电源接口可以接入5V-12V的电压,并通过板载稳压芯片输出稳定的5V,但其5V引脚能提供的最大电流约为500mA。两个9g舵机在堵转(卡住)时瞬间电流可能各自达到500-700mA,同时工作对电源是个考验。因此,在项目定型或需要更可靠运行时,强烈建议为舵机单独供电,即使用一个外部的5V/2A以上的电源(如手机充电宝或稳压模块),并将外接电源的地线(GND)与Arduino的GND相连,形成“共地”。

2.2 动力单元:9g微型舵机

舵机(Servo Motor)是这个项目的“肌肉”。我们常用的这种9g舵机属于位置舵机,它的目标不是连续旋转,而是精确地控制输出轴转到指定的角度。其内部结构可以简单理解为一个直流电机+减速齿轮组+电位器+控制电路的组合。控制电路接收来自Arduino的PWM(脉冲宽度调制)信号,这个信号的脉冲宽度(通常介于1ms到2ms之间)对应着一个目标角度。内部的电位器实时反馈当前轴的角度,控制电路会比较目标角度和当前角度,驱动电机正转或反转,直到两者一致,从而实现闭环控制。

我选择9g舵机,首要原因是轻便。一个标准9g舵机重量约9克,两个加起来也不过20克左右,加上Arduino和电池,整个系统的重量可以控制在200克以内,长时间佩戴也不会太累。其次,它的扭矩(通常约1.6kg·cm)足以驱动竹签和小旗子摆动。在采购时,需要注意舵机接口通常是三线的:棕色或黑色(GND),红色(VCC,+5V),橙色或黄色(信号线)。市面上有些廉价舵机可能存在抖动或精度不佳的问题,如果预算允许,可以选择一些口碑较好的品牌。

2.3 交互入口:触发按钮与下拉电阻

交互的起点是一个简单的常开型轻触按钮。我的设计是将按钮通过一根长导线引出,这样佩戴者可以把它藏在手里、口袋里或者绑在手臂上,在需要庆祝的瞬间隐秘地触发,增加了一些趣味性和仪式感。

这里涉及一个关键的数字电路概念:下拉电阻。Arduino的数字引脚在悬空(什么都不接)时,其电平状态是未知的(称为“浮空”),很容易因周围电磁干扰而在HIGH和LOW之间随机跳动,导致误触发。为了解决这个问题,我添加了一个1kΩ的电阻,一端连接按钮信号线到Arduino引脚(本例中为7号引脚),另一端连接至GND。这样,当按钮未被按下时,信号线通过电阻被“拉”到低电平(GND),即稳定的LOW状态;当按钮按下时,3.3V电源直接连接到信号线,由于1kΩ电阻的阻值相对较小,引脚会读取到明确的高电平(HIGH)。这个电阻就被称为下拉电阻。

实操心得:电阻值的选择有讲究。阻值太大(如10MΩ),下拉效果弱,抗干扰能力差;阻值太小(如100Ω),当按钮按下时,从3.3V到GND会形成较大的电流通路(I=V/R=3.3V/100Ω=33mA),虽然对于Arduino的3.3V引脚输出能力(约50mA)来说尚在安全范围内,但会带来不必要的功耗。1kΩ到10kΩ是常用的范围,能在稳定性和功耗间取得良好平衡。本例使用1kΩ,按下时电流约为3.3mA,非常安全。

3. 硬件连接与电路搭建详解

理解了各个元件,接下来就是把它们正确地连接起来。我们可以把电路搭建分为电源、控制和信号三个部分来看。

1. 电源部分

  • Arduino供电:通过USB线连接电脑或移动电源,为Arduino主板本身供电。
  • 舵机供电:如前所述,为了系统稳定,最佳实践是将两个舵机的VCC(红线)和GND(棕线)连接到一块独立的5V电源上(如LM2596等降压模块输出的5V)。如果仅作原型测试,可以暂时将两个舵机的红线和棕线分别连接到Arduino Uno的“5V”和“GND”引脚。但务必注意,不要同时驱动多个大电流设备。
  • 共地:无论采用何种供电方案,所有元件的GND(地线)必须连接在一起,即Arduino的GND、外部电源的GND、按钮下拉电阻的GND需要互联,这是电路正常工作的基础。

2. 控制部分(舵机)

  • 舵机1的信号线(橙线) → Arduino 数字引脚 9
  • 舵机2的信号线(橙线) → Arduino 数字引脚 11
  • 选择9和11引脚是因为在Arduino Uno上,这两个引脚与引脚10一起,支持由硬件定时器产生的、精度更高的PWM波,能提供更平稳的舵机控制。当然,其他支持PWM的引脚(如3, 5, 6)也可用。

3. 信号输入部分(按钮)

  • 按钮的一端 → Arduino 3.3V 输出引脚。
  • 按钮的另一端 → 连接至 1kΩ电阻的一端,同时,这个连接点再引出一根线,连接到 Arduino 数字引脚 7
  • 1kΩ电阻的另一端 → 连接到 GND

为了更直观,以下是整个系统的连接关系表:

元件 引脚/线色 连接至 Arduino/其他 说明
舵机1 信号线(橙) 数字引脚 9 控制舵机1角度
舵机2 信号线(橙) 数字引脚 11 控制舵机2角度
舵机1 & 2 VCC(红) 外部5V电源正极 (或 Arduino 5V) 建议外接电源
舵机1 & 2 GND(棕) 外部5V电源负极 (和 Arduino GND) 必须共地
轻触按钮 引脚1 3.3V 引脚 提供上拉电压
轻触按钮 引脚2 数字引脚 7 1kΩ电阻一端 信号读取点
1kΩ电阻 另一端 GND 下拉电阻,稳定引脚7电平

在面包板上搭建好电路并测试无误后,就可以考虑将元件固定到帽子上了。我用热熔胶进行固定,因为它操作快捷,粘合力对于这种轻量级项目足够,而且以后想要拆除修改也不会太困难。将Arduino贴在帽子后侧,舵机贴在帽檐前方两侧,导线可以简单地用胶带或热熔胶沿着帽身固定。如果想做得更精致,确实可以像原项目作者说的,把导线缝进帽子的衬布里。

4. 软件编程与动画逻辑实现

硬件是身体,软件是灵魂。让旗帜舞动起来的核心,在于Arduino上运行的程序。我们使用Arduino IDE进行编程,它会将我们写的代码(Sketch)编译并上传到Uno板中。

4.1 基础框架与库的使用

Arduino编程离不开两个基本函数:setup()loop()setup()在设备上电或复位后只运行一次,用于初始化设置;loop()则会随后不断地循环执行,是程序的主逻辑所在。

控制舵机,我们可以直接使用Arduino内置的 Servo 库,它封装了生成标准PWM信号的所有复杂操作,让我们可以用简单的write(角度)命令来控制舵机。

CPP
# include <Servo.h> // 引入舵机库
 
// 创建两个舵机对象
Servo servoLeft;
Servo servoRight;
 
// 定义引脚常量,方便后续修改
const int BUTTON_PIN = 7;
const int SERVO_LEFT_PIN = 9;
const int SERVO_RIGHT_PIN = 11;
 
// 定义动画类型枚举,让代码更易读
enum AnimationType { SWING, REVERSE_SWING, RANDOM_MOVE };
 
void setup() {
// 初始化串口通信,用于调试输出信息
Serial.begin(9600);
 
// 将按钮引脚设置为输入模式
pinMode(BUTTON_PIN, INPUT);
 
// 将舵机对象关联到对应的控制引脚
servoLeft.attach(SERVO_LEFT_PIN);
servoRight.attach(SERVO_RIGHT_PIN);
 
// 初始位置:让两个舵机都回到90度(中间位置)
servoLeft.write(90);
servoRight.write(90);
 
Serial.println("Celebration Hat Ready!");
}

4.2 按钮检测与防抖动处理

loop()函数中,我们需要持续检测按钮是否被按下。但机械按钮在闭合和断开的瞬间,金属触点可能会发生弹跳,导致在几毫秒内产生一连串不稳定的通断信号,程序可能会误判为多次按下。因此,必须进行软件防抖动

CPP
void loop() {
// 读取按钮当前状态
int buttonState = digitalRead(BUTTON_PIN);
 
// 检测按钮是否被按下(变为HIGH)
if (buttonState == HIGH) {
// 发现按下信号后,先等待一小段时间(比如50ms)避开抖动期
delay(50);
// 再次读取,确认按钮是否仍然处于按下状态
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == HIGH) {
// 确认是一次有效的按下
Serial.println("Button Pressed! Triggering Animation.");
triggerRandomAnimation(); // 触发随机动画函数
// 等待按钮释放,避免在长按时连续触发
while(digitalRead(BUTTON_PIN) == HIGH) {
delay(10);
}
Serial.println("Button Released. Ready for next.");
}
}
// 这里可以添加其他非阻塞的任务,比如呼吸灯效果等
}

4.3 动画函数的设计与实现

动画的本质是让舵机在一段时间内,平滑地从一个角度运动到另一个角度。我们可以通过for循环逐步改变write()的值来实现。

1. 同步摆动动画: 这是最基础的动画,两个舵机像镜子一样同步左右摆动。

CPP
void playSwingAnimation() {
Serial.println("Playing: Swing Animation");
int centerAngle = 90;
int range = 60; // 摆动幅度为±60度
int stepDelay = 15; // 每步延迟毫秒数,控制速度
 
// 从左摆到右
for (int angle = centerAngle - range; angle <= centerAngle + range; angle += 2) {
servoLeft.write(angle);
servoRight.write(angle);
delay(stepDelay);
}
// 从右摆回左
for (int angle = centerAngle + range; angle >= centerAngle - range; angle -= 2) {
servoLeft.write(angle);
servoRight.write(angle);
delay(stepDelay);
}
// 回到中心
servoLeft.write(centerAngle);
servoRight.write(centerAngle);
}

2. 异步摆动动画: 两个舵机交替摆动,像鼓掌一样,视觉上更富有动感。

CPP
void playReverseSwingAnimation() {
Serial.println("Playing: Reverse Swing Animation");
int centerAngle = 90;
int range = 60;
int stepDelay = 15;
 
// 舵机1从左向右,舵机2从右向左
for (int i = 0; i <= range; i += 2) {
servoLeft.write(centerAngle - range + i);
servoRight.write(centerAngle + range - i);
delay(stepDelay);
}
// 反向运动
for (int i = 0; i <= range; i += 2) {
servoLeft.write(centerAngle + range - i);
servoRight.write(centerAngle - range + i);
delay(stepDelay);
}
// 回到中心
servoLeft.write(centerAngle);
servoRight.write(centerAngle);
}

3. 随机摆动动画: 让两个舵机在限定范围内随机运动,产生一种兴奋、无序的庆祝效果。这里使用random()函数生成随机角度和目标,并用millis()进行非阻塞的时间控制,使得舵机可以独立、平滑地移动。

CPP
void playRandomAnimation(int durationMs) {
Serial.println("Playing: Random Animation");
unsigned long startTime = millis();
int centerAngle = 90;
int range = 50; // 随机运动范围稍小,避免过度扭转
 
// 为每个舵机设置独立的初始目标
int targetLeft = random(centerAngle - range, centerAngle + range);
int targetRight = random(centerAngle - range, centerAngle + range);
 
while (millis() - startTime < durationMs) {
// 平滑移动舵机1至其目标角度
smoothMoveTo(servoLeft, targetLeft, 5);
// 如果到达目标,则设置一个新的随机目标
if (servoLeft.read() == targetLeft) {
targetLeft = random(centerAngle - range, centerAngle + range);
}
 
// 平滑移动舵机2至其目标角度
smoothMoveTo(servoRight, targetRight, 5);
if (servoRight.read() == targetRight) {
targetRight = random(centerAngle - range, centerAngle + range);
}
 
delay(10); // 主循环短暂延迟
}
// 动画结束后回归中心
smoothMoveTo(servoLeft, centerAngle, 10);
smoothMoveTo(servoRight, centerAngle, 10);
}
 
// 一个辅助函数,让舵机平滑地移动到指定角度
void smoothMoveTo(Servo &servo, int targetAngle, int step) {
int currentAngle = servo.read();
if (currentAngle < targetAngle) {
servo.write(min(currentAngle + step, targetAngle));
} else if (currentAngle > targetAngle) {
servo.write(max(currentAngle - step, targetAngle));
}
}

最后,我们需要一个函数来随机选择并执行上述动画,并在动画结束后重置舵机到中心位置。

CPP
void triggerRandomAnimation() {
// 随机生成0-2的数字,对应三种动画
int animSelect = random(0, 3);
 
switch (animSelect) {
case 0:
playSwingAnimation();
break;
case 1:
playReverseSwingAnimation();
break;
case 2:
playRandomAnimation(3000); // 随机动画持续3秒
break;
}
// 无论播放哪种动画,最后都确保回到中心
servoLeft.write(90);
servoRight.write(90);
delay(500); // 给舵机一点时间回位
}

将以上所有代码段整合到一个.ino文件中,通过Arduino IDE上传到板子,硬件部分也正确连接后,按下按钮,你应该就能看到旗帜开始欢快地舞动了。

5. 机械结构组装与优化技巧

电路和代码是项目的内在,而如何将它们稳固、美观地集成到一顶帽子上,则是让项目从“实验台作品”变为“可穿戴设备”的关键。

1. 舵机安装与旗帜杆连接: 我使用的9g舵机附带多种舵盘(舵臂)。对于这个项目,单臂舵盘比十字舵盘更合适,因为它更薄,转动时不会从帽子底部凸出太多。用附送的小螺丝将单臂舵盘固定到舵机输出轴上。接下来是旗帜杆,竹签是个好选择,它轻、直、易获得。用橡皮筋将竹签绑在舵盘上,这是一个巧妙的临时固定方法:它提供了足够的摩擦力来传递扭矩,又具有一定的缓冲作用(“amortization”),当程序出错或舵机运动受阻时,橡皮筋可以打滑,避免舵机齿轮因堵转而损坏。如果项目需要长期使用,可以用热熔胶或AB胶将竹签与舵盘粘牢。

2. 旗帜制作: 旗帜的材质要轻,太重的布或纸会增加舵机负载。我用的是自己频道的贴纸,背对背粘合,把竹签顶端夹在中间。你也可以用彩色卡纸、薄布料甚至3D打印来制作旗帜。形状可以是矩形、三角旗,甚至是你喜欢的球队Logo。用双面胶或胶水固定即可。

3. 元件布局与走线

  • Arduino:放置在帽子后部(后脑勺位置),这里是相对平坦且不影响视觉的区域。可以用一个小的魔术贴扎带或直接缝制一个口袋来固定它,方便取放。
  • 舵机:对称地粘在帽檐前方左右两侧。注意调整舵机的初始角度,确保在90度位置时,旗帜杆是竖直向上的。
  • 电池:如果使用外部电池(强烈推荐),可以放在帽子后部与Arduino一起,或者放在口袋里通过导线连接。
  • 按钮:通过一根长约50-100cm的细导线引出,末端按钮可以藏于袖口或握在手心。
  • 导线管理:用热熔胶点焊或针线将导线沿帽缝固定,避免杂乱。对于想做得更隐蔽的,可以小心地拆开帽子内衬的缝线,将导线埋进去后再缝好。

4. 电源方案优化: 这是提升项目稳定性的最重要一环。持续舞动旗帜耗电不小。最佳方案是使用一块小型的3.7V锂电池(如常见的14500或18650电池)配合一个微型5V升压稳压模块(如MT3608),输出5V给舵机和Arduino供电。可以将电池和模块集成在一个小盒子里,同样固定在帽子后部。这样整个系统就完全无线化了,活动范围更大。

6. 调试、问题排查与进阶玩法

即使按照步骤操作,也可能会遇到一些小问题。这里汇总一些常见情况及排查思路。

现象 可能原因 排查与解决方法
舵机完全不动 1. 电源未接通或电压不足。
2. 信号线接错引脚或接触不良。
3. 代码中舵机对象未正确关联引脚(attach)。
1. 检查所有VCC和GND连接,用万用表测量舵机供电电压是否在4.8V-6V之间。
2. 确认信号线接在了代码中指定的数字引脚(如9,11)。
3. 检查setup()函数中是否执行了servo.attach(pin)
舵机抖动或发出异响 1. 电源功率不足,导致电压被拉低。
2. 机械结构卡死,舵机堵转。
3. PWM信号不稳定或干扰。
1. 立即断开电源,这是最常见原因。改用外接5V/2A以上电源单独给舵机供电。
2. 用手轻轻转动旗帜杆,检查是否有阻碍。确保橡皮筋不是绑得太死。
3. 尝试在舵机VCC和GND引脚间并联一个100μF以上的电解电容,以平滑电源波动。
按钮触发不灵敏或连发 1. 未使用下拉电阻,引脚浮空。
2. 软件防抖动代码逻辑有误或延时不足。
3. 按钮本身接触不良。
1. 确认10kΩ下拉电阻已正确连接在信号引脚和GND之间。
2. 增加防抖动延时时间(如delay(50))。
3. 更换一个按钮或用万用表通断档测试按钮好坏。
动画运行不流畅 1. loop()中使用了delay()导致其他任务被阻塞。
2. 舵机运动步进角度太大或延时太短。
1. 对于复杂项目,可以考虑使用非阻塞定时(如millis())重构代码。
2. 调整动画函数中的stepDelay参数和步进角度,找到速度和流畅度的平衡点。
Arduino上传代码失败 1. 串口选择错误。
2. 驱动未安装(仅限某些克隆板)。
3. 板子型号选错。
1. 在IDE的“工具”->“端口”菜单中,选择正确的COM口(拔插USB线观察哪个端口出现/消失)。
2. 如果是CH340芯片的克隆板,需要安装对应驱动。
3. 在“工具”->“开发板”中,确保选择的是“Arduino Uno”。

当基础功能实现后,你可以尝试很多有趣的扩展:

  • 增加传感器:用声音传感器(如KY-037)替代按钮,检测到掌声或欢呼声自动触发动画。或者用倾斜开关,摇头时触发。
  • 添加光效:在帽子周围集成一圈WS2812B可编程LED灯带,让舵机舞动时,灯光也随着音乐或动作模式变化。
  • 无线控制:加入蓝牙模块(如HC-05)或Wi-Fi模块(如ESP-01S),用手机App自定义动画序列或触发模式。
  • 结构升级:用3D打印设计更精致的舵机外壳和旗帜连接件,替换竹签和橡皮筋,让作品更坚固、美观。

这个庆祝帽项目就像一把钥匙,它为你打开了用代码控制物理世界、制作个性化互动装置的大门。从理解一个下拉电阻的作用,到调试一个不听话的舵机,再到最终看到自己编写的指令让旗帜按设想舞动起来,这个过程充满了探索和解决问题的乐趣。它不仅仅是一个帽子,更是一个可触摸、可运行的程序,一个属于你自己的小小庆典。

ESP32使用PWM实现对舵机控制
本文介绍了舵机的工作原理,包括其与脉宽调制(PWM)的关系,以及如何通过PWM舵机进行角度控制。详细阐述了ESP32上的LEDC库如何设置频率、分辨率,并通过ledcWrite函数调整占空比来控制舵机转动。示例代码展示了如何使用Arduino IDE配置ESP32控制180度舵机的完整过程。
16797
arduino学习笔记5 舵机控制
本文介绍如何使用Arduino控制舵机的基本原理及实现方法。舵机作为位置伺服驱动器,广泛应用于角度变化控制系统。文章详细讲解了舵机的工作原理,并提供了Arduino控制舵机的代码示例。
zhangjiali12011
26785
Arduino舵机控制
本文介绍如何使用Arduino控制舵机,包括通过产生PWM信号手动控制及使用Arduino内置Servo库两种方法。
Tertiary_grass
11635
Arduino控制舵机详解(含代码)
本文详细介绍了如何使用Arduino控制舵机的基本原理,包括硬件电路连接、软件控制代码实现以及不同项目的实战应用,如舵机的来回转动、光强控制舵机和通过串口远程操控。还涵盖了关键函数的解析。
算法小狂人
88741
舵机驱动代码及舵机控制原理(详解)
舵机是一种伺服电机,通过PWM信号控制角度定位。文章详细介绍了舵机的工作原理,包括其3条导线的功能以及通过PWM信号改变角度的方式。同时,提供了不同平台如STM32、51单片机和Arduino舵机控制代码示例,展示了如何通过编程实现对舵机的精确控制
小小_扫地僧
42824
Arduino基础入门篇28—舵机控制
本文介绍了舵机的结构、工作原理、外部接线等知识,通过Arduino官方驱动库实现舵机控制。详细说明了实验材料、步骤,包括搭建电路、拷贝代码、下载程序等,还介绍了Servo库常用函数,如Attach、Write、Read等。
TonyIOT
50078
在ROS下的Arduino舵机机械臂控制
本文介绍了如何利用ROS与Arduino进行通信,通过Solidworks导出URDF模型,并详细讲述了Moveit的配置与使用,展示了如何通过关节状态控制机械臂运动,包括串口通信与PWM信号的处理。
帕里亚
6237
【STM32】舵机控制——PWM输出、定时器输出比较功能
本文深入解析了舵机的工作原理及STM32通过PWM控制舵机的方法。介绍了舵机作为位置伺服驱动器的应用场景,详细阐述了PWM/脉冲宽度调制的原理及其与舵机转动的关系。并通过实例演示了STM32定时器输出PWM信号控制舵机从0°到180°的全过程。
硬芯映翌
6597
arduino 舵机控制基础篇
本文介绍了舵机的工作原理,其角度变化通过调节PWM信号的占空比实现。讲解了舵机的三根线连接方式,以及使用Arduino Uno R3如何通过程序控制舵机从0°到180°,再到0°的转动过程。
八级残废
5022
Arduino控制PWM舵机的总结
本文介绍使用Arduino开发六自由度舵机机械臂的过程,包括ArduinoIDE安装、LED与蜂鸣器控制、串口通信及舵机控制等内容。
帕里亚
8368
使用Blinker通过Arduino控制9g舵机开关窗
本文介绍如何使用Blinker软件通过Arduino板(esp8266)控制9g舵机实现窗户的开关操作。项目涵盖硬件准备、连接、Arduino程序编写与调试,实现手机远程控制
物联181的马鑫
6541
利用arduino 控制舵机转动
本文介绍了如何使用Arduino 2560板控制舵机转动。通过连接杜邦线,将舵机的灰色线接GND,中间线接5V,信号线接PWM接口。在代码中,利用Servo库的attach()函数,通过串口接收指令控制舵机在0到180度间移动,并实现了正向、反向旋转、停在中间位置及退出等功能。
dc_nic
18900
Arduino控制16路PWM舵机驱动板(PCA9685)
这篇博客介绍了如何利用Arduino配合16路PWM舵机驱动板PCA9685进行舵机控制。博主通过串口设定舵机角度,简化了16个舵机的管理过程,详细讲解了使用I2C通信接口的12位精度PWM驱动板的工作原理。
weixin_30826761
7352
通过Arduino生成可调PWM信号驱动舵机:操作指南
本文详细讲解如何使用Arduino生成符合50Hz周期的PWM信号精确控制舵机角度,涵盖工作原理、硬件接线规范、电源管理及Servo库的应用。强调避免常见错误如共地缺失和电流过载,并提供代码实例与实际应用案例,帮助开发者实现稳定可靠的舵机控制
小鹿嘻嘻
1063
Arduino控制舵机转动快速理解PWM信号结构
本文详解Arduino如何通过PWM信号精确控制舵机,剖析20ms周期与脉宽的关系,揭示Servo库背后的定时器中断机制,并指出手动模拟PWM的三大缺陷。强调电源设计、共地连接及使用PCA9685扩展多舵机的重要性,帮助开发者从调用API上升到系统级调试能力。
爱你不会累
1046
【学习笔记】——16路PWM舵机驱动板(PCA 9685) + Arduino
本文围绕16路12位PWM信号发生器PCA 9685展开,介绍其可节省主机资源,用2个引脚通过I2C驱动16个舵机。还给出单个舵机例程,讲解主要参数、引脚定义、接线图等。同时涉及基础知识如字节定义,以及进阶学习的库函数使用,如setPWMFreq调节PWM频率。
云敬山
77696
Arduino控制舵机转动图解说明PWM工作原理
本文深入解析Arduino如何通过PWM信号精确控制舵机角度,阐明PWM舵机中作为指令而非调压手段的工作机制。详细剖析SG90内部闭环系统、信号时序要求及常见问题如抖动、不到位、系统重启的根本原因,并提供电源设计、脉宽优化和多舵机协调等实用解决方案。
在新宿痛饮
1134
使用arduino控制多个PCA968516路舵机控制板从而达到最多可以控制992个伺服舵机
本教程介绍如何利用Arduino及PCA9685 PWM驱动器连接最多992个伺服器。通过I2C接口,仅用两个引脚即可实现对多个舵机驱动板的控制。文中详细解释了硬件连接方式、舵机控制板的地址设定以及Arduino编程方法。
大家好我是科林
12633
ESP32+Arduino IDE+PWM呼吸灯/舵机
本文介绍了PWM在单片机中的应用,包括基本原理、频率、周期和占空比等概念。以呼吸灯和舵机为例,阐述了PWM的实际应用。在呼吸灯部分,说明了原理、给出代码并指出Arduino 3.0.0以上版本的注意点;在舵机部分,介绍了sg90舵机的使用和控制原理。
AAA五金机电
2297
蓝桥杯STM32 G431 hal库开发速成——按键+PWM综合案例——按键控制PWM驱动舵机
本文介绍了PWM概念、原理、在STM32中的应用,如TIM3的配置和HAL函数,以及如何通过PWM控制SG90舵机,包括接线、代码实现和常见问题解决。,
Comedy_宁
3792