Своими руками

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

Автоматизация закрытия и открытия рулонных шторЕсли раньше говорили: “Лень – двигатель прогресса”, то теперь можно немного изменить пословицу “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, голосовое управление и т.д, но он решил пойти от простого к сложному для приобретения новых навыков.

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

Apr

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.