Почему самодельный?
Можно было купить готовый модуль, несмотря на его совершенно конскую стоимость в 6-7 тыс. рублей. Однако он не предоставлял наиболее востребованную для меня функциональность: не позволял открывать ворота автоматически «из коробки» при приближении к своему участку на автомобиле. Ну и, естественно, экономия на порядок тоже сыграла не последнюю роль.
Был выбран следующий способ реализации основной задачи: WiFi модуль в автомобиле пытается зарегистрироваться на домашней точке доступа. Если ему это удается — проверяется уровень сигнала. Если уровень сигнала слабый — значит приближаемся к участку и надо подать команду WiFi модулю на автоматике ворот на открытие. Если сигнал сильный — мы уже на участке и ничего делать не надо. Дополнительная функциональность — управление воротами по WiFi через веб-интерфейс, в том числе и с мобильного телефона.
Если при выезде с участка руки свободны и можно заранее открыть ворота со штатного пульта, то при подъезде к участку нащупывать кнопку на пульте отвлекаясь от дороги — не только не удобно, но еще и опасно. При этом ворота открываются относительно медленно и если нажимать кнопку пульта уже подъехав к воротам, то приходится ждать несколько секунд, пока ворота откроются.
Общее описание
Сервер на ESP32-C3 подключается к автоматике ворот и располагается в её же корпусе. Клиенты тоже на ESP32-C3 располагаются в автомобилях моем и жены.
Таким образом возникают два связанных проекта. Первый — аппаратная часть и прошивка для МК серверной части. Второй — прошивка для клиентской части. Аппаратная часть у клиентской части нулевая, так как можно использовать уже готовый модуль ESP32-C3-DEVKITM-1.
В связи с тем, что как раз в это время я занимался изучением Rust, то именно он был выбран в качестве тренировки для первого реального проекта на этом языке. Просто чтобы совместить изучение языка с пользой для дома и семьи. Так же было интересно попробовать не старый ESP32 на Xtensa, а более перспективную линейку на RISC-V.
Подключение к автоматике раздвижных ворот.
Я как раз в этом году установил автоматику раздвижных ворот ALUTECH RTO-1000. С другими моделями я не знаком, поэтому дальнейшее будет относиться только к этой модели. Однако, я думаю, что каких-то принципиальных отличий у других моделей автоматики не будет.
Управление RTO-1000 производится замыканием нормально разомкнутых контактов. Напряжение на входах 30-32 В. Поэтому для коммутации используются MOSFET 2N7000, рассчитанные на 60 В. Датчики положения «Открыто» и «Закрыто» имеют активным высокий уровень 5В. В промежуточном положении оба датчика выдают низкий уровень. Поэтому входы МК подтягиваем к питанию 3.3 В, и подключаемся к выходам датчиков положения через диоды Шоттки 1N5817. Логическую землю МК и RTO-1000 объединяем. Питание МК обеспечиваем импульсным источником питания 220AC-5DC, так как на плате МК уже имеется стаблизатор на 3.3 В, на вход которого и подаются 5В. Остальное хорошо видно на принципиальной схеме.
В схеме используется два управляющих входа автоматики OP и SBS. OP — сигнал, по которому выполняется открытие ворот, вне зависимости от их положения. Если ворота уже открыты — ничего не происходит. SBS (Step-by-Step) — управление одной кнопкой, в зависимости от положения ворот и предыдущего действия. Если ворота закрыты, то по этому сигналу они открываются. Если закрыты, то открываются. Во время движения по этому сигналу они останавливаются. После остановки по этому сигналу они будут двигаться в обратном направлении относительно движения до остановки.
Прошивка сервера
Основной цикл сервера состоит из подключения к WiFi точке доступа и регистрации обработчиков HTTP запросов и мониторинга WiFi соединения. Если соединение пропадает — освобождаем все ресурсы и начинаем с начала. И так до бесконечности.
Основная HTTP страница сервера очень проста и состоит из заголовка, статуса ворот и одной большой кнопки. Нажатие этой кнопки приводит к вызову обработчика Get gate_sbs. Сама страница содержит простейший код на JS, запрашивающий каждую секунду статус состояния ворот вызовом Get gate_status и обновляющего как строку статуса ворот, так и надпись на кнопке.
Обработчик Get gate_status считывает состояние датчиков положения ворот и возвращает JSON {«s»: n}, где n 0 — если ворота открыты полностью, до срабатывания датчика, 1 — если ворота закрыты и 2 — если ворота в промежуточном положении.
Обработчик Get gate_sbs посылает сигнал на вход SBS автоматики длительностью 200 мс. Значение выбрано экспериментально. На 50 мс автоматика не срабатывала вообще, а на 100 мс — не срабатывала через раз.
Обработчки Get gate_open посылает сигнал на вход OP автоматики длительностью 200 мс по тем же причинам.
Прошивка клиента
Основной цикл клиента подобен основному циклу сервера. Подключение к WiFi точке доступа и, в зависимости от уровня сигнала, который был при успешном сканировании точек доступа, посылает сигнал на открытие ворот вызовом Get gate_open HTTP серверу. Затем производится лишь мониторинг соединения с WiFi и если соединение утеряно — освобождаем все ресурсы и начинаем с начала. И так до бесконечности.
Для исключения ложных срабатываний, при потере соединения с точкой доступа делается пауза на одну минуту. Это время, за которое автомобиль должен удалиться из зоны неуверенного приема, в которой возможны обрывы связи.
Уровень сигнала специально берется именно из сканирования, а не при подключении к точке доступа, так как в зоне неуверенного приема возможны разрывы связи и неоднократные попытки подключения к точке доступа.
На практике, у меня в сельской местности МК находит точку доступа на расстоянии 250-300 метров, а уверенно соединяется с ней на расстоянии не более 200 метров. При движении автомобиля со скорость 30-40 км/ч МК вполне успевает соединиться с точкой доступа и послать запрос HTTP серверу за 10-15 секунд до того, как автомобиль подъедет к воротам, что меня вполне устраивает.
В качестве дополнительной функциональности, кнопка Boot на МК, которая замыкает на землю GPIO9 и функциональна только при начальной загрузке ESP32-C3, была использована для вызова обработчика Get gate_sbs, что позволяет обходится вообще без штатного пульта от автоматики. Причем радиус действия у неё намного шире, чем у пульта, ограниченного буквально 20-30 метрами.
Текущее состояние клиента так же отображается на имеющемся в ESP32-C3-DEVKITM-1 трехцветном светодиоде WS2812. Ожидание соединения — желтым цветом. Посылка команды на открытие ворот при приближении к участку — красным цветов в течении одной секунды. Устойчивое WiFi соединение — зеленым цветом. Нажатие кнопки SBS — коротким голубым цветом. Ну и во время минутной паузы после потери соединения с WiFi — фиолетовый цвет.
Заключение
Пока это в статусе прототипа. Основная страница сервера красотой не отличается и совершенно утилитарная. Ни HTTPS, ни авторизации не делал, так как управление только из локальной сети и случая, когда мне может потребоваться управлять воротами находясь на расстоянии свыше 200 метров от них я не придумал.
Код клиента и сервера на GitHub. Процесс тестирования залил на YouTube.
ссылка на оригинал статьи https://habr.com/ru/articles/860380/
Добавить комментарий