Здесь рассмотрим варианты подключения двигателей к Arduino с использованием драйверов L293…
Рассмотрим самый простой вариант подключения L293D. Скорость вращения при таком варианте двигателя нерегулируемая, вывод EN1 подключен напрямую к +5V. Питание мотора также берется от стабилизатора установленного на Arduino.
По схеме видим, что Н-мост для управления двигателем реализован на каналах 1 и 2 драйвера. Входы каналов подключены к пинам 7 и 8 Arduino. Таким образом, подавая разные уровни на выходы 7 и 8 Arduino, можно заставить вращаться мотор в разные стороны. Если уровни одинаковые, то мотор будет выключен.
Стоит обратить внимание, что питать таким образом от USB можно только очень слабые нагрузки (в данном случае потребляемый ток моторчика 100mA).
Заставим моторчик вращаться «вправо» 2 секунды, остановиться на 0.5 секунды, вращаться «влево» 3 секунды, остановка 4 секунд и снова цикл повторяется.
int IN1 = 8; //input1 L293 подключен к выводу 8 int IN2 = 7; //input2 L293 подключен к выводу 7 void setup() { pinMode (IN2, OUTPUT); pinMode (IN1, OUTPUT); } void loop() { digitalWrite (IN2, HIGH); //в одну сторону вращение digitalWrite (IN1, LOW); delay(2000); digitalWrite (IN2, LOW); //выключить вращение delay(500); digitalWrite (IN1, HIGH); //в другую сторону delay(3000); digitalWrite (IN1, LOW); //выключить delay(4000); }
Теперь усложним нашу схему, возьмем моторчик помощнее. При использовании такого мотора необходимо использовать внешний источник питания силовой части!
Видим, что на вывод питания Vs драйвера L293 питание подается от внешнего источника. «Земли/минусы» обоих источников питания соединены.
В данном примере вывод EN1 посоединен к выводу ШИМ (9). Задействуется возможность драйвера управлять скоростью, меняя скважность посылаемого ШИМ сигнала. Значения скважности задаются функцией
analogWrite(pin, число);
где число изменяется от 0 до 255, прямо пропорционально скважности сигнала.
int IN1 = 8; //input1 L293 подключен к выводу 8 int IN2 = 7; //input2 L293 подключен к выводу 7 int EN1 = 9; //EN1 - управление скоростью вращения int i; void setup() { pinMode (IN2, OUTPUT); pinMode (IN1, OUTPUT); pinMode (EN1, OUTPUT); } void loop() { digitalWrite (IN2, HIGH); //в одну сторону вращение digitalWrite (IN1, LOW); for (i = 50; i <= 180; i++) { //плавное увеличение скорости analogWrite(EN1, i); delay(30); } analogWrite (EN1, 0); //выключить двигатель delay(500); digitalWrite (IN1, HIGH); //в другую сторону digitalWrite (IN2, LOW); for (i = 50; i <= 180; i++) { //плавное увеличение скорости analogWrite(EN1, i); delay(30); } analogWrite (EN1, 0); //выключить двигатель delay(500); }
В приведенном скетче мотор вращается в обе стороны с плавным нарастанием скорости.
ВНИМАНИЕ! При резком включении двигателей, L293D начинает очень сильно нагреваться по причине того, что при старте сразу на полную мощность, для сдвига с места и раскрутки якоря (грубо говоря вала) мотор потребляет, хоть и кратковременно, но ток минимум в 2-5 раз больше установившегося рабочего тока. При резкой смене направления вращения появляется еще больший скачок тока, так как приходится не только сдвинуть якорь с места, как это было в первом случае, но и побороть противо-ЭДС, создаваемую инерцией еще не остановившегося якоря.
Для снижения этих факторов следует разгонять двигатели плавно, чем дольше, тем лучше, в разумных пределах конечно. Так же при реверсе (изменении направления вращения) следует дать промежуток для самостоятельной остановки двигателя (доли секунды), а затем снова плавно разгонять. Приложив палец к микросхеме драйвера разницу можно почувствовать сразу.
Подключение двух двигателей с плавной регулировкой скорости — теперь уже не такая уж и сложная задача.
Второй двигатель подключен к Н-мосту на каналах 3 и 4 драйвера L293. Входы управления ключами второго Н-моста подключены к пинам 2 и 3 Arduino. Регулировка скорости второго двигателя — пин 6 Arduino с ШИМ.
Скетч, реализующий чередующееся плавное нарастание вращения в одну сторону с изменением направления вращения и нарастанием скорости — в другую с паузой, показан ниже (уже без комментариев):
int IN1 = 8; //input1 подключен к выводу 8 int IN2 = 7; int IN3 = 2; int IN4 = 4; int EN1 = 9; int EN2 = 3; int i; void setup() { pinMode (EN1, OUTPUT); pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (EN2, OUTPUT); pinMode (IN4, OUTPUT); pinMode (IN3, OUTPUT); } void loop() { digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); digitalWrite (IN4, HIGH); digitalWrite (IN3, LOW); for (i = 50; i <= 180; ++i) { analogWrite(EN1, i); analogWrite(EN2, i); delay(30); } analogWrite (EN1, 0); analogWrite (EN2, 0); delay(500); digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); for (i = 50; i <= 180; ++i) { analogWrite(EN1, i); analogWrite(EN2, i); delay(30); } analogWrite (EN1, 0); analogWrite (EN2, 0); delay(4000); }
По материалам курса робототехники