Форточку в моей теплице я сначала доверил серво: качнул рог — стекло приоткрылось, дёшево и сердито. К августу схема разочаровала полностью. На границе порога рог дёргался туда-обратно каждые пару секунд, пластмассовая качалка разбилась об упор за две недели, а однажды после ночного скачка питания серво забыла свой ноль и прижала форточку с силой, которой хватило на трещину в старой раме. Тогда я сформулировал для себя, что для заслонки важнее скорости и угла: держать позицию, пока её не попросят сменить, и уметь открываться на треть, а не только «включено-выключено». Рассада в теплице живёт на перепадах: утром воздух ещё прохладный, к полудню стекло греется до тридцати, и форточка должна ползти за солнцем плавно, а не махать туда-обратно.
Шаговик решает обе задачи без всяких ухищрений. Позиция у него — счёт шагов: девяносто градусов хода заслонки-бабочки на 28BYJ-48 — это ровно 512 шагов, треть хода — около 170, и промежуточных положений столько, сколько шагов вы готовы посчитать. Почему счёт шагов вообще заменяет датчик положения, мы разбирали в уроке про фазы, здесь же применим это к вентиляции. Датчиком климата будет DHT22 на пине 2 — тот же герой, что качал вытяжку в уроке про вентилятор, только теперь вместо реле он будет говорить шаговику, насколько приоткрыть форточку.
К концу урока соберёте автомат с гистерезисом из двух порогов, приоткрытием по величине перегрева и честным ответом на вопрос, зачем здесь шаговик, если серво дешевле. Соседний вариант с рогом серво у нас тоже разобран — форточка теплицы на серво, — откройте его рядом и сравните, где чей предел.
Заслонка-бабочка: сколько это в шагах
Вентиляционные заслонки почти всегда «бабочки»: диск на оси внутри круглого канала, полный ход от «стоя поперёк потока» до «лег вдоль» — девяносто градусов, и больше не нужно: дальше диск просто не мешает воздуху. При 2048 шагах на оборот девяносто градусов — это 512 шагов, каждый шаг — 0,176 градуса. Вся карта заслонки умещается в диапазон от нуля до 512, а «приоткрыть на треть» превращается в число 170. Никаких пропорций, ШИМ и аналоговых фокусов: степень открытия — это шаги, целые и пересчитываемые на бумажке. Одна оговорка про физику потока: бабочка неравноценная — первые градусы хода дают больше всего воздуха: на тридцати градусах канал пропускает около половины полного потока, на шестидесяти — восемьдесят с лишним процентов. Поэтому «приоткрыть на треть» — не треть воздуха: щель в 170 шагов уже душит перегрев мягко, а до упора бабочку гонят только в жаркий полдень.
На форумах такие заслонки собирают давно и на разном железе: кто-то ставит дополнительный редуктор и гоняет бабочку четырьмя тысячами шагов на двадцать пять градусов хода ради момента, кто-то обходится прямым приводом моторчика за двести рублей вместе с платой. Правило тут одно: ход прямой — считайте градусы шагами как есть, добавили редукцию — умножьте на её число. Мне хватало прямого привода: лёгкая пластиковая бабочка в канале на сто миллиметров не требует момента, а редукция съедает скорость, которая вентиляции и так не нужна.
Полный ход в 512 шагов при 6 RPM занимает четыре секунды — для форточки это идеальный темп: сквозняк не хлопает рамой, мотор не успевает напеть, а глаза успевают увидеть движение. Формулу перевода градусов в шаги мы вымеряли в уроке про поворот на 90 градусов, там же таблица для других ходов. Единственная тонкость — упоры: ограничитель внутри канала должен ловить бабочку на нуле и на 512, иначе после первого же срыва шагов счёт уплывёт молча, о чём у нас есть отдельный разговор.
Моё мнение, оплаченное разбитой качалкой, такое: для заслонки шаговик честнее серво по трём причинам. Первая — удержание. Сервопривод держит угол, только пока на него приходят импульсы, и вздрагивает от помех по шлейфу; шаговик держит позицию магнитным полем, а у 28BYJ-48 с его пластиковым редуктором добавляется самоторможение передачи — ветер в канале заслонку не провернёт даже с обесточенными обмотками.
Вторая причина — промежуточные положения без обратной связи. Серво знает свой угол из внутреннего потенциометра, но приказ «встань на 35 градусов» она выполнит с точностью плюс-минус пара градусов и с лёгким дрожанием у края. Шаговику нужен только счёт: сказали 170 — будет 170. Третья — ресурс: рог серво разбивается об упоры именно в тех задачах, где заслонка ходит дважды в час весь сезон; шаговик на упоре просто стоит, ему упор безразличен. Честности ради, у серво есть козырь — она знает свой угол даже после того, как её рукой передвинули; шаговик верит только счёту. Если сомневаетесь, у нас есть большая таблица выбора мотора под задачу, а здесь я зафиксирую границу: ход лёгкий, скорость мала, позиций больше двух — берите шаговик.
И плюс, который не виден в теории: обмотки после хода можно обесточить — приём из урока про отключение катушек — и заслонка останется на месте за счёт трения редуктора и лёгкого прижима диска к седлу. Ноль тока покоя, ноль нагрева в закрытой теплице, ноль лишних градусов над рассадой. Серво так не умеет: без импульсов она расслабляется, а с импульсами греется сама и греет стабилизатор.
Гистерезис: два порога вместо одного
Один порог — главный источник дёрганья. Поставили правило «жарко выше 26 — открыть»: температура в теплице гуляет на полградуса туда-сюда от облака за облаком, и автомат в пограничной зоне будет ездить форточкой каждые две секунды. Шаговик в этой зоне ездит, греется и мотает счётчик, механика разбивается об упоры, а хозяин через неделю выдёргивает питание и говорит, что автоматика не работает. Лечение старо, как утюг: два порога вместо одного. Ширина мёртвой зоны — ваш компромисс: узкая в один градус реагирует быстрее, но механика ходит чаще, широкая в три-четыре — реже, но температуру держит грубее; для теплицы я держу два градуса, для погреба брал четыре — инерция грунта и так сглаживает всё.
Открываем, когда температура перевалила за верхний порог — пусть 26 градусов. Закрываем, только когда опустилась ниже нижнего — 24. Между ними лежит мёртвая зона шириной в два градуса, где не происходит ничего: заслонка держит последнюю позицию, сколько бы опрос ни принёс значений. Пока воздух проплывает зону целиком, автомат молчит — ровно так термостат утюга щёлкает раз в десять минут, а не сто раз в минуту. Ту же пару уставок мы применяли к обогреву в уроке про две уставки термостата, только там реле щёлкало обогревателем, здесь шаги двигают бабочку.
Приоткрытие вписывается в эту схему одним движением: верхний порог — начало шкалы, а не кнопка. Перегрев на градус выше 26 — приоткрыли на 128 шагов, на три — на 256, на пять и больше — все 512 до упора. Шкалу делает map() по десяткам градуса с ограничением constrain() — линейная связь, чем жарче, тем шире щель. Считается это на бумажке за минуту: при 27,4 °C десятки дают 274, map от 260 до 310 переводит их в 128-512, выходит около 236 шагов — между третью и половиной хода. DHT22 опрашиваем раз в две секунды: чаще он физически не успевает обновить показания, а между опросами цикл живёт по millis() и не блокирует ничего. Всё это умещается в скетч, который ниже — сперва для настоящей платы, потом в симуляторе с бегунком температуры.
| Свойство | Сервопривод | 28BYJ-48 |
|---|---|---|
| Удержание позиции | только под импульсами, вздрагивает от помех | магнитное поле плюс самоторможение редуктора, можно обесточить |
| Промежуточные положения | с точностью 1-2 градуса, дрожание у края | любое из 512, шаг 0,176 градуса |
| Ход и упоры | 0-180 градусов, рог бьётся об ограничитель | любой ход по счёту, упоры ставите сами |
| Ток покоя | пакеты импульсов каждые 20 мс | ноль, если обесточить обмотки после хода |
#include <Stepper.h>#include <DHT.h> const int STEPS_PER_REV = 2048;const float T_OPEN = 26.0; // верхний порог: начинаем открыватьconst float T_CLOSE = 24.0; // нижний порог: закрываем только ниже него Stepper flap(STEPS_PER_REV, 8, 10, 9, 11);DHT dht(2, DHT22); int flapPos = 0; // текущее положение в шагахunsigned long lastPoll = 0; void flapOff() { digitalWrite(8, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(11, LOW);} void setup() { flap.setSpeed(6); dht.begin(); Serial.begin(9600); Serial.println("zaslonka gotova");} void loop() { if (millis() - lastPoll < 2000) return; // DHT22 чаще нельзя lastPoll = millis(); float t = dht.readTemperature(); int target = flapPos; if (t >= T_OPEN) { target = map(constrain((int)(t * 10), 260, 310), 260, 310, 128, 512); } if (t < T_CLOSE) { target = 0; } // между 24 и 26 — мёртвая зона: target не трогаем if (target != flapPos) { flap.step(target - flapPos); flapPos = target; flapOff(); Serial.print("t="); Serial.print(t, 1); Serial.print(" | shagov otkryto="); Serial.println(flapPos); if (flapPos == 0) { Serial.println("obmotki obestocheny"); } }}- Заслонка-бабочка ходит 0-90 градусов: на 2048-шаговом моторе это 512 шагов, «треть» — около 170
- Приоткрытие — число шагов: map() по десяткам градуса от 128 до 512, constrain() не даёт выйти за ход
- Два порога вместо одного: открытие выше 26, закрытие ниже 24, между ними мёртвая зона шириной два градуса
- Шаговик держит позицию магнитом и трением редуктора — обмотки после хода можно обесточить полностью
- Срыв шагов сбивает счёт молча: жёсткий упор в нуле и стартовый прогон к нему — минимальный репер
- 1. Сколько шагов 28BYJ-48 занимает полный ход бабочки на 90 градусов?
- 2. Температура 25,1 °C, пороги 26 и 24, заслонка открыта на 256 шагов. Что сделает автомат?
- 3. Почему после хода обмотки обесточивают?
- 4. Какое свойство сервы здесь вне конкуренции?
- 5. DHT22 стали опрашивать каждые 200 мс. Что изменится?
Теперь у вентиляции есть автомат, который открывает форточку настолько, насколько жарко, молчит в мёртвой зоне и не греет воздух зря между ходами. Тот же скелет — датчик, два порога, счёт шагов — переживает смену нагрузки: вместо бабочки возьмите шторку, вместо форточки — задвижку дымохода, арифметика не изменится. Единственное, что перенастраивается под задачу, — ширина мёртвой зоны и нижний порог: зимой я оставляю форточку на минимальной щели в 128 шагов, переписав константы в шапке скетча, — конденсат на стекле от этого уходит, а тепло почти не теряется. В следующем уроке повернём мотор к другой бытовой задаче: кормушка для питомца, где шаги отмеряют граммы, кнопка ручной выдачи добавляет вопрос о защите от жадности, а Serial становится чёрным ящиком всей системы.
Частые вопросы по теме урока
- Сколько шагов 28BYJ-48 занимает полный ход бабочки на 90 градусов?
- 90 градусов — четверть оборота, а четверть от 2048 — 512 шагов. На этот диапазон и натянута вся шкала приоткрытия. 512
- Температура 25,1 °C, пороги 26 и 24, заслонка открыта на 256 шагов. Что сделает автомат?
- 25,1 лежит между нижним и верхним порогом, target не пересчитывается — заслонка стоит там, где её оставил предыдущий переход. Ничего — мёртвая зона, позиция сохранится
- Почему после хода обмотки обесточивают?
- Удержание шаговику нужно только под нагрузкой, способной провернуть вал. Пластиковый редуктор самотормозится, поэтому после хода катушки можно отпускать. Ток покоя греет мотор в закрытой теплице — а трение редуктора само держит заслонку
- Какое свойство сервы здесь вне конкуренции?
- Серво читает собственный потенциометр: её можно передвинуть рукой, и она знает новый угол. Шаговик верит только счёту шагов. Она знает свой угол из внутренней обратной связи
- DHT22 стали опрашивать каждые 200 мс. Что изменится?
- DHT22 физически пересчитывает значения реже двух секунд; частые запросы дают мусор или пропуски, отсюда и договорённость о двух секундах. Датчик не успевает обновить показания — интервал должен быть не меньше двух секунд