Управление DC-мотором при помощи Arduino и драйвера моторов
Данный пример демонстрирует управление DC-мотором с помощью Arduino и драйвера моторов L293D(SN754410 или любого совместимого).
Код примера демонстрирует управление направлением вращения и скоростью мотора с помощью драйвера моторов L293D(SN754410 или любого совместимого). Скорость и направление вращения двигателя зависит от положения движка потенциометра. При считываемых значениях с потенциометра в диапазоне 462-562 вызывается функция break() для остановки двигателя, в диапазоне 562-1023 вызывается функция forward() для движения вперед, в диапазоне 0-462 вызывается функция reverse() для движения в обратном направлении. С помощью подачи ШИМ сигнала на вход 1,2EN(1) микросхемы драйвера моторов мы можем регулировать скорость вращения двигателя.
Драйвер двигателя L293D или SN754410 или любой совместимый
Дополнительный источник питания(например крона 9В)
Цепь
Соберите схему согласно изображению.
Схематичное изображение принципа работы драйвера моторов:
Таблица состояний входов и выходов драйвера моторов L293D(SN754410)
Вход
Выход
A
EN
Y
H
H
H
L
H
L
X
L
Z
Назначение контактов драйвера моторов 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-му аналоговому входуintval=0;//хранение данных, считываемых с потенциометраintvelocity=0;//хранение данных скорости мотораvoidsetup(){pinMode(EN,OUTPUT);//вход 9 устанавливаем как выходpinMode(MC1,OUTPUT);//вход 3 устанавливаем как выходpinMode(MC2,OUTPUT);//вход 2 устанавливаем как выходbrake();//останавливаем двигатель}voidloop(){val=analogRead(POT);//считываем значение с потенциометраif(val>562)//если значение больше 562 двигаемся вперед{velocity=map(val,563,1023,0,255);//преобразуем интервал значенийforward(velocity);//движемся со скоростью пропорциональной переданному значению функции}elseif(val<462)//если значение меньше 462 двигаемся назад{velocity=map(val,461,0,0,255);//преобразуем интервал значений и инвестируем егоreverse(velocity);//движемся со скоростью пропорциональной переданному значению функции}else//если значение в диапазоне между 462 и 562{brake();//останавливаем двигатель}}/**Движение двигателя вперед с заданной скоростью*Диапазон значений:0-255*/voidforward(intrate){digitalWrite(EN,LOW);//на вход EN драйвера моторов подаем низкий уровень сигналаdigitalWrite(MC1,HIGH);//на управляющий вход 1 драйвера моторов подаем высокий уровень сигналаdigitalWrite(MC2,LOW);//на управляющий вход 2 драйвера моторов подаем низкий уровень сигналаanalogWrite(EN,rate);//на вход EN драйвера моторов подаем ШИМ сигнал}/**Движение двигателя назад с заданной скоростью*Диапазон значений:0-255*/voidreverse(intrate){digitalWrite(EN,LOW);//на вход EN драйвера моторов подаем низкий уровень сигналаdigitalWrite(MC1,LOW);//на управляющий вход 1 драйвера моторов подаем низкий уровень сигналаdigitalWrite(MC2,HIGH);//на управляющий вход 2 драйвера моторов подаем высокий уровень сигналаanalogWrite(EN,rate);//на вход EN драйвера моторов подаем ШИМ сигнал}/**Остановка двигателя*/voidbrake(){digitalWrite(EN,LOW);//на вход EN драйвера моторов подаем низкий уровень сигналаdigitalWrite(MC1,LOW);//на управляющий вход 1 драйвера моторов подаем низкий уровень сигналаdigitalWrite(MC2,LOW);//на управляющий вход 2 драйвера моторов подаем низкий уровень сигналаdigitalWrite(EN,HIGH);//на вход EN драйвера моторов подаем высокий уровень сигнала}
Calibration - Определение максимума и минимума для данных от аналогового датчика.
Fading - Использование выходного аналогового контакта (ШИМ) для затухания/загорания светодиода.
Smoothing - Сглаживание серии данных, считанных с входного аналогового контакта.
Связь
ReadASCIIString - Анализ строки, состоящей из разделенных запятыми int-значений, и их последующее использование для управления RGB-светодиодом.
ASCII Table - Демонстрирует продвинутые способы вывода данных на Serial Monitor.
Dimmer - Изменение яркости светодиода при помощи движения мышкой.
Graph - Отправка данных на компьютер и их графическое отображение в скетче Processing.
Physical Pixel - Включение/выключение светодиода путем отправки данных со скетча Processing (или Max/MSP) на Arduino.
Virtual Color Mixer - Отправка с Arduino на компьютер сразу нескольких значений, а затем их считывание при помощи скетча для Processing или Max/MSP.
Serial Call Response - Многобайтная передача данных при помощи метода вызова и ответа (метода «рукопожатия»).
Serial Call Response ASCII - Многобайтная передача данных при помощи метода вызова и ответа (метода «рукопожатия»). До передачи данные зашифровываются в ASCII.
SerialEvent - Демонстрирует использование SerialEvent().
MIDI - Передача через последовательный порт сообщений с MIDI-нотами.
MultiSerialMega - Использование двух последовательных портов на Arduino Mega.
Управляющие структуры
If Statement - Как использовать оператор «if» для создания условий, опирающихся на входные аналоговые данные, при которых светодиод будет либо включаться, либо оставаться выключенным.
For Loop - Управление несколькими светодиодами, чтобы они мигали, как LED-полоска у автомобиля Китт из сериала «Рыцарь дорог».
Array - Вариация примера «For Loop», но с использованием массива.
While Loop - Использование цикла while() для калибровки датчика. Калибровка включается при нажатии на кнопку.
Switch Case - Как совершать какие-либо действия в зависимости от значений, полученных от датчика. Эквивалент примера «If Statement», но если бы условий было не два, а четыре. Этот пример демонстрирует, как дробить диапазон данных от датчика на четыре «суб-диапазона», а затем в зависимости от полученных результатов совершать одно из четырех действий.
Switch Case 2 - Второй пример, демонстрирующий использование оператора switch. Показывает, как совершать различные действия в зависимости от определенных символов, полученных через последовательный порт.
Датчики
ADXL3xx - Считывание данных с акселерометра ADXL3xx.
Knock - Определение стука при помощи пьезоэлемента.
Memsic2125 - Считывание данных с 2-осевого акселерометра Memsic2125.
Ping - Определение объектов при помощи ультразвукового дальномера.