Electronics Fundamentals
💡 核心思想:机器人的电子系统是其"神经系统"。传感器是感官,控制器是大脑,驱动器是肌肉。理解这三者的协作,才能让机器人真正"活"起来。
机器人需要感知自身状态和外部环境,才能做出正确的动作。传感器是机器人与物理世界的接口。
| 感知类型 | 传感器 | 输出信号 | 典型精度 | 价格参考 |
|---|---|---|---|---|
| 关节角度 | 编码器(磁/光) | 数字脉冲 | 0.01°~0.1° | 5~500元 |
| 姿态/加速度 | IMU(MPU6050/ICM42688) | I²C/SPI | 0.1° | 5~50元 |
| 距离/障碍 | 超声波(HC-SR04) | PWM脉宽 | ±3mm | 3~10元 |
| 距离/精密 | 激光测距(VL53L1X) | I²C | ±1mm | 30~80元 |
| 视觉 | 摄像头(OV2640/CSI) | MIPI/USB | 像素级 | 20~200元 |
| 力/扭矩 | 应变片/力传感器 | 模拟/I²C | 0.1%FS | 50~500元 |
| 足底压力 | FSR压力传感器 | 模拟电阻 | ±5% | 10~30元 |
| 温度 | NTC热敏电阻/DS18B20 | 模拟/单总线 | ±0.5°C | 1~10元 |
IMU是机器人最重要的传感器之一,用于测量姿态、加速度和角速度。
编码器用于测量电机转速和关节角度,是闭环控制的基础。
| 类型 | 原理 | 分辨率 | 优点 | 缺点 |
|---|---|---|---|---|
| 增量式光电编码器 | 光栅遮断计数 | 100~10000线/圈 | 精度高、成本中等 | 断电丢失位置 |
| 绝对式编码器 | 格雷码/磁场 | 12~24位 | 断电不丢位置 | 成本高 |
| 磁编码器(AS5600) | 霍尔效应 | 12位(4096步/圈) | 无接触、耐污染、便宜 | 受磁场干扰 |
| 舵机内置电位器 | 电阻分压 | 8~10位 | 集成方便 | 精度低、寿命有限 |
AS5600是DIY机器人的绝佳选择:12位分辨率(0.088°/步)、I²C接口、只需一块小磁铁、价格约10元。配合无刷电机使用,可以实现高精度位置控制。
| 电机类型 | 控制方式 | 扭矩 | 精度 | 成本 | 适用场景 |
|---|---|---|---|---|---|
| 舵机(标准) | PWM(50Hz) | 小(1~20kg·cm) | 中(±1°) | 低(10~100元) | 小型机器人、教育 |
| 舵机(数字) | PWM(高频) | 中(5~50kg·cm) | 高(±0.1°) | 中(50~500元) | 中型机器人 |
| 步进电机 | 脉冲序列 | 中 | 高(开环) | 低(20~100元) | 机械臂、精密定位 |
| 无刷直流(BLDC) | FOC/方波 | 大 | 高(闭环) | 中(50~500元) | 高性能关节 |
| 伺服电机 | EtherCAT/CAN | 很大 | 极高 | 高(500~5000元) | 工业/高端人形 |
标准舵机通过PWM信号控制角度:
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(9); // 舵机信号线接D9
}
void loop() {
// 扫描 0° → 180°
for (int angle = 0; angle <= 180; angle++) {
myServo.write(angle);
delay(15); // 等待舵机到位
}
// 扫描 180° → 0°
for (int angle = 180; angle >= 0; angle--) {
myServo.write(angle);
delay(15);
}
}
无刷电机是高性能机器人关节的首选,配合FOC(磁场定向控制)可以实现精确的力矩控制。
| 方案 | 特点 | 价格 | 适用Level |
|---|---|---|---|
| ODrive v3.6 | 双轴FOC,CAN/UART,成熟稳定 | ~500元 | Level 3-4 |
| SimpleFOC Shield | 开源,Arduino兼容,单轴 | ~100元 | Level 2-3 |
| 小米CyberGear | 集成电机+驱动+编码器,CAN接口 | ~800元/轴 | Level 4 |
| 宇树科技电机 | 高扭矩密度,专为机器人设计 | ~1500元/轴 | Level 4 |
入门(Level 1):MG996R舵机(约15元/个),扭矩13kg·cm,适合小型双足机器人
进阶(Level 2):DS3218舵机(约50元/个),扭矩20kg·cm,数字舵机精度更高
高级(Level 3):无刷电机+SimpleFOC,扭矩大、效率高、寿命长
专业(Level 4):小米CyberGear或宇树电机,接近商用水平
| 主控板 | 处理器 | 主频 | RAM | 特点 | 价格 | 适用Level |
|---|---|---|---|---|---|---|
| Arduino Uno | ATmega328P | 16MHz | 2KB | 入门经典,生态丰富 | ~30元 | Level 1 |
| Arduino Mega | ATmega2560 | 16MHz | 8KB | 多IO,适合多舵机 | ~50元 | Level 1-2 |
| STM32F103 | Cortex-M3 | 72MHz | 20KB | 性价比高,工业级 | ~20元 | Level 2 |
| STM32F407 | Cortex-M4 | 168MHz | 192KB | 浮点运算,适合控制算法 | ~40元 | Level 2-3 |
| ESP32 | Xtensa LX6 | 240MHz | 520KB | WiFi/BT内置,双核 | ~20元 | Level 2-3 |
| 树莓派4B | Cortex-A72 | 1.8GHz | 4/8GB | Linux,ROS,视觉处理 | ~400元 | Level 3 |
| Jetson Nano | Cortex-A57+GPU | 1.43GHz | 4GB | AI推理,深度学习 | ~800元 | Level 3-4 |
| Jetson Orin NX | Cortex-A78+GPU | 2GHz | 16GB | 高性能AI,具身智能 | ~3000元 | Level 4 |
现代智能手机(骁龙8 Gen3、麒麟9000等)的算力远超树莓派,且集成了摄像头、IMU、WiFi、蓝牙。通过USB OTG或蓝牙,手机可以作为机器人的高级控制器,运行视觉识别、语音交互等AI任务,而底层运动控制交给STM32等实时控制器。这是一种非常有潜力的架构。
复杂机器人通常采用分层控制架构:
| 接口 | 速率 | 距离 | 设备数 | 典型用途 |
|---|---|---|---|---|
| UART/串口 | 115200bps~4Mbps | 短距 | 点对点 | 调试、模块通信 |
| I²C | 100k~3.4Mbps | 短距 | 127个 | 传感器(IMU、编码器) |
| SPI | 1~50Mbps | 短距 | 多个(CS选择) | 高速传感器、显示屏 |
| CAN | 1Mbps | 40m | 110个 | 电机驱动、工业总线 |
| RS485 | 10Mbps | 1200m | 32个 | 舵机总线(Dynamixel) |
| PWM | 50Hz~400Hz | 短距 | 1:1 | 舵机控制 |
| USB | 480Mbps | 5m | 127个 | 调试、摄像头、高速数据 |
| 电池类型 | 标称电压 | 能量密度 | 安全性 | 适用场景 |
|---|---|---|---|---|
| 18650锂电(3S) | 11.1V | 中 | 中 | Level 1-2,成本低 |
| 锂聚合物(LiPo)3S | 11.1V | 高 | 低(需注意) | Level 2-3,轻量化 |
| 锂聚合物(LiPo)4S | 14.8V | 高 | 低 | Level 3,高功率 |
| 磷酸铁锂(LFP) | 12.8V | 低 | 高 | Level 4,安全优先 |
Arduino Mega有15个硬件PWM引脚,可以直接控制15个舵机,加上软件PWM可扩展到更多。
当舵机数量超过Arduino PWM引脚时,使用PCA9685扩展:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 150 // 最小脉宽(0°)
#define SERVOMAX 600 // 最大脉宽(180°)
void setup() {
pwm.begin();
pwm.setPWMFreq(50); // 50Hz,标准舵机频率
}
// 设置舵机角度(0~180°)
void setServoAngle(uint8_t channel, float angle) {
uint16_t pulse = map(angle, 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(channel, 0, pulse);
}
void loop() {
setServoAngle(0, 90); // 舵机0 → 90°
setServoAngle(1, 45); // 舵机1 → 45°
delay(1000);
setServoAngle(0, 0);
setServoAngle(1, 180);
delay(1000);
}
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 舵机抖动 | 电源不稳、PWM干扰 | 独立供电、加滤波电容 |
| MCU复位 | 电源电流不足 | 加大电源容量、加滤波 |
| IMU数据漂移 | 温度变化、振动 | 温度补偿、低通滤波 |
| 电机发热 | 电流过大、堵转 | 限制电流、加散热片 |
| 通信丢包 | 波特率不匹配、接线问题 | 检查波特率、加上拉电阻 |
| 编码器计数错误 | 信号干扰、速度过快 | 屏蔽线、降低采样间隔 |
进入第三章:软件基础,学习运动学、PID控制、步态规划和ROS入门。