深色模式
第 11 章:看懂舵机代码
本章任务
看懂"控制 SG90 舵机摆动"的 Arduino C++ 代码——和第二册第 11 章是同一个任务。舵机是第一册之后才接触的新模块,从本章开始,实验内容超出教具包范围,代码看懂即可。
接线回顾
| SG90 舵机 | Pico | 说明 |
|---|---|---|
| 红线(VCC) | VBUS(5V) | 5V 供电 |
| 棕线(GND) | GND | 共地 |
| 橙线(信号) | GP15 | PWM 信号 |
供电注意:舵机电流较大,不要接 Pico 的 3V3 引脚,要接 VBUS 5V。
Mind+ 生成的典型代码
cpp
#include <Servo.h> // 引入舵机库(Mind+ 会自动加上这行)
Servo myServo; // 创建一个舵机对象,起名叫 myServo
const int SERVO_PIN = 15; // 舵机信号线接 GP15
void setup() {
myServo.attach(SERVO_PIN); // 把舵机对象绑定到 GP15
}
void loop() {
int angles[] = {0, 90, 180, 90}; // 要依次转到的四个角度
for (int i = 0; i < 4; i++) { // 逐个取出角度
myServo.write(angles[i]); // 命令舵机转到这个角度
delay(500); // 等 0.5 秒,让它转到位
}
}代码讲解
这一章有个重要的新东西:库。
#include <Servo.h>:引入舵机库。相当于 Python 的import——Mind+ 在拖入舵机积木时会自动加上这行,看到它不用慌Servo myServo;:创建一个"舵机对象",相当于给舵机在代码里办了个身份证myServo.attach(15):告诉这个对象"它管的是 GP15 脚"myServo.write(90):直接传角度(0~180),舵机就转过去
为什么 C++ 版这么省事? 回忆第二册:Python 版要自己写 set_angle() 函数,把角度换算成脉宽、再换算成 duty_u16。而 Arduino 的 Servo 库把这些换算全包了——只管说角度。这就是 Arduino 生态的优势:几乎每种常用模块都有现成库。
底层原理并没有变:依然是 50Hz PWM,脉宽 0.5ms ≈ 0°、1.5ms ≈ 90°、2.5ms ≈ 180°。
Servo库只是把这个换算藏起来了。想看原理,翻回第二册第 11 章。
loop() 里的数组 + for 循环,就是第 6 章讲的语法的实战:依次取出 0°、90°、180°、90°,每 0.5 秒换一个。
运行效果
舵机在 0° → 90° → 180° → 90° 之间来回摆动,每 0.5 秒换一个角度——和积木版、Python 版效果一致。
常见坑
- 舵机抖动或不转:多半是供电问题——必须接 VBUS 5V;USB 供电不足时换个 USB 口
- 编译报错 "Servo does not name a type":忘了
#include <Servo.h>(手写代码时容易漏,Mind+ 生成的不会有这个问题) - 角度不准:不同 SG90 有差异,可以用
myServo.writeMicroseconds()直接发脉宽微调 - 咔咔响:角度超出机械极限了,把范围收窄到 10°~170°
想一想
如果把角度数组改成
for (int a = 0; a <= 180; a += 5)这样的循环,舵机的运动会变成什么样?💡 查看答案
舵机不再"跳档",而是每 5° 一格、平滑地从 0° 扫到 180°(配合每格一个小延时),像雷达扫描一样。
结合第 10 章:如果想做"距离小于 20cm 时舵机转 180°,否则转回 0°",代码里要把哪两章的内容拼起来?
💡 查看答案
把第 10 章的
measureDistance()函数和本章的Servo代码拼在一起:setup()里attach舵机,loop()里先测距,再判断:cppvoid loop() { float d = measureDistance(); if (d < 20) { myServo.write(180); } else { myServo.write(0); } delay(200); }myServo.writeMicroseconds(1500)大概会让舵机转到多少度?(提示:看上面"底层原理"那段)💡 查看答案
1500 微秒 = 1.5 毫秒,正好是 0.5ms~2.5ms 的中间值,对应约 90°。
