跳到正文
robotips

最终项目:会避障的机器人

路线里学的东西在这里汇合:一个负责测量的传感器,一个负责判断的微控制器,一个提供动力的驱动,还有两个电机。先在屏幕上看它怎么跑,再动手做一个真的。

在 Lab 01 里看它运行

Lab 01 搭建并测试的是同一类机器人。注意:它用的是 L298N,而不是 TB6612FNG,引脚也不同(TRIG 在 D9,ECHO 在 D10),所以它的代码和下面这份不一样。

打开 Lab 01

你需要什么

不列价格,因为每家店、每个国家都不一样。很多“2 轮机器人”套件已经带了底盘、电机、车轮和电池盒。

数量零件用途
1Arduino Uno(或兼容板)和 USB 线大脑:运行代码。
1TB6612FNG 驱动(或 L298N)给电机提供动力。
2带车轮的 TT 减速电机让机器人动起来,每侧一个。
1万向轮支撑后部。
1亚克力底盘所有东西都装在上面。
1HC-SR04 传感器测量到前方物体的距离。
1带开关的 4 节 AA 电池盒(6 V)只给电机供电。
1USB 充电宝给 Arduino 供电,和电机分开。
1迷你面包板和杜邦线不用焊接就能连接。

接线

从到原因
HC-SR04 VCC / GNDArduino 5V / GND给传感器供电。
HC-SR04 TrigArduino 引脚 7Arduino 让它开始测量。
HC-SR04 EchoArduino 引脚 8传感器返回回波的时间。
TB6612FNG VCCArduino 5V驱动的逻辑电源。
TB6612FNG VM电池盒的 +电机的动力电源。
TB6612FNG GNDArduino 的 GND 和电池盒的 −共地:没有它,信号就无法被正确识别。
AIN1, AIN2, PWMA引脚 2、4 和 5左电机的方向和速度。
BIN1, BIN2, PWMB引脚 10、11 和 6右电机的方向和速度。
STBY引脚 12为 HIGH 时,驱动才工作。
AO1 / AO2 和 BO1 / BO2左电机和右电机给每个电机的动力输出。

代码

机器人的 sketch(Arduino IDE)
// 避障机器人: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() 里把较快那个的速度稍微调低一点。
该前进的时候却后退
在驱动上把那个电机的两根线对调。

接电池之前,先看一下安全部分。 查看安全和常见故障.