Управление мотором через транзистор (Transistor Motor Control)
Учимся управлять DC-мотором с помощью транзистора и Arduino: схема, код и подробные пояснения по работе с PWM и PWM.
Материал обновлён 18.01.2022, автор оригинала — Karl Söderby.
Моторы и транзисторы — одни из самых распространённых компонентов в электронике. В этом уроке разберём основы работы с ними, соберём рабочую схему и разберём код по шагам.
Когда кнопка, подключённая к цифровому пину 2, нажата, Arduino управляет транзистором через pulse-width modulation (PWM): скорость мотора плавно нарастает, а затем так же плавно снижается.
О транзисторах
Цифровые пины Arduino могут отдавать не более 40 мА при напряжении 5 В. Большинство моторов требуют больше тока и/или напряжения. Транзистор в этом случае работает как управляемый ключ: он позволяет Arduino коммутировать нагрузки с более высокими электрическими требованиями, оставаясь при этом в безопасном режиме работы.
В нашей схеме транзистор замыкает цепь мотора на землю. Используется TIP120, который способен коммутировать нагрузку до 60 В при токе 5 А — вполне достаточно для большинства небольших DC-моторов.
При PWMing транзистора принцип похож на управление яркостью светодиода через PWM. Чем выше значение PWM, тем быстрее крутится мотор, чем ниже — тем медленнее.
У транзистора три вывода. У биполярных транзисторов (BJTs), к которым относится используемый в уроке, они называются база (base), коллектор (collector) и эмиттер (emitter). Небольшой ток на базе замыкает цепь между коллектором и эмиттером. BJTs делятся на два типа: NPN и PNP. TIP120 — NPN-транзистор: коллектор подключается к мотору, а эмиттер — к земле.
Типичная ошибка
Чаще всего новички путают ориентацию транзистора. У TIP120 металлическая пластина (радиатор) находится сзади: если смотреть на транзистор так, чтобы пластина была обращена от вас, то слева — база, посередине — коллектор, справа — эмиттер. Перепутать выводы несложно, а последствия — перегрев или повреждение компонента.
О моторах
DC-моторы работают на принципе электромагнитной индукции. Ток через намотанный провод создаёт магнитное поле, которое взаимодействует с постоянными магнитами внутри корпуса мотора — вал начинает вращаться.
Когда мотор останавливается, вал продолжает вращаться по инерции и сам становится источником небольшого тока. Этот обратный ток может повредить схему. Чтобы этого избежать, диод включают параллельно выводам мотора — он «поглощает» обратный выброс напряжения.
При старте мотор потребляет наибольший ток — это называется пусковым током. Когда мотор набирает обороты, потребление резко падает. Ток при заклинивании (stall current) — это максимальный ток, который мотор потребляет при полной остановке под нагрузкой.
Номинальное напряжение — это оптимальный рабочий режим. Превышение или занижение напряжения со временем сокращает ресурс мотора. Как правило, для запуска мотору нужно не менее половины номинального напряжения — если дать меньше, он просто не сдвинется.
Необходимые компоненты
- Arduino Board
- Тактовая кнопка (momentary switch)
- Резистор 10 кОм
- Макетная плата (breadboard)
- Провода для соединений
- DC-мотор 9 В
- Транзистор TIP120
- Диод 1N4001
- Батарея 9 В
Схема на макетной плате

Схема подключения управления мотором через транзистор на макетной плате. Создано с помощью Fritzing.org.
Начните с проводов питания и земли. На иллюстрации красный провод (питание) и чёрный (земля) подключены к двум длинным вертикальным шинам по бокам макетной платы — это даёт удобный доступ к 5 В и GND.
Разместите кнопку на макетной плате так, чтобы она перекрывала центральный разрыв. Один вывод кнопки соедините с цифровым пином 2 Arduino, а через резистор 10 кОм подтяните этот же вывод к земле (pull-down). Второй вывод кнопки подключите к шине 5 В.
Пин 9 Arduino соедините с базой транзистора TIP120. Если смотреть на транзистор металлической пластиной от себя, база — крайний левый вывод. Коллектор транзистора подключите к одному выводу мотора, эмиттер — к земле.
Второй вывод мотора подключите к плюсу батареи 9 В. Минус батареи соедините с GND Arduino.
Принципиальная схема

Принципиальная схема управления мотором через транзистор. Создано с помощью Fritzing.org.
Полный код программы
Ниже приведён полный скетч для управления DC-мотором через транзистор. Детальный разбор — в следующем разделе.
/*
Управление мотором с помощью транзистора
Этот пример показывает, как управлять мотором с помощью транзистора.
При нажатии кнопки на пине 2 Arduino управляет транзистором
через PWM, постепенно увеличивая скорость мотора, а затем снижая её.
Схема:
* кнопка без фиксации: один конец подключён к 5V, другой — к GND
через резистор 10 кОм и к цифровому пину 2.
* транзистор TIP120: Base подключена к цифровому пину 9, Emitter — к GND,
Collector — к одному выводу мотора постоянного тока 9V.
* батарея 9V: GND подключён к GND Arduino, питание — к мотору.
* диод 1N4001 параллельно выводам мотора, полосой к стороне 9V.
Arduino может обеспечить не более 40mA при 5V на своих пинах. Большинство
моторов требуют большего тока и/или напряжения для преодоления инерции и работы.
Транзистор может выступать в роли цифрового ключа, позволяя Arduino управлять
нагрузками с более высокими электрическими требованиями.
Создано 03 января 2013
автор: Scott Fitzgerald
https://docs.arduino.cc/learn/electronics/transistor-motor-control
Этот пример кода находится в общественном достоянии.
*/
// присвоить имя цифровому пину 2, к которому подключена кнопка
int pushButton = 2;
// транзистор, управляющий мотором, подключён к цифровому пину 9
int motorControl = 9;
// функция setup выполняется один раз при нажатии кнопки сброса:
void setup() {
// настроить пин кнопки как вход:
pinMode(pushButton, INPUT);
// настроить пин транзистора как выход:
pinMode(motorControl, OUTPUT);
}
// функция loop выполняется бесконечно по кругу:
void loop() {
// считать состояние кнопки и проверить, нажата ли она
if(digitalRead(pushButton) == HIGH){
// плавно увеличить скорость мотора
for(int x = 0; x <= 255; x++){
analogWrite(motorControl, x);
delay(50);
}
// плавно уменьшить скорость мотора
for(int x = 255; x >= 0; x--){
analogWrite(motorControl, x);
delay(50);
}
}
delay(1); // задержка между считываниями для стабильности
}
Разбор кода по шагам
В этом разделе — подробное объяснение каждой части программы.
Сначала создаём пару переменных: для состояния кнопки и для пина управления мотором:
int pushButton = 2;
int motorControl = 9;
В setup() объявляем эти пины как вход и выход соответственно:
void setup() {
pinMode(pushButton, INPUT);
pinMode(motorControl, OUTPUT);
}
После настройки переходим к loop().
void loop() {
Считываем состояние кнопки и проверяем, равно ли оно HIGH. Проверку удобно делать прямо внутри условия if():
if(digitalRead(pushButton) == HIGH){
Если кнопка нажата, плавно увеличиваем скорость мотора, повышая значение PWM на пине motorControl. После достижения максимума так же плавно снижаем:
for(int x = 0; x <= 255; x+=5){
analogWrite(motorControl, x);
delay(50);
}
for(int x = 255; x >= 0; x-=5){
analogWrite(motorControl, x);
delay(50);
}
Закрываем блок if() и добавляем небольшую задержку delay() перед закрытием
}
delay(1);
}
Как проверить результат
- Соберите схему по иллюстрации, убедитесь в правильной ориентации транзистора и диода.
- Загрузите скетч в Arduino.
- Нажмите и удерживайте кнопку — мотор должен плавно набрать обороты, а затем так же плавно остановиться.
- Если мотор не реагирует, проверьте, подключена ли батарея 9 В и правильно ли соединены выводы транзистора.
- Если мотор гудит, но не вращается — скорее всего, напряжения не хватает для старта. Убедитесь, что батарея заряжена.
Практические замечания
- Диод 1N4001 обязателен: без него обратный выброс от мотора может повредить транзистор или даже Arduino.
TIP120— транзистор Дарлингтона с встроенным диодом между коллектором и эмиттером, что делает его особенно удобным для управления индуктивными нагрузками.- PWMing мотора на низких значениях (ниже ~80 из 255) может вызывать характерное гудение — это нормально для PWM-управления.
- Не подключайте мотор напрямую к пинам Arduino: даже небольшой мотор при старте может потребовать несколько сотен миллиампер, что гарантированно выведет пин из строя.