Двигатель постоянного тока, L293D и Arduino
В статье рассмотрен пример управления направлением и скоростью вращения ротора небольшого двигателя постоянного тока с использованием Arduino и чипом для драйвера двигателя L293D.
Для управления скоростью вращения мотора в проекте используется потенциометр. Для изменения направления вращения используется кнопка.
Необходимое оборудование
Для того, чтобы собрать предложенную схему и реализовать поставленную задачу вам понадобятся:
1 небольшой двигатель постоянного тока с напряжением питания около 6 В;

1 чип L293D, который используется в качестве драйвера для двигателя;

1 переменный резистор (потенциометр) сопротивлением 10 кОм;

1 тактовая кнопка;

1 монтажная плата;

1 плата Arduino Uno;

Коннекторы папа-папа;

Основы работы с чипом L293D
Перед тем как подключать Arduino для управления мотором, стоит поэксперрментировать с чипом L293D. Как минимум, это даст вам понимание того, как именно он работает.
В данном случаем мы можем использовать Arduino исключительно для подачи питания 5 В на мотор.

Наша задача – отследить, в какую сторону вращается ротор мотора. Можете слегка зажать вал пальцами, и вы почувствуете направление вращения или прикрепить на вал какую-то метку (например, кусок бумажки). После первой проверки, подключите контакты, которые идут от 5V (питания) и от Gnd (земля) наоборот. После запуска, двигатель должен вращаться в противоположную сторону.
По большому счету, это и является концептом, на основании которого работает чип L293D. Он управляет пинами, позволяя нам менять направление вращения ротора двигателя.
Схема подключения соответствует приведенной на рисунке ниже. Питание мотора все еще обеспечивается от Arduino, но мы можем поэкспериментировать с «управляющими» пинами перед тем как полностью передать управление Arduino.

Три контакта L293D, которые нас интересуют, это: Pin 1 (Enable), Pin 2 (In1) и Pin 7 (In2). Они подключаются к контакту 5V или к контакту GND с использованием фиолетового, желтого и оранжевого коннектора.
Как показано на рисунке выше, мотор должен вращаться в определенном направлении, давайте назовем это направлением A.
Если вы подключите Pin 1 (Enable) к GND, мотор остановится вне зависимости от управляющих пинов In1 и In2. Контакт Enable все включает и выключает. Это очень полезно при использовании ШИМ контактов для управления скоростью мотора. Переподключите Pin 1 к 5V, чтобы двигатель вновь начал вращаться.
Теперь попробуйте переподключить In1 (pin 2, желтый). Вместо 5V подключите его к GND. Оба контакта In1и In2 теперь подключены к GND, так что двигатель опять остановится.
Перемещение In2 от GND к 5V приведет к вращению мотора в противоположном направлении (направление В).
Если вы подключите In1 обратно к 5V и в результате In1 и In2 будут подключены к 5V, мотор опять-таки перестанет двигаться.
Схема подключения Arduino, L293D и потенциометра
После того как мы разобрались с непосредственным управлением двигателя с помощью контактов и микросхемы L293D , можно передавать все управление на плату Arduino. Микроконтроллер в данном случае будет управлять контактами Enable, In1 и In2.
Внимательно соберите схему на основании рисунка, который приведен ниже. Если вы перепутаете контакты, очень вероятно, что работать ничего не будет.

Скетч Arduino
Загрузите скетч, приведенный ниже на Arduino.
/*
Изменение направления и частоты вращения двигателя постоянного тока
с использованием чипа L293D, потенциометра и кнопки-переключателя
*/
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int potPin = 0;
void setup()
{
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
}
void loop()
{
int speed = analogRead(potPin) / 4;
boolean reverse = digitalRead(switchPin);
setMotor(speed, reverse);
}
void setMotor(int speed, boolean reverse)
{
analogWrite(enablePin, speed);
digitalWrite(in1Pin, ! reverse);
digitalWrite(in2Pin, reverse);
}
Пины инициализируются и выставляются их режимы работы в пределах функции 'setup'.
В пределах функции ‘loop’ находится скорость вращения мотора. Скорость определяется с помощью деления аналоговых значений потенциометра на 4.
Мы делим именно на 4, так как аналоговые значения с контакта потенциометра будут в диапазоне между 0 и 1023. А на выход для управления двигателем должны подаваться аналоговые значения в диапазоне между 0 и 255.
Если кнопка нажата, мотор будет двигаться вперед, если не нажата – в противоположном направлении. Значение переменной 'reverse' приравнивается к значению, которое считывается с пина switchPin с кнопкой. Так что если кнопка нажата, значение равно False, в другом случае значение равно True.
Скорость и значения реверса проходят через функцию под названием 'setMotor', которая настраивает соответствующие управляющие сигналы на драйвере, чтобы управлять мотором.
void setMotor(int speed, boolean reverse)
{
analogWrite(enablePin, speed);
digitalWrite(in1Pin, ! reverse);
digitalWrite(in2Pin, reverse);
}
Сначала скорость устанавливается с использованием analogWrite на контакт enable. Контакт enable на драйвере L293 просто включает-выключает мотор в зависимости от настроек пинов in1 и in2 на чипе L293.
Для управления направлением вращения мотора, пины in1 и in2 должны иметь противоположные значения.
Если in1 имеет значение HIGH, а in2 - LOW, мотор будет двигаться в одном направлении, если in1 принимает значение LOW, а in2 – HIGH, мотор начнет вращаться в противоположном направлении.
Символ '!' является управляющей командой, которая соответствует 'не'. Так что первая команда digitalWrite для in1 устанавливает значение в противоположное относительно значения 'reverse'. Если ‘reverse’ принимает значение HIGH, устанавливается LOW и наоборот.
Вторая функция digitalWrite для 'in2' присваивает пину значение 'reverse'. Это значит, что оно всегда будет противоположно значению, которое генерится на Arduino для in1.
Описание чипа L293D
L293D – очень полезный чип. Основное его достоинство – возможность управления двумя двигателями одновременно. В нашем примере мы используем только половину его возможностей для управления один двигателем постоянного тока. Большинство контактов с правой стороны чипа (смотрите рисунок ниже) предназначены для одновременного управления вторым двигателем.

Второй мотор будет подключаться между OUT3 и OUT4. Вам также понадобятся еще три контакта для управления.
• EN2 подключается к ШИМ enabled output пину на Arduino
• IN3 и IN4 подключаются к цифровым выходам на Arduino
На чипе L293D есть два пина +V (8 и 16). Пин '+Vmotor' (8) обеспечивает питание моторов, а +V (16) – питание логики чипа. Оба этих контакта мы подключаем к пину 5V на Arduino 5V. Если же вы используете более мощные моторы и моторы, которые требуют для питания большее напряжение, надо обеспечить отдельную подачу питания для мотора. При этом пин 8 подключается к позитивному контакту источника питания, а земля второго источника питания – к земле на Arduino.
Соответственно, чип L293D можно использовать и для управления шаговыми двигателями. Подробная инструкция.
Дальнейшие эксперименты
Вы можете изменить скетч таким образом, чтобы управлять мотором без использования потенциометра или кнопки-переключателя. Можно начать с медленного вращения ротора двигателя в заданном направлении, постепенно увеличивать скорость, уменьшать ее и после обеспечить вращение в противоположном направлении.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!