最终项目:会避障的机器人
路线里学的东西在这里汇合:一个负责测量的传感器,一个负责判断的微控制器,一个提供动力的驱动,还有两个电机。先在屏幕上看它怎么跑,再动手做一个真的。
在 Lab 01 里看它运行
Lab 01 搭建并测试的是同一类机器人。注意:它用的是 L298N,而不是 TB6612FNG,引脚也不同(TRIG 在 D9,ECHO 在 D10),所以它的代码和下面这份不一样。
打开 Lab 01你需要什么
不列价格,因为每家店、每个国家都不一样。很多“2 轮机器人”套件已经带了底盘、电机、车轮和电池盒。
| 数量 | 零件 | 用途 |
|---|---|---|
| 1 | Arduino Uno(或兼容板)和 USB 线 | 大脑:运行代码。 |
| 1 | TB6612FNG 驱动(或 L298N) | 给电机提供动力。 |
| 2 | 带车轮的 TT 减速电机 | 让机器人动起来,每侧一个。 |
| 1 | 万向轮 | 支撑后部。 |
| 1 | 亚克力底盘 | 所有东西都装在上面。 |
| 1 | HC-SR04 传感器 | 测量到前方物体的距离。 |
| 1 | 带开关的 4 节 AA 电池盒(6 V) | 只给电机供电。 |
| 1 | USB 充电宝 | 给 Arduino 供电,和电机分开。 |
| 1 | 迷你面包板和杜邦线 | 不用焊接就能连接。 |
接线
| 从 | 到 | 原因 |
|---|---|---|
| HC-SR04 VCC / GND | Arduino 5V / GND | 给传感器供电。 |
| HC-SR04 Trig | Arduino 引脚 7 | Arduino 让它开始测量。 |
| HC-SR04 Echo | Arduino 引脚 8 | 传感器返回回波的时间。 |
| TB6612FNG VCC | Arduino 5V | 驱动的逻辑电源。 |
| TB6612FNG VM | 电池盒的 + | 电机的动力电源。 |
| TB6612FNG GND | Arduino 的 GND 和电池盒的 − | 共地:没有它,信号就无法被正确识别。 |
| AIN1, AIN2, PWMA | 引脚 2、4 和 5 | 左电机的方向和速度。 |
| BIN1, BIN2, PWMB | 引脚 10、11 和 6 | 右电机的方向和速度。 |
| STBY | 引脚 12 | 为 HIGH 时,驱动才工作。 |
| AO1 / AO2 和 BO1 / BO2 | 左电机和右电机 | 给每个电机的动力输出。 |
代码
// 避障机器人:Arduino Uno + TB6612FNG + HC-SR04
const int TRIG = 7, ECHO = 8;
const int AIN1 = 2, AIN2 = 4, PWMA = 5; // 左电机
const int BIN1 = 10, BIN2 = 11, PWMB = 6; // 右电机
const int STBY = 12; // 驱动的待机脚
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
int pins[] = {AIN1, AIN2, PWMA, BIN1, BIN2, PWMB, STBY};
for (int p : pins) pinMode(p, OUTPUT);
digitalWrite(STBY, HIGH); // 让驱动退出待机模式
Serial.begin(9600);
}
long distanceCm() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH); // 10 µs 脉冲:“开始测量”
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long us = pulseIn(ECHO, HIGH, 30000); // 最多等回波 30 ms
if (us == 0) return 400; // 没有回波:前方畅通
return us / 58; // µs / 58 = cm
}
// speed 从 -255(后退)到 255(前进)
void motor(int in1, int in2, int pwm, int speed) {
digitalWrite(in1, speed > 0);
digitalWrite(in2, speed < 0);
analogWrite(pwm, abs(speed));
}
void drive(int left, int right) {
motor(AIN1, AIN2, PWMA, left);
motor(BIN1, BIN2, PWMB, right);
}
void loop() {
long d = distanceCm();
Serial.println(d);
if (d < 20) {
drive(-150, -150); // 后退
delay(300);
drive(150, -150); // 原地转向
delay(350);
} else {
drive(180, 180); // 前进
}
delay(50);
}- distanceCm() 做的事和 HC-SR04 那个 Lab 一样:发 10 µs 的脉冲,等回波,再除以 58。
- motor() 用的是驱动里的 H 桥:每个方向一个引脚,速度用 PWM 控制。
- 如果某个电机反转,不用改代码:在驱动上把它的两根线对调就行。
出问题时
- 电机一启动,Arduino 就重启
- 电机和 Arduino 共用了电池。让 Arduino 用 USB 供电,电机用电池盒供电。
- 电机不转
- 检查 STBY 是不是 HIGH,电池盒的开关有没有打开,GND 有没有接在一起。
- 传感器读数总是 0 或 400
- Trig 和 Echo 可能接反了,或者传感器对着软的或倾斜的物体。
- 机器人原地转圈
- 一个电机比另一个快。在 drive() 里把较快那个的速度稍微调低一点。
- 该前进的时候却后退
- 在驱动上把那个电机的两根线对调。
接电池之前,先看一下安全部分。 查看安全和常见故障.