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 А).
Шаг 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: Итоговый результат
На видео ниже процесс по созданию данного урока и итоговый результат.
Спасибо, что прошли этот урок с нами до конца! Желаем вам отличных проектов и до встречи в ближайших уроках.