Skip to content

第 11 章:看懂舵机代码

本章任务

看懂"控制 SG90 舵机摆动"的 Arduino C++ 代码——和第二册第 11 章是同一个任务。舵机是第一册之后才接触的新模块,从本章开始,实验内容超出教具包范围,代码看懂即可。

接线回顾

SG90 舵机Pico说明
红线(VCC)VBUS(5V)5V 供电
棕线(GND)GND共地
橙线(信号)GP15PWM 信号

供电注意:舵机电流较大,不要接 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°

想一想

  1. 如果把角度数组改成 for (int a = 0; a <= 180; a += 5) 这样的循环,舵机的运动会变成什么样?

    💡 查看答案

    舵机不再"跳档",而是每 5° 一格、平滑地从 0° 扫到 180°(配合每格一个小延时),像雷达扫描一样。

  2. 结合第 10 章:如果想做"距离小于 20cm 时舵机转 180°,否则转回 0°",代码里要把哪两章的内容拼起来?

    💡 查看答案

    把第 10 章的 measureDistance() 函数和本章的 Servo 代码拼在一起:setup()attach 舵机,loop() 里先测距,再判断:

    cpp
    void loop() {
      float d = measureDistance();
      if (d < 20) {
        myServo.write(180);
      } else {
        myServo.write(0);
      }
      delay(200);
    }
  3. myServo.writeMicroseconds(1500) 大概会让舵机转到多少度?(提示:看上面"底层原理"那段)

    💡 查看答案

    1500 微秒 = 1.5 毫秒,正好是 0.5ms~2.5ms 的中间值,对应约 90°

不积跬步,无以至千里;万里之行,始于当下。