Управление двигателями робота на основе микроконтроллера Arduino

Arduino - отличная платформа для робототехники. Микроконтроллер предлагает множество входов, выходов и легко разработать код для работы с ними.

Этот урок является первым из серии «Роботы Arduino» и мы начнем с движения робота - путем управления двумя двигателями постоянного тока. Спасибо за данный урок нашим друзьям из проекта darkbluebit.com.

Шаг 1: Список комплектующих

Нам понадобятся для создания первого робота некоторые комплектующие.

- Комплект-шасси для создания робота (на фото выше) - можно купить отдельными деталями или в наборе
- Драйвер-мост двигателя H-Bridge TB6612FNG
- 4x - Диод 1N4001
- 4x - 1,5 В AA батарея
- 1x - 9 В батарея
- Макет и провода

Шаг 2: Шасси

Есть много шасси для роботов, мы купили на Amazon.com комплект шасси для автомобиля Smart Robot от Ardokit, потому что это очень простой и довольно дешевый вариант. Он поставляется с двумя колесами, управляемыми двумя двигателями постоянного тока (3 - 6 В).

Он предлагает много места на борту для будущих аксессуаров, таких как датчики, беспроводные модули, камеры или дополнительные батареи. В нашем случае мы использовали его для макета.

Шаг 3: H-мост (H-Bridge)

Arduino может обеспечить только очень ограниченный ток непосредственно от выходных контактов - около 20 - 40 мА. Этого достаточно для светодиода, но нам нужен еще один способ питания двигателей.

Контроллер H-Bridge (H-мост) - это схема, используемая для управления скоростью и направлением двигателя. В этом случае нам нужен двойной H-мост (H-Bridge) для управления двумя из них. В цепи используется внешнее питание для обеспечения тока для двигателей. Батарейный блок 4x AA (держатель, входящий в комплект корпуса) предназначен только для этой цели - таким образом, источник питания Arduino (батарея 9 В) можно разделить для защиты нашей платы.

Мы выбрали MOSFET на основе TB6612FNG от Pololu, вы также можете купить почти то же самое от SparkFun (с другим цветом и распиновкой). Эти H-мосты способны управлять двигателями в диапазоне от 4,5 В до 13,5 В и обеспечивать непрерывный ток 1 А (с пиками 3 А).

Распиновка Pololu TB6612FNG и SparkFun TB6612FNG
Распиновка Pololu TB6612FNG и SparkFun TB6612FNG

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

[caption id="attachment_20045801" align="alignnone" width="461"]Структура H-моста (красным) Структура H-моста (красным)[/caption]

Шаг 4: Обратное подавление EMF

Двигатели постоянного тока, используемые для робота, подчиняются основному закону физики - они сохраняют энергию при включении, и они будут генерировать заднюю электромоторную силу (обратную ЭДС) при внезапном отключении электропитания. Обратное пиковое напряжение может привести к повреждению нашей цепи.

Мы можем подавить это поведение, подключив диод как на схеме ниже:

В нашем случае нам нужно вращаться в обоих направлениях, поэтому для каждого двигателя требуются четыре диода 1N4001. Диоды имеют разную полярность с каждой стороны - обратите внимание на белую полосу диода.

Шаг 5: Цепь

Наше финальное подключение можно посмотреть на схеме ниже:

Шаг 6: Код

Номера выводов в приведенном ниже коде соответствуют схеме с SparkFun H-Bridge (см.выше), номера контактов в видео на последнем шаге отличаются друг от друга, поскольку там использовался Pololu H-Bridge.

// Left motor
const int pinAIN1 = 5; //Direction
const int pinAIN2 = 4; //Direction
const int pinPWMA = 3; //Speed

// Right motor
const int pinBIN1 = 7;  //Direction
const int pinBIN2 = 8; //Direction
const int pinPWMB = 9;  //Speed

//H-Bridge Standby
const int pinSTBY = 6;

boolean leftMotor = 1;
boolean rightMotor = 0;

void setup() {
  pinMode(pinPWMA, OUTPUT);
  pinMode(pinAIN1, OUTPUT);
  pinMode(pinAIN2, OUTPUT);
  pinMode(pinPWMB, OUTPUT);
  pinMode(pinBIN1, OUTPUT);
  pinMode(pinBIN2, OUTPUT);
  pinMode(pinSTBY, OUTPUT);
}

void loop() {
  // acceleration 
  for (int i = 0; i <= 255; i += 5) {
    motorDrive(leftMotor, 1, i);
    motorDrive(rightMotor, 1, i);
    delay(50);
  }
  delay(1700);

  // turn right
  motorStop(rightMotor);
  delay(1500);

  // go ahead
  motorDrive(rightMotor, 1, 255);
  delay(1000);

  // stop
  motorStop(leftMotor);
  motorStop(rightMotor);
  delay(300);  

  // turn around in place
  motorDrive(leftMotor, 0, 255);
  motorDrive(rightMotor, 1, 255);
  delay(3600);

  // stop
  motorStop(leftMotor);
  motorStop(rightMotor);
  delay(300);  

  // turn left in a circle
  motorDrive(leftMotor, 1, 180);
  motorDrive(rightMotor, 1, 255);
  delay(4000);

  // slow down
  for (int i = 255; i >= 0; i -= 5) {
    motorDrive(leftMotor, 1, i);
    motorDrive(rightMotor, 1, i);
    delay(55);
  }

  // stop
  motorStop(leftMotor);
  motorStop(rightMotor);
  delay(10000);
}

/*
  Drive a motor:
    - motorNumber: 0 left motor, 1 right motor
    - moveForward: motor direction (0 reverse, 1 forward)
    - motorSpeed: 0 to 255 ---> 0 = stop / 255 = max speed
*/
void motorDrive(boolean motorNumber, boolean moveForward, int motorSpeed) {
  boolean pinIn1;  //Relates to AIN1 or BIN1 (depending on the motor number specified)

  // direction to turn the motor
  //   clockwise: IN1 = HIGH and IN2 = LOW
  //   counter-clockwise: IN1 = LOW and IN2 = HIGH
  if (moveForward)
    pinIn1 = LOW;
  else
    pinIn1 = HIGH;

  // select the motor to turn, set the direction and the speed
  if (motorNumber == leftMotor) {
    digitalWrite(pinAIN1, pinIn1);
    digitalWrite(pinAIN2, !pinIn1);
    analogWrite(pinPWMA, motorSpeed);
  } else {
    digitalWrite(pinBIN1, pinIn1);
    digitalWrite(pinBIN2, !pinIn1);
    analogWrite(pinPWMB, motorSpeed);
  }

  // STBY must be high to enable motors
  digitalWrite(pinSTBY, HIGH);
}

// Stop the specified motor
void motorStop(boolean motorNumber) {
  if (motorNumber == leftMotor) {
    digitalWrite(pinAIN1, LOW);
    digitalWrite(pinAIN2, LOW);
  } else {
    digitalWrite(pinBIN1, LOW);
    digitalWrite(pinBIN2, LOW);
  }
}

Шаг 7: Итоговый результат

На видео ниже процесс по созданию данного урока и итоговый результат.

Спасибо, что прошли этот урок с нами до конца! Желаем вам отличных проектов и до встречи в ближайших уроках.

Ардуино+