Финальный проект: робот, который объезжает препятствия
Здесь сходится всё, что было на маршруте: датчик, который измеряет, микроконтроллер, который решает, драйвер, который подаёт мощность, и два мотора. Сначала посмотрите, как он работает на экране, а потом соберите настоящего.
Посмотрите, как он работает, в 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 power bank | Питает Arduino отдельно от моторов. |
| 1 | Мини-макетная плата и провода dupont | Чтобы соединять без пайки. |
Подключение
| Откуда | Куда | Зачем |
|---|---|---|
| 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 | GND Arduino и − держателя батареек | Общая земля: без неё сигналы не распознаются. |
| 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: импульс 10 µs, ждёт эхо и делит на 58.
- motor() использует H-мост драйвера: один пин на каждое направление и PWM для скорости.
- Если мотор вращается в обратную сторону, не меняйте код: поменяйте местами два его провода на драйвере.
Если что-то не работает
- Arduino перезагружается, когда запускаются моторы
- Моторы и Arduino питаются от одних и тех же батареек. Питайте Arduino по USB, а моторы от держателя батареек.
- Моторы не двигаются
- Проверьте, что STBY в состоянии HIGH, выключатель держателя батареек включён, а земли соединены.
- Датчик всегда показывает 0 или 400
- Возможно, Trig и Echo перепутаны, или датчик смотрит на мягкий или наклонный предмет.
- Робот ездит по кругу
- Один мотор быстрее другого. Немного снизьте скорость более быстрого в drive().
- Едет назад, когда должен ехать вперёд
- Поменяйте местами два провода этого мотора на драйвере.
Прежде чем подключать батарейки, прочитайте раздел о безопасности. Безопасность и частые неисправности.