Вибромотор на Arduino: вибрация через ШИМ
Светодиодное уведомление не чувствуется в кармане, зуммер раздражает соседей, а «тихий» будильник, который реально разбудит, — это вибрация. Монетный вибромоторчик (10 мм, за 30 рублей) из старой наушной гарнитуры — идеальный исполнитель: щёлкнул пином — устройство вежливо дёрнулось в кармане. Одна проблема: новички подключают его напрямую к пину, и первый же запуск тихо калечит плату.
Ниже — почему прямое подключение это ток выше пинового плюс выброс самоиндукции, схема на одном транзисторе и одном диоде, управление силой вибрации через analogWrite и скетч пульса. Моторчик уже лежит в палитре «Макетка» нашего симулятора — попробуйте его в симуляторе и убедитесь, что ШИМ-ползунок трясёт стенд, ещё до пайки.
Почему напрямую к пину нельзя
Пин Arduino отдаёт 20-40 мА. Монетному вибромоторчику нужно 60-100 мА — он один превышает бюджет пина втрое. Но и это не главное: мотор — индуктивная нагрузка, обмотка копит ток, и при размыкании выбрасывает ЭДС самоиндукции в десятки вольт обратно в пин. Итог прямого подключения всегда один: сначала «работает же», через несколько дней пин деградирует или умирает целиком. Знакомая схема выживания уже описана в лендинге про транзистор TIP120 — для вибромоторчика всё то же самое, только в миниатюре.
Схема: транзистор, резистор, диод
- NPN-транзистор (2N2222, BC337): коллектор к минусу мотора, эмиттер на GND.
- Резистор 1 кОм между пином Arduino и базой — пин только командует, ток течёт мимо него.
- Мотор между +5 В и коллектором; полярность монетного моторчика влияет только на направление эксцентрика — не критично.
- Диод 1N4148 параллельно мотору, катодом к плюсу: гасит выброс самоиндукции, без него транзистор живёт недолго.
- Общая земля Arduino и питания мотора обязательна.
Если паять не хочется — покупайте готовый модуль вибромотора: транзистор и диод уже на плате, у него вход 5-вольтовой логики, и подключение сводится к трём проводам. Для одного моторчика и двух резисторов возня не стоит.
analogWrite 0-255: сила вибрации, а не скорость
ШИМ работает здесь так же, как на светодиодной яркости: analogWrite(пин, N) подаёт импульсы, и мотор получает среднее напряжение. Только у мотора есть нюанс, которого нет у светодиода: инерция и стартовое сопротивление. Ниже примерно 25-30% мотор не стартует вовсе — эксцентрику нужно напряжение, чтобы сдвинуться с места; а после старта может продолжать крутиться и от меньшего. Поэтому «шкала силы вибрации» у каждого экземпляра своя: найдите своё минимальное рабочее значение экспериментом и начинайте пульс с него. Ещё нюанс — слышимый писк: стандартная частота ШИМ 490 Гц сидит прямо в слышимом диапазоне, и тонкий корпус мотора её пропевает. Лечится повышением частоты ШИМ выше 20 кГц, если захочется тишины.
| Параметр | Прямо к пину | Через транзистор |
|---|---|---|
| Ток | 20-40 мА потолок пина, мотору мало | 100 мА и больше — без проблем |
| Выброс ЭДС | бьёт по пину при каждом выключении | гасится диодом-обраткой |
| Сила вибрации | слабая и непредсказуемая | полный диапазон ШИМ 0-255 |
| Риск для платы | пин деградирует за дни | пин только командует |
| Вердикт | никогда, даже «на минутку» | единственно правильный вариант |
Скетч: пульсирующая вибрация
const byte PIN_VIB = 9; // ШИМ-пинconst byte MIN_PWM = 70; // ниже мотор не стартует — подберите свойconst byte MAX_PWM = 220; // 255 часто шумит громче, чем трясёт void setup() { } void loop() { for (int p = MIN_PWM; p <= MAX_PWM; p += 5) { // нарастает analogWrite(PIN_VIB, p); delay(15); } for (int p = MAX_PWM; p >= MIN_PWM; p -= 5) { // затихает analogWrite(PIN_VIB, p); delay(15); } analogWrite(PIN_VIB, 0); delay(600); // пауза между пульсами}Для тактильных уведомлений проще и приятнее не плавный пульс, а короткие «тычки»: три раза analogWrite на 200 на 80 мс с паузами — паттерн как у виброзвонка. Браслет-будильник собирается из этого же кода плюс модуля часов RTC: сверяете время, в нужный час запускаете пульс. Полную базу по скважности и частотам — в лендинге про analogWrite и ШИМ.
В паре с пассивным пьезозуммером получаются полноценные уведомления: звук для дома, вибрация для кармана — один и тот же флаг в коде включает оба. А если захочется узнать, сколько на самом деле ест ваш моторчик, датчик тока ACS712 покажет амперы в Serial.