Управление мотором на Arduino: ШИМ, скорость, тахометр
Управление мотором на Arduino — базовый проект для новичков: крутим моторчик постоянного тока (5–12 В) с помощью ШИМ, регулируем скорость потенциометром, считаем обороты датчиком Холла и выводим на TM1637. Простая схема с транзистором и диодом. Работает с любым мотором от игрушек. Проекты: вентилятор, робот, тахометр велосипеда, гирлянда, насос. Уроки Arduino, ШИМ, транзистор, Холл, TM1637.
Зачем управлять мотором на Arduino
Моторы из старых игрушек — отличный ресурс. Arduino позволяет плавно менять скорость (ШИМ), включать/выключать, считать обороты (тахометр). Применение: вентилятор, робот, насос, гирлянда, игрушка, велосипедный спидометр. ШИМ — широтно-импульсная модуляция, управляет мощностью без потери энергии. Транзистор защищает плату от тока мотора. Диод спасает от обратного напряжения. Простая схема, минимум деталей, большой эффект.
Компоненты
- Arduino Uno/Nano
- Мотор постоянного тока 5–12 В
- Транзистор NPN (BC547, 2N2222)
- Диод 1N4007 (защита)
- Потенциометр 10 кОм
- Резисторы 1 кОм, 10 кОм
- Датчик Холла (A3144) + магнит
- Индикатор TM1637 (4 разряда)
- Провода, макетная плата
- БП 5–12 В
Подключение мотора (простая схема)
- Потенциометр: средний вывод → A0, края → 5В и GND
- Транзистор: база → D9 через 1 кОм, эмиттер → GND, коллектор → минус мотора
- Мотор: плюс → 5–12 В, минус → коллектор транзистора
- Диод 1N4007 параллельно мотору (катод к плюсу)
ШИМ на Arduino
Выводы ШИМ: Uno — 3,5,6,9,10,11; Nano — те же. analogWrite(pin, value) — 0–255. 0 — стоп, 255 — максимум. Управление скоростью мотора.
Скетч управления скоростью
int potPin = A0;
int motorPin = 9;
void setup() {
pinMode(motorPin, OUTPUT);
}
void loop() {
int value = analogRead(potPin);
int speed = map(value, 0, 1023, 0, 255);
analogWrite(motorPin, speed);
}
считывает значение потенциометра на A0 (0–1023).
преобразует его в скорость мотора (0–255).
управляет скоростью мотора на пине 9 через PWM в реальном времени.
Тахометр: датчик Холла + TM1637
Магнит на валу мотора, Холл напротив. Каждый оборот — импульс. Считаем импульсы в секунду → обороты. Выводим на TM1637.
Скетч тахометра
#include <TM1637Display.h>
#define CLK 3
#define DIO 4
TM1637Display display(CLK, DIO);
int hallPin = 2;
volatile int count = 0;
void setup() {
pinMode(hallPin, INPUT);
attachInterrupt(digitalPinToInterrupt(hallPin), countPulse, FALLING);
display.setBrightness(0x0f);
}
void loop() {
delay(1000);
int rpm = count * 60;
display.showNumberDec(rpm);
count = 0;
}
void countPulse() {
count++;
}
считывает импульсы с датчика Холла на пине 2 по прерыванию.
каждую секунду вычисляет обороты в минуту (rpm = count × 60).
показывает значение на TM1637-дисплее и сбрасывает счётчик.
Заключение
Управление мотором на Arduino — базовый навык. ШИМ для скорости, транзистор + диод для защиты, Холл + TM1637 для тахометра. Вентилятор, робот, игрушка, спидометр. Просто, дёшево, интересно.
FAQ — Управление мотором Arduino
Мотор не крутится?
analogWrite 0–255. Транзистор BC547/2N2222. Питание 5–12 В. Диод 1N4007 параллельно мотору.
ШИМ не работает?
Пин 3,5,6,9,10,11. analogWrite(pin, value). Потенциометр → A0.
Тахометр не считает?
Холл A3144. Магнит близко. attachInterrupt на FALLING. count++.
TM1637 не работает?
CLK → 3, DIO → 4. TM1637Display библиотека. display.showNumberDec(rpm).
Мотор гудит, не крутит?
Напряжение 5–12 В. Ток достаточный. Диод 1N4007. Транзистор мощный.
OpenHAB интеграция?
ESP8266 + MQTT. Топики /rpm. Items Number. Графики, уведомления.
Скорость плавная?
map(value, 0, 1023, 0, 255). analogWrite. Плавное изменение.