Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Управляем через транзистор 2N2222/P2N2222
Драйвер L293D
Поработаем с двигателем постоянного тока, который обычно входит в состав стартового набора с пропеллером.
Двигатели весьма часто применяются в Arduino-проектах. Они приводят в действие колеса, крутят пропеллеры, вращают манипуляторы промышленного робота и перемещают каретку 3D-принтера.
Каждый начинающий робототехник сталкивается с проблемой подключения двигателя к микроконтроллеру. У мотора всего два вывода, и кажется, что двигатель можно подключить к цифровым выводам Arduino, а затем включать и выключать по программе. Но не тут-то было. Даже небольшой двигатель, часто используемый в разного рода игрушках, для своей работы требует ток силой от 200 мА до 1 Ампера. А цифровой выход Arduino может дать нам только 20мА. Большинству мощных двигателей требуется напряжение более 5 Вольт, привычных для Arduino. Распространены двигатели на 12, на 24 и на 48 Вольт. Другими словами, Arduino очень слаба для прямого управления двигателями. Нужен какой-то мощный посредник!
Самый простой посредник — это транзистор. Подойдут и полевые транзисторы, и биполярные, работающие в режиме ключа.
Для сборки схемы понадобятся транзистор 2N2222 (как вариант P2N2222, BC547, 2N3904, N2222A, TIP120), диод 1N4001 (как вариант 1N4148, 1N4007).
Собираем по схеме. Будьте внимательные при соединении транзистора и диода, соблюдайте их стороны.
Скетч. Возможно, питания от USB будет недостаточно для работы мотора, используйте питание от сети.
int motorPin = 3;
void setup()
{
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
while (!Serial);
Serial.println("Speed 0 to 255");
}
void loop()
{
if (Serial.available())
{
int speed = Serial.parseInt();
if (speed >= 0 && speed <= 255)
{
analogWrite(motorPin, speed);
}
}
}
В Serial Monitor нужно ввести значение от 0 до 255, чтобы задать скорость мотора. В моём случае мотор начинал нормально вращаться от значения 30 и выше.
Есть урок с использованием транзистора IRF530N.
Существует множество готовых микросхем, которые позволяют управлять разными типами двигателей. Мы рассмотри драйвер L293D.
Микросхема представляет собой два H-моста, а значит можно управлять сразу двумя двигателями. Каждый мост снабжён четырьмя защитными диодами и защитой от перегрева. Максимальный ток, который может передать L293D на двигатель — 1.2А. Рабочий ток — 600мА. Максимальное напряжение — 36 В.
Микросхема L293D имеет DIP-корпус с 16-ю выводами. Схема выводов ниже. Отсчёт выводов ведётся против часовой стрелки и начинается от выемки в корпусе микросхемы.
+V — питание микросхема, 5В;
+Vmotor — питание двигателей, до 36В;
0V — земля;
En1, En2 — выводы включения/выключения H-мостов;
In1, In2 — управляющие выводы первого H-моста;
Out1, Out2 — выводы для подключения первого двигателя;
In3, In4 — управляющие выводы второго H-моста;
Out3, Out4 — выводы для подключения второго двигателя.
Выводы En1 и En2 служат для отключения или включения мостов. Если мы подаём 0 на En, соответствующий мост полностью выключается и двигатель перестаёт вращаться. Эти сигналы пригодятся нам для управления тягой двигателя при помощи ШИМ-сигнала.
Схема подключения двух двигателей:
L293D | Arduino
-----------------
In1 | 7
In2 | 8
In3 | 2
In4 | 3
En1 | 6
En2 | 5
V+ | 5V
Vmotor+ | 5V
0v | GND
Подключим один двигатель по схеме.
Скетч для вращения двигателя, меняя направление каждую секунду. Функция analogWrite() с помощью ШИМ-сигнала управляет мощностью двигателя. Мы командуем драйверу вращать двигатель с максимальной скоростью, что соответствует ШИМ-сигналу — 255. Здесь следует отметить, что уменьшение ШИМ-сигнала в два раза не даст в два раза меньшую скорость. Скорость и тяга двигателей постоянного тока зависят от входного напряжения нелинейно.
const int in3 = 2;
const int in4 = 3;
const int en2 = 5;
void setup() {
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(en2, OUTPUT);
analogWrite(en2, 255);
}
void loop() {
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(1000);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(1000);
}
Усложним программу. Будем кроме направления менять ещё и мощность.
const int in3 = 2;
const int in4 = 3;
const int en2 = 5;
void setup() {
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(en2, OUTPUT);
}
void loop() {
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(en2, 150);
delay(2000);
analogWrite(en2, 255);
delay(2000);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(en2, 150);
delay(2000);
analogWrite(en2, 255);
delay(2000);
}
Вот что получится в итоге. Сначала мотор вращается с небольшой скоростью, затем выходит на максимальные обороты, и повторяет всё в обратном направлении. На видео используется двигатель постоянного тока CH1 с колесом. Такие часто применяют в учебных роботах.
Ардуино: управление двигателем постоянного тока, L293D | Класс робототехники