Arduino:Примеры/Управление DC-мотором при помощи Arduino и драйвера моторов

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление DC-мотором при помощи Arduino и драйвера моторов

Данный пример демонстрирует управление DC-мотором с помощью Arduino и драйвера моторов L293D(SN754410 или любого совместимого).

Код примера демонстрирует управление направлением вращения и скоростью мотора с помощью драйвера моторов L293D(SN754410 или любого совместимого). Скорость и направление вращения двигателя зависит от положения движка потенциометра. При считываемых значениях с потенциометра в диапазоне 462-562 вызывается функция break() для остановки двигателя, в диапазоне 562-1023 вызывается функция forward() для движения вперед, в диапазоне 0-462 вызывается функция reverse() для движения в обратном направлении. С помощью подачи ШИМ сигнала на вход 1,2EN(1) микросхемы драйвера моторов мы можем регулировать скорость вращения двигателя.

Необходимое оборудование

  • Плата Arduino
    ArduinoUno R3 Front.jpg
    Здесь можно купить Arduino Uno:AliExpress
  • Провода перемычки
  • Потенциометр
  • Макетная плата
  • DC-мотор
  • Драйвер двигателя L293D или SN754410 или любой совместимый
  • Дополнительный источник питания(например крона )

Цепь

Соберите схему согласно изображению.

Arduino uno motor l293D bb.png


Arduino uno motor SN754410 bb.png

Схематичное изображение принципа работы драйвера моторов:

H bridge.svg

Таблица состояний входов и выходов драйвера моторов L293D(SN754410)

Вход Выход
A EN Y
H H H
L H L
X L Z
Pinout l293d.png

Назначение контактов драйвера моторов L293D(SN754410):

  • GND(4, 5, 12, 13) - выводы для подключения к земле;
  • Vcc2(8) - вывод для подключения напряжения питания нагрузки;
  • Vcc1(16) - вывод для подключения питания микросхемы драйвера моторов;
  • 1Y и 2Y(3, 6) - вывод для подключения первого двигателя;
  • 1A и 2A(2, 7) - выводы для управления первым двигателем;
  • 1,2EN(1) - вывод для включения и отключения первого двигателя;
  • 3Y и 4Y(11, 14) - вывод для подключения второго двигателя;
  • 3A и 4A(10, 15) - выводы для управления первым двигателем;
  • 3,4EN(9) - вывод для включения и отключения второго двигателя;

Код

#define EN  9                                            //9-ый цифровой вход Arduino подключен к входу включения двигателя EN драйвера моторов
#define MC1 3                                            //управляющий вход 1 драйвера моторов подключен к 3-му контакту Arduino
#define MC2 2                                            //управляющий вход 2 драйвера моторов подключен к 2-му контакту Arduino
#define POT 0                                            //подключение потенциометра к 0-му аналоговому входу

int val = 0;                                             //хранение данных, считываемых с потенциометра
int velocity = 0;                                        //хранение данных скорости мотора

void setup()
{
    pinMode(EN, OUTPUT);                                 //вход 9 устанавливаем как выход
    pinMode(MC1, OUTPUT);                                //вход 3 устанавливаем как выход
    pinMode(MC2, OUTPUT);                                //вход 2 устанавливаем как выход
    brake();                                             //останавливаем двигатель
}

void loop()
{
    val = analogRead(POT);                              //считываем значение с потенциометра
 
    if (val > 562)                                      //если значение больше 562 двигаемся вперед
    {
        velocity = map(val, 563, 1023, 0, 255);         //преобразуем интервал значений
        forward(velocity);                              //движемся со скоростью пропорциональной переданному значению функции
    }
 
    else if (val < 462)                                 //если значение меньше 462 двигаемся назад
    {
        velocity = map(val, 461, 0, 0, 255);            //преобразуем интервал значений и инвестируем его
        reverse(velocity);                              //движемся со скоростью пропорциональной переданному значению функции
    }
 
    else                                                //если значение в диапазоне между 462 и 562
    {
        brake();                                        //останавливаем двигатель
    }
}

/*
*Движение двигателя вперед с заданной скоростью
*Диапазон значений:0-255
*/
void forward (int rate)                                 
{
    digitalWrite(EN, LOW);                        //на вход EN драйвера моторов подаем низкий уровень сигнала
    digitalWrite(MC1, HIGH);                      //на управляющий вход 1 драйвера моторов подаем высокий уровень сигнала
    digitalWrite(MC2, LOW);                       //на управляющий вход 2 драйвера моторов подаем низкий уровень сигнала
    analogWrite(EN, rate);                        //на вход EN драйвера моторов подаем ШИМ сигнал
}

/*
*Движение двигателя назад с заданной скоростью
*Диапазон значений:0-255
*/
void reverse (int rate)
{
    digitalWrite(EN, LOW);                       //на вход EN драйвера моторов подаем низкий уровень сигнала
    digitalWrite(MC1, LOW);                      //на управляющий вход 1 драйвера моторов подаем низкий уровень сигнала
    digitalWrite(MC2, HIGH);                     //на управляющий вход 2 драйвера моторов подаем высокий уровень сигнала
    analogWrite(EN, rate);                       //на вход EN драйвера моторов подаем ШИМ сигнал
}

/*
*Остановка двигателя
*/
void brake ()
{
    digitalWrite(EN, LOW);                       //на вход EN драйвера моторов подаем низкий уровень сигнала
    digitalWrite(MC1, LOW);                      //на управляющий вход 1 драйвера моторов подаем низкий уровень сигнала
    digitalWrite(MC2, LOW);                      //на управляющий вход 2 драйвера моторов подаем низкий уровень сигнала
    digitalWrite(EN, HIGH);                      //на вход EN драйвера моторов подаем высокий уровень сигнала
}

См.также

Внешние ссылки