Перейти к содержимому
robotips

Финальный проект: робот, который объезжает препятствия

Здесь сходится всё, что было на маршруте: датчик, который измеряет, микроконтроллер, который решает, драйвер, который подаёт мощность, и два мотора. Сначала посмотрите, как он работает на экране, а потом соберите настоящего.

Посмотрите, как он работает, в Lab 01

В Lab 01 собирают и проверяют такого же робота. Обратите внимание: там используется L298N вместо TB6612FNG и другие пины (TRIG на D9, ECHO на D10), поэтому его код не совпадает с кодом ниже.

Открыть Lab 01

Что вам понадобится

Без цен: они зависят от магазина и страны. Во многих наборах «робот на 2 колёсах» уже есть шасси, моторы, колёса и держатель для батареек.

Кол-воДетальЗачем
1Arduino Uno (или совместимая плата) с USB-кабелемМозг: запускает код.
1Драйвер TB6612FNG (или L298N)Подаёт мощность на моторы.
2Моторы-редукторы TT с колёсамиДвигают робота, по одному с каждой стороны.
1Опорный роликПоддерживает заднюю часть.
1Акриловое шассиОснова, на которой всё крепится.
1Датчик HC-SR04Измеряет расстояние до того, что впереди.
1Держатель на 4 батарейки AA (6 V) с выключателемПитает только моторы.
1USB power bankПитает Arduino отдельно от моторов.
1Мини-макетная плата и провода dupontЧтобы соединять без пайки.

Подключение

ОткудаКудаЗачем
HC-SR04 VCC / GNDArduino 5V / GNDПитание датчика.
HC-SR04 TrigArduino пин 7Arduino просит датчик измерить.
HC-SR04 EchoArduino пин 8Датчик возвращает время эха.
TB6612FNG VCCArduino 5VПитание логики драйвера.
TB6612FNG VM+ держателя батареекМощность для моторов.
TB6612FNG GNDGND Arduino и − держателя батареекОбщая земля: без неё сигналы не распознаются.
AIN1, AIN2, PWMAПины 2, 4 и 5Направление и скорость левого мотора.
BIN1, BIN2, PWMBПины 10, 11 и 6Направление и скорость правого мотора.
STBYПин 12При HIGH драйвер работает.
AO1 / AO2 и BO1 / BO2Левый и правый моторВыход мощности на каждый мотор.

Код

Скетч для робота (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: импульс 10 µs, ждёт эхо и делит на 58.
  • motor() использует H-мост драйвера: один пин на каждое направление и PWM для скорости.
  • Если мотор вращается в обратную сторону, не меняйте код: поменяйте местами два его провода на драйвере.

Если что-то не работает

Arduino перезагружается, когда запускаются моторы
Моторы и Arduino питаются от одних и тех же батареек. Питайте Arduino по USB, а моторы от держателя батареек.
Моторы не двигаются
Проверьте, что STBY в состоянии HIGH, выключатель держателя батареек включён, а земли соединены.
Датчик всегда показывает 0 или 400
Возможно, Trig и Echo перепутаны, или датчик смотрит на мягкий или наклонный предмет.
Робот ездит по кругу
Один мотор быстрее другого. Немного снизьте скорость более быстрого в drive().
Едет назад, когда должен ехать вперёд
Поменяйте местами два провода этого мотора на драйвере.

Прежде чем подключать батарейки, прочитайте раздел о безопасности. Безопасность и частые неисправности.