Очередной привод форточки. Проветриваем помещение правильно!
Проветривание очищает воздух, снижает концентрацию углекислого газа и микробов, улучшает самочувствие и делает дыхание более комфортным. Но в ручном режиме оно может быть нерегулярным, а в холодное время года даже небезопасным для здоровья. Для решения этой проблемы уже давно существуют приводы для форточек, но удовольствие недешевое. Тем временем в сети лежит множество DIY-проектов, которые намного дешевле и удобнее в кастомизации. А еще это просто интересно! Под катом рассмотрим занятный механизм, а также его адаптацию под то, что «валялось в ящике стола», и автоматизацию проветривания через умный дом.
Итак, я вдохновился проектом Window Chain Actuator, который лежит на Thingiverse. Проект представляет собой цепной привод, в котором используется шаговый мотор для одновременного движения цепи и ее протяжки внутри механизма. Это вполне промышленное решение, используемое во «взрослых» приводах. Оно позволяет механизму быть достаточно компактным в закрытом состоянии и удерживать любое положение даже при внешнем давлении.

Я использовал его Modified вариацию, в которой изменено передаточное число главной червячной шестерни в сторону увеличения скорости, а еще сделано удобное разделение корпуса на отсеки, благодаря чему проект можно легко адаптировать под практически любые моторы и электронику.

Воодушевившись, я распечатал необходимые детали и приступил к сборке.
Механизм
Корпус, а также шестерни и ролики распечатались без проблем, так что потребовалось просто собрать все воедино. По инструкции для роликов требовались металлические валы диаметром 2.4мм, которых у меня не оказалось. Но не зря же блог называется DIY? Вместо валов я нарезал гвозди подходящих диаметров. Для роликов — 2.4мм, для цепи — 1.7мм. В оригинале автор использует отрезки филамента для сборки цепи, но на мой взгляд это как-то слабовато.




Детали пришлось «разработать» и смазать, так как подходили они впритык. Для смазки червячного привода использовал PTFE-смазку, как советовал автор оригинала.

После завершения сборки и наладки механизма и цепи необходимо было связать их леской, пропустив ее через все ролики в верном порядке. Леска здесь служит для того, чтобы цепь не застревала и двигалась по механизму плавно и без рывков.

Проверить работу механизма без мотора не представлялось возможным (привод-то червячный), потому пришел черед «сердца» механизма.
Силовая часть
В оригинале используется шаговый мотор 28byj-48 12V stepper + ULN2003. В модифицированной версии движок тот же, но переделанный под биполярный драйвер A4988 (что дает дополнительную мощность). Мне же показалось, что скорость открытия черепашья, потому я было решил использовать другой подход.
Мне пришла в голову мысль использовать мотор-редуктор N20, и я даже распечатал перемоделированный вал и отсек мотора. В тот момент я хотел управлять устройством через радиосигнал.


Но, несмотря на все плюсы такого решения (мощность, простота управления), пришлось от него отказаться. Во-первых, мотор-редуктор, как оказалось, очень громкий, а во-вторых, точно регулировать положение без обратной связи невозможно (добавим к этому нестабильность радиосвязи). А переиначивать всю идею ради энкодера было лень… И тут я вспомнил, что у меня валялся униполярный шаговик, который изначально планировался к установке в жалюзи. Но тогда я обошелся другим движком, а шаговик с драйвером остался.

Этим шаговиком оказался 28byj-48 на 5В. Решение даже слабее того, что в исходном проекте. Но поскольку переделка движка на биполярный — дело пары минут, то я решил не заморачиваться и собирать как есть. И не зря! Вхолостую мотор заработал вполне неплохо, хотя, как и ожидалось, медленно.

Но со скоростью я уже смирился, так что приступил к подготовке электронной начинки.
Электроника
В оригинале используется контроллер Wemos D1 на базе ESP8266 и датчик температуры, который и контролирует степень открытия. Делался проект для форточки на майнинг-ферме, так что неудивительно. Я же решил использовать контроллер, который выдрал из умной лампочки на прошивке ESPHome. Такой же я недавно запихнул в умную розетку. О том, что еще полезного было в умных лампочках по 100 рублей, тоже был отдельный опус.

Так что схема начала вырисовываться очень простая. Мотор с драйвером, да контроллер с линейным стабилизатором. И все это питается от 5 Вольт, которыми снабжает самодельная низковольтная розетка из компьютерного БП. Разве что драйвер чуть не влез в корпус, пришлось отпилить кусок платы.

Программа и последующая доработка привода
Для интеграции в умный дом я написал простейший скрипт, в котором был описан примитив мотора и шаблонный cover, который должен был управлять открытием/закрытием форточки. Но настройка шагов для крайнего положения форточки заставила меня пересмотреть подход.
globals:
- id: FULL_STEPS
type: int
initial_value: '29000'
stepper:
- platform: uln2003
id: motor
pin_a: P7
pin_b: P6
pin_c: P26
pin_d: P24
max_speed: 150 steps/s
acceleration: 200
deceleration: 200
sleep_when_done: true
# ==========================================
# ИНТЕРФЕЙС В HOME ASSISTANT
# ==========================================
cover:
- platform: template
name: "Форточка"
id: valve_cover
has_position: true
optimistic: true
open_action:
- stepper.set_target:
id: motor
target: !lambda 'return id(FULL_STEPS);'
close_action:
- stepper.set_target:
id: motor
target: 0
stop_action:
- stepper.set_target:
id: motor
target: !lambda 'return id(motor).current_position;'
position_action:
- stepper.set_target:
id: motor
target: !lambda 'return (int)(pos * id(FULL_STEPS));'Допустим, окно начинает открываться на 20000 шагов, а на первой десятке тысяч гаснет свет. Тогда окно после возобновления энергоснабжения будет считать себя закрытым (0 шагов), cover будет работать некорректно, а вернуть его с помощью стандартной программы будет нельзя, ведь шагает-то мотор в одну сторону относительно нуля. Мне пришло в голову сделать дополнительное поле калибровки, чтобы уже вручную все регулировать.
# Оставляем сырое поле управления на всякий случай для ручной отладки
number:
- platform: template
name: "Physical Target (Steps)"
id: raw_step_target
optimistic: true
min_value: -50000
max_value: 50000
step: 10
mode: box
set_action:
- stepper.set_target:
id: motor
target: !lambda 'return (int)x;'Но ведь и это неудобно! Надо руками все подкручивать, проверять насколько плотно закрыто окно, дергать механизм...
Подумав, я решил добавить в схему геркон. Это очень удобно, потому что плотность закрытия в этом случае можно не регулировать на глаз каждый раз, а подстроить точно и единожды, и при перезагрузке просто активировать скрипт закрытия, который точно спозиционирует форточку в крайнее положение и установит cover в ноль.
Но одно дело написать пару строчек кода, а другое дело установить датчик, которого нет на руках… Ждать не хотелось, потому я нашел в сети еще один проект, который и заменил мне покупку геркона.

Проект представляет собой устройство, которое реагирует на магнитное поле так же, как и геркон. Единственный недостаток — негерметичность. Геркон расшифровывается как герметичный контакт, здесь же такого нет и быть не может. Но и больших токов и напряжений тоже, так что металл обгорать не должен.

Модель немного переделал под свои магнитики, плюс крепления изменил на боковые, в остальном оставил как есть.

С основной схемой соединил посредством разъема. В оригинале используется 2 симметричных разъема, чтобы можно было подключать питание с двух сторон. Я же для питания использовал разъем 5.5x2.1, а с другой стороны припаял 4.0x1.7 — для геркона. Это не позволит перепутать разъемы и спалить мозги приводу.

Схема изменилась не очень сильно.

А вот логика контроллера была серьезно доработана. Добавил скрипт калибровки нуля и вывел его отдельно на кнопку. Шаги отдельно настроил, чтобы обеспечить максимальную плотность закрытия окна. Получилось почти так же плотно, как от ручки окна — определил по затиханию фонового шума с улицы.
esphome:
name: automatic-window
friendly_name: Automatic Window
on_boot:
priority: -100
then:
- script.execute: calibrate_stepper
script:
- id: calibrate_stepper
then:
# ==========================================
# ЭТАП 0: ПРОВЕРКА И ОТСКОК (Clearance)
# ==========================================
# Если геркон УЖЕ замкнут на старте - сначала выезжаем из его зоны
- if:
condition:
binary_sensor.is_on: reed_switch
then:
# Отъезжаем на +1500 шагов от текущей точки
- stepper.set_target:
id: motor
target: !lambda 'return id(motor).current_position + 1500;'
# Ждем, пока мотор физически проедет эти 1500 шагов
- wait_until:
condition:
lambda: 'return id(motor).current_position == id(motor).target_position;'
# Даем небольшую паузу механике успокоиться
- delay: 200ms
# ==========================================
# ЭТАП 1: ПОИСК КРАЯ ГЕРКОНА
# ==========================================
# Теперь геркон точно отжат. Едем в глубокий минус искать его.
- stepper.set_target:
id: motor
# Берем -32000 от ТЕКУЩЕЙ позиции, чтобы точно хватило хода
target: !lambda 'return id(motor).current_position - 32000;'
# Скрипт замирает и ждет прерывания (замыкания геркона)
- wait_until:
condition:
binary_sensor.is_on: reed_switch
# Геркон сработал! Мгновенно тормозим мотор.
- stepper.set_target:
id: motor
target: !lambda 'return id(motor).current_position;'
- delay: 200ms # Пауза на торможение
# ==========================================
# ЭТАП 2: ФИНАЛЬНЫЙ ДОВОД (-1300)
# ==========================================
- stepper.set_target:
id: motor
target: !lambda 'return id(motor).current_position - 1300;'
# Ждем, пока мотор не доедет эти последние 1300 шагов
- wait_until:
condition:
lambda: 'return id(motor).current_position == id(motor).target_position;'
# ==========================================
# ЭТАП 3: ФИКСАЦИЯ НУЛЕВОЙ ТОЧКИ И КАВЕРА
# ==========================================
# Жестко моем мозги шаговику: здесь теперь 0
- stepper.report_position:
id: motor
position: 0
- stepper.set_target:
id: motor
target: 0
# Выставляем Cover в состояние "Закрыто".
# В Home Assistant 0.0 - это закрыто (0%), а 1.0 - это открыто (100%).
- cover.template.publish:
id: valve_cover
position: 0.0
binary_sensor:
- platform: gpio
pin: P8
id: reed_switch
name: "Герконный сенсор"
# Кнопка для ручного перезапуска скрипта калибровки прямо из интерфейса
button:
- platform: template
name: "Run Calibration Script"
id: run_cal_btn
on_press:
- script.execute: calibrate_stepperФинальные доработки и автоматизация
При монтаже устройства вылезли еще некоторые косяки. Во-первых, монтаж оригинального проекта производился на другой грани механизма (к верхней части над окном). В ремиксе проекта крепление верное, но, на мой взгляд, крайне хлипкое. Так что я взял оригинальное, и доработал его во FreeCAD.

Во-вторых, защелка окна оказалась слишком короткая. Из-за чего после полного открытия форточка не могла закрыться, упершись в корпус привода. Пришлось удлинить на 2 мм.

Для фиксации защелки в оригинале используется винтик, но это неудобно, если нужно вручную открыть окно (помыть, например). Я просто вставил мини-отвертку в качестве фиксатора. Вытащил — и окно свободно открывается. Теперь удобно!
Плюс не хватало укладочных креплений для проводов. Нарисовал свои.


Наконец, чисто косметическая проблема горба на стыке двух половинок корпуса. Решил ее металлической пластиной, которую посадил на один из винтов корпуса.

После этого, наконец, основной проект был завершен.

Осталось добавить органы управления на панель в HomeAssistant.

Поехали!

Естественно, ускорение сумасшедшее. Реальная скорость представлена на предыдущем гифе. Эх, чудес не бывает...
Напоследок решил сделать автоматизацию для завершения проветривания по температуре. Сейчас на улице достаточно холодно, а в комнате есть датчик в умной лампе, которую я тоже как-то собирал. С помощью автоматизаций я связал снижение температуры с кнопкой закрытия окна. Довольно кустарно, но это работает.

Теперь перед отходом ко сну я ставлю проветривание, и сплю уже со свежим воздухом в комнате. Красота! А форточка сама захлопывается, когда становится слишком холодно. Причем, несколько раз я уже засыпал до закрытия. То есть работает она настолько бесшумно, что не будит своим перемещением в тихой комнате. Хотя в целом, работает она не сказать, чтобы совсем бесшумно. Но звук не раздражает, слышно только слабое гудение катушек шагового движка.
Финальные мысли
Уже прикупил датчик углекислого газа SCD40, планирую его разместить в другом умном устройстве, о котором пойдет речь в следующей статье. С его помощью я смогу в HomeAssistant полностью прописать автооткрытие и автозакрытие. Наконец-то дома появится весенний свежий воздух! В целом, ради этого все и задумывалось.

По итогу, мне понравился и сам проект, и процесс его адаптации. По бюджету дороже всего вышла пластмасса. С учетом непропечаток и прочего — рублей 200-250. Контроллер я выдрал из лампочки за 100 рублей (все еще остались блок питания и светодиоды), мотор с драйвером стоил рублей 130. Гвоздей, наверное, рублей на 20 потратил. В общем, рублей 500 по материалам вышло :)
Конечно, и времени потратил достаточно, но зато с удовольствием! И хлама теперь поменьше валяется… Да, это не цельнометаллический механизм, и мотор без переделки не столь мощный и быстрый. Но устройство вполне удобное и законченное. Статья, тем временем, тоже подошла к концу. Спасибо за внимание! Ну и напоследок...

И, если первый этаж, с улицы открыть, думаю, не сложно будет.
Лучше уж без него, чем лишать себя нормального управления окном и поганить все это таким колхозом, без обид.
На голубом сайте полно готвого и для откидывания и для открывания от 1.9к, причем в готовом виде и корпусе, смысл?
Ну и для уменьшения размера, конечно, просится актуатор.
И, не в обиду автору, проект выглядит не как изделие, а как поделка. Хотя объем работ проделан не маленький…
но это реально весьма дешевая алтьтернатива например бризеру:
— сам бризер — 18-30 тыс рублей (а посмотрите, сколько tion стоят)
— подготовка места под него (отверстие в стене, диаметр 100-200 mm(sic!), подвод электричества) — думаю 6-10 тыс.
и это еще если повезет, и вы место под бризер подходящее найдете на стене!
а тут автор конечно лукавит, что 500 рублей поскольку:
— пластмасса (и принтер чтоб распечатать!!!)
— тихий шаговик
— одноплатник на esp
— сетевая инфраструктура ( wifi, HA)
— металические части(всякие шурупы) конечно нужно использовать неокисляемые и нержавеющие — иначе и без того, какой
видок, будут еще добавлены подтеки ржавчины через год-два.
— прямые руки
— смелость испоганить окно ( 8-) ) но окошко в конце концов несложно и восстановить, в отличии от громадной дырищи в стене!
но это никак не 24-40 тыс рублей! — тыс 4-5 максимум. ну и опыт — бесценно!
Нравиться мне все-таки DYI рубрика на PlusPda.
Очень вдохновляет!
Хотя тридцатка сейчас вообще ни о чем…
Короче полная фигня долго, дорого, уродско, ненадёжно. ТС случаем не инженер АвтоТАЗа? Там тоже любят такие поделки вкорячивать.