Автоматизация закрытия и открытия рулонных штор

Если раньше говорили: «Лень — двигатель прогресса», то теперь можно немного изменить пословицу «COVID и лень — двигатель прогресса». Уже неоднократно авторы самоделок указывают на причину, по которой они взялись за какой-либо проект — коронавирус и в связи с этим изоляцию.
Автора этой самоделки тоже подбила взяться за работу изоляция. Он проводил много времени на балконе, и его очень раздражало то, что каждый день приходилось опускать и поднимать шторы. Тогда он решил автоматизировать процесс.

Автоматизация жалюзи — распространенный проект, но почти все примеры, которые он нашел до сих пор, управляли жалюзи с помощью цепь или вращая небольшой поворотный вал. У него балконная штора большая и тяжелая, 8 футов (2,4 м) шириной и весит 8 фунтов (3,6 кг). Для ее опускания/подъема используются рукоятка и штанга, а не типичный механизм, который автоматизировали в других проектах.
Мастер нашел мощный двигатель, разработал схему и запрограммировал микроконтроллер. Для управления процесса подъема/опускания он установил переключатель с кнопками вверх / вниз и использовал NFC для отображения положения шторы. Так же он подключил все к Интернету и шторой можно управлять через голосовые команды Google Assistant.

Демонстрацию работы устройства можно посмотреть на видео.

Инструменты и материалы:
-Плата ESP32;
-Модуль NFC PN532;
-Серводвигатель;
-Водонепроницаемый пластиковый ящик;
-Кронштейн для подключения двигателя к кривошипу;
-Конструктивные элементы для монтажа;
-Удлинительные провода для сервопривода;
-Резистор 330 Ом 2 шт;
-Резистор 220 Ом;
-Резистор 1 кОм;
-Понижающий модуль;
-Штыревой разъем;
-Клеммная колодка;
-Водонепроницаемые кнопки;
-Акриловый лист;
-Адаптер питания;
-Печатная плата;
-Паяльные принадлежности;
-Слесарный инструмент;

Полностью код, схему и эскиз для печатной платы можно скачать здесь.

Шаг первый: серводвигатель
Балконная штора довольно тяжелая, и это стало определяющим фактором при выборе двигателя. Нужно было найти что-то достаточно мощное, чтобы сдвинуть эту штору.

Мастер нашел достаточно мощный двигатель, который в сочетании с сервоприводом вполне подойдет для данной задачи. Для поднятия или опускания шторы мастеру нужно повернуть рукоять 60 раз. Серводвигатель имеет характеристику 31 об / мин. Т.е. подъем займет около двух минут.

Для подключения мотора к кривошипу мастер приобрел кронштейн. Проверил работу в обоих направлениях.

Шаг второй: установка двигателя
Важно установить двигатель таким образом, чтобы проушина вращалась плавно. Согласование вращения двигателя с вращением кривошипа оказалось довольно сложной задачей. Любое несовпадение плоскостей вращения двигателя и кривошипа может вызвать трение, которое повредит механизм шторы или двигатель.

На сайте мастер нашел и заказал различные скобы, кронштейны и т.д. С помощью ни он закрепил двигатель соосно проушине.

Шаг третий: построение схемы
Мастер хотел начать с малого — построить схему с двумя кнопками, которые могут вращать двигатель в обоих направлениях. Управление будет осуществляться через Arduino.

Код довольно прост — каждая кнопка подключена к выводу на Arduino, и код всегда считывается с этих выводов, чтобы определить, когда кнопка нажата.
 Показать / Скрыть текстvoid loop() {
// Reading the value in the pins connected to the buttons.
// Normally returns HIGH, while pressing the button it returns LOW
btnUpCurr = digitalRead(PIN_UP_BTN);
btnDownCurr = digitalRead(PIN_DOWN_BTN);

// The UP button is pressed
if (btnUpCurr == LOW && btnUpPrev == HIGH) {
// If the motor is already spinning — stop it
if (raisingShade || loweringShade) {
stopShade();
} else {
raiseShade();
}
}

// The DOWN button is pressed
if (btnDownCurr == LOW && btnDownPrev == HIGH) {
if (raisingShade || loweringShade) {
stopShade();
} else {
lowerShade();
}
}
}
Двигатель также подключен к контакту Arduino, управление которым осуществляется с помощью API, который является частью библиотеки Servo Arduino.
 Показать / Скрыть текстvoid lowerShade() {
myServo.attach(PIN_SERVO);
// Value smaller than 1500 will spin the motor counter-clockwise
myServo.writeMicroseconds(850);
loweringShade = true;
raisingShade = false;
}

void raiseShade() {
myServo.attach(PIN_SERVO);
// Value larger than 1500 will spin the motor clockwise
myServo.writeMicroseconds(2100);
raisingShade = true;
loweringShade = false;
}
После тестирования и проверки работы этой простой схемы мастер решил перейти с платы Arduino на более компактный и мощный микроконтроллер — ESP32.

Работа с ESP32 очень похожа на работу с платой Arduino, поскольку обе используют IDE Arduino и имеют много общих библиотек. ESP32 поддерживает WiFI, который будет полезен на более позднем этапе. Небольшой размер модуля также является важным фактором.

Шаг четвертый: сборка первого прототипа
Чтобы протестировать устройство мастер собирает его на печатной плате. Для питания он использует батарею 7,4 В. Также были установлены две кнопки.

Двигатель может потреблять до 7,4 В, в соответствии с его спецификацией, поэтому он использует батарею на 7,4 В, которая подключается непосредственно к двигателю. Однако для ESP32 нужно снизить напряжение до 5 В. Мастер добавил понижающий преобразователь постоянного тока, который преобразует 7,4 В батареи в 5 В, питающие ESP32.

Он использовал прототип в течении нескольких недель, и все отлично работало. Управлять шторами было очень удобно, а мотор поднимал эту тяжелую штору, без затруднений.

Была только одна проблема — полной батареи хватило всего на 5 дней. Это довольно мощная батарея с большой емкостью, поэтому он сделал некоторые расчеты. Двигатель потребляет от 200 мА до 3000 мА во время работы. Большую часть времени ESP32 находится в режиме ожидания и потребляет 50 мА. Батарея 6200 мАч. Значит она может питать устройство 50 мА в течение 124 часов (6200/50 = 124), что чуть более 5 дней.
После расчетов он решил, что лучшее решение — просто демонтировать аккумулятор. Он установил разъем и подключил адаптер питания с напряжением 7,5 В.


Шаг пятый: поддержка автоматической остановки с помощью NFC
Для поднятия или опускания шторы нужно нажать всего одну кнопку, но остановка двигателя тоже производится вручную. Т.е. нужно подождать и нажать снова кнопку, чтобы выключить двигатель. Мастер хотел автоматизировать и этот процесс.

Самый простой — измерить время, необходимое для полного открытия / закрытия шторы, а затем прописать это время в коде.
Другой вариант — использовать датчик Холла. Наклеить на штору 2 магнита, один вверху, а датчик закрепить на стене.

Мастер решил попробовать третий способ — использовать NFC для считывания маркеров положения. Используя NFC, можно считывать теги размещенные шторе. Таким образом можно контролировать степень открытия шторы. Например, «100% открыт», «50% открыт» и т.д.

PN532 является самым популярным устройством для этих целей. Практически все мобильные телефоны, поддерживающие NFC, используют этот чип, используемый для таких вещей, как беспроводные платежи или обмен данными между соседними устройствами. Он подключил PN532 к основной схеме контроллера шторы, используя протокол связи I2C.

Работа с модулем NFC PN532 несложная. Мастер использовал библиотеку Adafruit PN532, у которой есть отличный API для связи с модулем NFC, но возникла проблема. В режиме ожидания нельзя пользоваться кнопками для подъема или опускания шторы. Тогда ему пришлось внести некоторые изменения.
 Показать / Скрыть текст // The DOWN button is pressed
if (btnDownCurr == LOW && btnDownPrev == HIGH) {
if (raisingShade || loweringShade) {
stopShade();
} else {
lowerShade();

// Puts the NFC reader on a listening mode, a NON-BLOCKING call
nfc.startPassiveTargetIDDetection(PN532_MIFARE_ISO14443A);
listeningToNFC = true;
}
}
Во время ожидания тегов NFC контроллер постоянно отслеживает значение вывода IRQ на модуле NFC (желтый провод на схеме выше). Когда IRQ переходит с HIGH на LOW, нужно прочитать информацию о теге / карте NFC.
 Показать / Скрыть текст irqCurr = digitalRead(PN532_IRQ);

// If the NFC reader is currently listening and we’re notified via the
// IRQ line that a card was detected
if (listeningToNFC && irqCurr == LOW && irqPrev == HIGH) {
// Read the detected NFC tag's info
success = nfc.readDetectedPassiveTargetID(uid, &uidLength);

if (success) {
// If the tag is valid, we'll read its ID
uint32_t cardId = getCardId(uid, uidLength);
if (cardId == CARDID_0_PERCENT) {
if (loweringShade) {
// Found the "0% open" position tag while lowering the shade,
// we can stop because the shade is now fully closed
stopShade();
listeningToNFC = false;
}
} else if (cardId == CARDID_100_PERCENT) {
// Similar implementation as above.
// Stop raising the shade when the CARDID_100_PERCENT tag is detected,
// since the shade is now fully open.
}
}
}<br>
С этими изменениями кнопки вверх / вниз всегда работает, и двигатель можно остановить либо нажатием любой из кнопок, либо, когда устройство чтения NFC считывает соответствующий тег NFC.

Дальше мастер закрепляет метки на шторе, а считыватель рядом со шторой. Он использовал лист акрила. Акрил согнул и закрепил на стене, а на нем закрепил считыватель. При движении штора скользит по акрилу и метки совмещаются с считывателем.

Прежде чем добавлять дополнительные функции программного обеспечения, он решил немного оптимизировать устройство.
Первым делом он установил водонепроницаемую распределительную коробку. В бокс переместил схему и модуль NFC. Коробку с модулем закрепил на пластиковый лист. После этого убрал старую распределительную коробку, которая была установлена на стене.
Затем обрезал часть акрилового листа.

Шаг шестой: печатная плата
Дальше мастер решил сделать для устройства плату.
Раньше он никогда не проектировал печатные платы, и опыт был полезен. Для проектирования платы они использовал программу EasyEDA. Затем заказал плату на одном из ресурсов.

Шаг седьмой: голосовое управление
Это изменение, которое превращает контроллер в «умный контроллер».
Прежде чем заставить Google Assistant отправлять команды устройству, нужно найти способ коммуникации. ESP32 поддерживает Wi-Fi и может подключаться к домашнему маршрутизатору. Самый распространенный протокол для связи с IoT и встроенными устройствами — это MQTT — облегченный протокол обмена сообщениями.

Чтобы настроить MQTT он использует облачный сервис. На Adafruit IO, создал учетную запись и добавил новый канал для своего проекта.
Далее обновил код.
 Показать / Скрыть текстAdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);

// Adafruit IO feed for how much the shade should be open (either 0% or 100%)
AdafruitIO_Feed *balconyShade = io.feed("shade-open");

boolean connectingInProgress = false;

void loop() {
// Keep the connection alive, if already connected.
// Times-out after 400ms to keep the microcontroller responsive.
aio_status_t ioStatus = io.run(400, true);

// Connect to Adafruit IO, if connected then subscribe to the feed
if (ioStatus < AIO_CONNECTED && !connectingInProgress) {
connectingInProgress = true;
io.connect();
} else if (ioStatus >= AIO_CONNECTED && connectingInProgress) {
connectingInProgress = false;

// Subscribe to the "shade-open" feed
balconyShade->onMessage(handleShadeLevelMessage);
}
// …
}<br>
Связь с облачной службой поддерживается вызовом io.run (), который является частью функции основного цикла. Когда новое сообщение отправляется на канал «shade-open» каким-либо другим клиентом, который также подключен к облачной службе, вызывается функция обратного вызова handleShadeLevelMessage ().
[code]// This function is called when a new message is sent to the “shade-open” feed.
void handleShadeLevelMessage(AdafruitIO_Data *data) {
// Got a new message with the percent the shade should be open
int percentOpen = atoi(data->value());

// If we're asked to open the shade to 100%, then raise it.
// Open to 0% means closing/lowering the shade.
if (percentOpen == 100) {
raiseShade();
} else if (percentOpen == 0) {
lowerShade();
}
// …
}[/code]
Функция обратного вызова считывает новое сообщение и соответственно закрывает или открывает штору.

Устройство уже может принимать команды из Интернета с помощью MQTT,и если мы хотим, чтобы Google Assistant управлял им, нужно соединить их.

IFTTT (If-this-then-that) — инструмент для подключения различных веб-сервисов и продуктов друг к другу. Он уже поддерживает интеграцию с Google Assistance и Adafruit IO, поэтому все, что нужно было сделать, это пройти аутентификацию в обоих сервисах и создать «апплеты» для связи между ними.

Для управления контроллером он создал апплет, который реагирует на команду Google Assistant и отправляет сообщение на канал «открытие шторы» в его учетной записи Adafruit IO. Например, когда он говорит: «Окей, Google, откройте штору балкона», IFTTT отправит на канал сообщение «100». Контроллер шторы получает это сообщение через Adafruit IO и поднимает штору, пока не достигнет тега NFC, который сигнализирует, что штора открыта на 100%.

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

Источник (Source)

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Подборки: голосовое управление NFC

Источник: usamodelkina.ru

Понравилась статья? Поделиться с друзьями:
KIA