Управление мотором на Arduino: ШИМ, скорость, тахометр

Управление мотором на Arduino — базовый проект для новичков: крутим моторчик постоянного тока (5–12 В) с помощью ШИМ, регулируем скорость потенциометром, считаем обороты датчиком Холла и выводим на TM1637. Простая схема с транзистором и диодом. Работает с любым мотором от игрушек. Проекты: вентилятор, робот, тахометр велосипеда, гирлянда, насос. Уроки Arduino, ШИМ, транзистор, Холл, TM1637.

Управление мотором Arduino ШИМ потенциометр транзистор

Зачем управлять мотором на 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. Плавное изменение.

📁 Скачать примеры