Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Двигатель постоянного тока (DC Motor)

Управляем через транзистор 2N2222/P2N2222
Драйвер L293D

DC Motor

Поработаем с двигателем постоянного тока, который обычно входит в состав стартового набора с пропеллером.

DC Motor

Двигатели весьма часто применяются в Arduino-проектах. Они приводят в действие колеса, крутят пропеллеры, вращают манипуляторы промышленного робота и перемещают каретку 3D-принтера.

Каждый начинающий робототехник сталкивается с проблемой подключения двигателя к микроконтроллеру. У мотора всего два вывода, и кажется, что двигатель можно подключить к цифровым выводам Arduino, а затем включать и выключать по программе. Но не тут-то было. Даже небольшой двигатель, часто используемый в разного рода игрушках, для своей работы требует ток силой от 200 мА до 1 Ампера. А цифровой выход Arduino может дать нам только 20мА. Большинству мощных двигателей требуется напряжение более 5 Вольт, привычных для Arduino. Распространены двигатели на 12, на 24 и на 48 Вольт. Другими словами, Arduino очень слаба для прямого управления двигателями. Нужен какой-то мощный посредник!

Самый простой посредник — это транзистор. Подойдут и полевые транзисторы, и биполярные, работающие в режиме ключа.

Управляем через транзистор 2N2222/P2N2222

Для сборки схемы понадобятся транзистор 2N2222 (как вариант P2N2222, BC547, 2N3904, N2222A, TIP120), диод 1N4001 (как вариант 1N4148, 1N4007).

2N2222 Transistor Diode

Собираем по схеме. Будьте внимательные при соединении транзистора и диода, соблюдайте их стороны.

DC Motor

Скетч. Возможно, питания от 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

Существует множество готовых микросхем, которые позволяют управлять разными типами двигателей. Мы рассмотри драйвер L293D.

L293D

Микросхема представляет собой два H-моста, а значит можно управлять сразу двумя двигателями. Каждый мост снабжён четырьмя защитными диодами и защитой от перегрева. Максимальный ток, который может передать L293D на двигатель — 1.2А. Рабочий ток — 600мА. Максимальное напряжение — 36 В.

Микросхема L293D имеет DIP-корпус с 16-ю выводами. Схема выводов ниже. Отсчёт выводов ведётся против часовой стрелки и начинается от выемки в корпусе микросхемы.

DC Motor

+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 

Подключим один двигатель по схеме.

DC Motor

Скетч для вращения двигателя, меняя направление каждую секунду. Функция 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 | Класс робототехники

Реклама