У меня есть крутой чайник. У многих есть крутой чайник. Вскипятит воду в мгновение ока. Тем не менее, если вы правильно завариваете чай, вы знаете, что полностью прокипяченная вода при температуре 100 ° C буквально испортит хрупкие листья зеленого чая.

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

Но есть одна проблема. Что делать, если я не хочу выбрасывать свой?

Да, я мог бы попытаться продать его. Да, я мог бы забыть о 30 долларах, которые он стоил мне три года назад. Да, я мог бы выбросить его и забыть об экологических последствиях, которые он имел при производстве и будет иметь при уничтожении.

Вопрос получше: можем ли мы, начиная с нуля, создать продукт, сделать его действительно умным и заставить электрический чайник с регулируемой температурой выпрашивать его? Назовем его Kettle Manager!

TL;DR + Предпочитаете движение? 📹 Видео на YouTube

0. Требования пользователя

Отличным способом начать было бы составить список крутых вещей, которые должен обеспечивать продукт:

  1. кипячение воды до определенной температуры,
  2. Оставаясь ненавязчивым и невзламывающим.

Давайте углубимся. Требование 1 — основная цель продукта, здесь нечего объяснять. Требование 2, возможно, на данный момент является натяжкой, но я должен упомянуть об этом. Я не хочу возиться со своим чайником, и ты тоже. Он должен быть полностью работоспособен сам по себе. Оставьте беднягу жить, пожалуйста!

1. Прототип: Raspberry Pi и машинное обучение

1.0. Компоненты

Начнем с Raspberry Pi 2, который лежал без дела. Это вполне может быть любой Raspberry Pi, при условии, что он поддерживает WiFi (здесь с дешевым ключом).

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

Ключевым компонентом является датчик температуры, подключенный к зеленой макетной плате, которая представляет собой версию обычного DS18B20 с водонепроницаемым кабелем, простую в использовании благодаря трем проводам с самодельными платами, такими как Pi.

Для управления взаимодействием с пользователем использовался ЖК-дисплей, подключенный к желтой макетной плате (потому что он снова валялся без дела, самодельные духи). Он управляется поворотным энкодером, небольшим электронным компонентом, который позволяет прокручивать и щелкать, что удобно для навигации по меню.

Последним шагом является синее реле, подключенное к синей макетной плате, показанной в повторно используемом (который валялся) напечатанном на 3D-принтере корпусе, управляющем заземленным удлинителем, подвергшимся вандализму ( оранжевый), к которому подключаем чайник.

Красная макетная плата обрабатывает ввод питания, а именно 3,3 В, используемые для всех модулей, кроме дисплея (который использует 5 В).

Краткое изложение ведомости материалов (BOM) нашего прототипа:

1x Raspberry Pi (с поддержкой WiFi)

1 микро SD

4x мини-макет

1x водонепроницаемый датчик температуры DS18B20

1x 4,7K резистор

Несколько перемычек

1x «синее реле» SRD-05VDC-SL-C

1x удлинитель с заземлением

1.1. Подготовка нашего вычислительного модуля

Давайте сначала установим прошивку Raspberry Pi. Скачайте новый автоматизированный Raspberry Pi Imager с официального веб-сайта (доступно для Windows, macOS и Ubuntu). Мы будем использовать RASPBIAN PI OS в качестве операционной системы, а наша SD-карта была GENERIC MASSST… (вы должны проверить ее размер, чтобы вы не в конечном итоге записываете на свой жесткий диск!Это, вероятно, ‹ 100 ГБ). Нажмите НАПИСАТЬ.

Прежде чем снять его с вашего компьютера, мы настроим там Wi-Fi, поэтому нам не нужно будет подключать его к дисплею и клавиатуре при первой загрузке.

Примечание. это не обязательно, вы также можете использовать клавиатуру и дисплей HDMI для запуска системы и ее графической настройки.

Давайте выполним два полезных шага после открытия вашей SD-карты (с именем boot);

  • Создайте текстовый файл без расширения с именем ssh в корне каталога;

  • Создайте текстовый файл без расширения с именем wpa_supplicant, в который мы запишем настройки безопасности вашей сети Wi-Fi, заменив MY_NETWORK_NAME и MY_NETWORK_PASSWORD соответствующими значениями, в кавычках, как показано ниже.

country=us
update_config=1
ctrl_interface=/var/run/wpa_supplicant
network={
 scan_ssid=1
 ssid="MY_NETWORK_NAME"
 psk="MY_NETWORK_PASSWORD"
}

Теперь, когда SD-карта подготовлена, ее можно вставить в специальный слот Raspberry Pi, как показано на следующем рисунке. Вы также должны подключить свой WiFi-ключ для старых моделей, которые не имеют его встроенного (3+ делают), а также источник питания micro USB (вы должны убедиться, что предоставленного тока достаточно, стремясь к 2A, чтобы обеспечить лучшее представление).

Карта должна загрузиться (с мигающими лампочками), и через некоторое время она должна быть подключена к вашей сети Wi-Fi и должна быть доступна по адресу octopi.local (если нет, вы должны искать ее IP-адрес вида 192.168). .XX в настройках беспроводной сети маршрутизатора) и следующие команды.

$ ssh -p raspberry [email protected]
$ git clone https://github.com/pierremtb/kettle-manager
$ cd kettle-manager
$ pip3 install -r requirements.txt

В то время как первая команда подключает вас к Pi с паролем по умолчанию raspberry , вторая клонирует исходный код всего продукта и попадает в каталог с третьей. Наконец, устанавливаются предопределенные зависимости Python 3.

Теперь мы полностью готовы рассмотреть каждый модуль поближе.

1.2. Чтение данных с помощью модуля температуры

Датчик температуры, выбранный для этого приложения, является универсальным датчиком с элегантным названием DS18B20. Для него существует несколько форм-факторов, и в нашем приложении нам нужен водонепроницаемый вариант с кабелем, так как мы погрузимся в чайник для целей калибровки. Вот как выглядит наша версия.

  • Желтый: провод заземления.
  • Красный: провод питания, требуется 3,3 В.
  • Зеленый: провод данных.

По сравнению с другими более простыми устройствами, которым может потребоваться только считывание состояния LOW/HIGH контактов GPIO, датчик термометра должен отправлять данные по протоколу 1-wire, отправляя цифровое значение температуры.

Нам нужно использовать интерфейс «1-wire» на Raspberry Pi, что произойдет с портом BCM 4, как показано на схеме синим проводом. Здесь мы используем дополнительную мини-макетную плату для подготовки линий электропередач, чтобы потом можно было запускать другие модули. Мы видим на мини-макете справа (зеленый на фото) резистор 4,7К, соединяющий красный провод 3,3В с синим проводом данных, соединенным с выходом датчика. Вот снимок проводки.

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

  • В классе initialization мы запускаем две команды modprobe, чтобы включить некоторые специальные режимы 1-wire, созданные для этого типа датчиков. Затем мы ищем странный каталог с glob() в /sys/bus/w1/devices и сохраняем его, поскольку он будет местом хранения нашей температуры;
  • Когда запрашивается чтение, мы открываем этот каталог и делаем преобразования, чтобы вернуть правильное чтение.

1.3. Отображение информации с помощью модуля дисплея

Хорошо, когда система считывает температуру, но иметь возможность показывать ее необходимо. Мы используем обычный ЖК-дисплей 16x2, которым можно напрямую управлять с помощью GPIO Raspberry Pi без какого-либо интерфейса, хотя для этого требуется много проводов.

Примечательно, что некоторые из этих дисплеев поставляются с интерфейсом I2C и, следовательно, требуют всего 4 провода. Мой второй сделал, поэтому я обновил репозиторий соответствующим образом, но я оставлю здесь скрипты нетронутыми.

Этот модуль не использует макетную плату питания 3,3 В (красную), потому что, в отличие от всех других компонентов, этому дисплею требуется 5 В. Мы создадим две линии питания непосредственно на выделенной (желтой) макетной плате, а также дополнительную линию резистора, которая будет управлять контрастностью дисплея.

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

  • Мы распознаем номера контактов GPIO, определенные как постоянные в верхней части файла, где RS, E и DB управляют дисплеем, как указано на диаграмме выше, а также POWER для модуля коммутатора, который мы перейдем через позже.
  • __init__ вызывается для создания класса и устанавливает различные модули, которые будут использоваться, а именно модуль температуры (температура), модуль кнопок (кнопка), модуль переключателя (переключатель) и модуль сервера (модель). Эти последние четыре модуля будут подробно описаны в следующих разделах.
  • init_menu создает различные разделы и подразделы меню, которые мы создаем переиспользуя код из библиотеки RpiLCDMenu (форк для I2C)
  • Остальные методы являются слушателями событий этого меню и довольно просты.

1.4 Взаимодействие пользователя с кнопочным модулем

Проектирование системы, имеющей какое-либо взаимодействие с человеком, — это всегда компромисс между доступностью и наименьшим количеством подсистем (кнопок, переключателей, колесиков и т. д.). В этом случае Rotary Encoder — это именно то, что нам нужно как для прокрутки пунктов меню, так и для выбора щелчком мыши. Это то, что можно найти в паре с дисплеем того же типа, например, в недорогих 3D-принтерах.

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

Для этого кнопочного модуля в коде практически ничего не происходит, так как есть легкодоступный пакет Python, названный в честь его кодового имени ky040, установленный ранее как часть зависимостей.

Сверху мы видим константы, определяющие контакты GPIO, используемые для подключения, а именно 5 (зеленый кабель), 6 (желтый кабель), 13 (синий кабель).

1.5 Завершение цикла: модуль коммутатора

Теперь наступает опасный раздел ⚠️: управление реальным электричеством. Нашему электрическому чайнику требуется напряжение 110 В, и это не то, что вы хотите, чтобы ваше тело испытывало (эти реле также могут работать с европейским напряжением). При выполнении любых модификаций убедитесь, что все устройства отключены от розетки.

Синие реле — это дешевое и эффективное решение для создания удлинителя, управляемого Raspberry Pi, поскольку они обеспечивают 1-контактный интерфейс (IN) наряду с обычными контактами питания (VCC и GND).

Можно заметить, что на стороне реального тока входов три, а нам нужно всего два, чтобы разомкнуть «цепь» чайника, либо земля в удлинителе, либо плюсовой провод. Это связано с двумя различными вариантами, которые нам предлагаются:

  • Нормально разомкнутый: если на контакт IN не подается ток, ток не будет течь между двумя входами;
  • Нормально закрытый: если на контакт IN не подается ток, ток будет течь между двумя входами.

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

Однако невозможно правильно управлять переключателем, напрямую подключив контакт IN к контакту GPIO Raspberry Pi, как можно было бы ожидать, потому что обеспечиваемое напряжение недостаточно велико, чтобы полностью достичь порога. Обходной путь включает в себя NPN-транзистор, управляющий полной линией питания 3,3 В, отбираемой от Pi, что приведет к срабатыванию порога, но именно NPN будет управляться GPIO.

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

1.6 Прогнозирование времени кипения: интеллектуальное облачное программное обеспечение

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

  1. благодаря тому, что он всегда находится прямо внутри чайника (в конце концов, он водонепроницаемый);
  2. закрепив его на металлической стороне чайника и найдя способ учесть разницу температур внутри и снаружи.

Однако оба эти подхода имеют оговорку о том, что чайник не может нормально работать. Действительно, 1. нам потребовалось бы каждый раз вставлять и вынимать датчик — или найти способ проложить его постоянно, но нужно было бы внести изменения на стороне чайника, плюс мне было бы неудобно пить кипяченую воду с помощью чайника. в ней дешёвый пластиковый датчик. И 2. предотвратит, например, унесение горячего чайника на журнальный столик, потеряв первоначальную гибкость глупого, но не такого уж глупого чайника.

Вот почему мы выбрали вариант 3., а именно:

3. время от времени помещая его прямо в чайник для калибровки

Если построить статистическую модель температуры по времени закипания, то можно изменить процесс управления офлайн/онлайн:

  • Мы применяем предварительный этап «калибровки», который зафиксирует переход от холодной воды к кипящей воде и обучит модель;
  • В обычное время использования пользователь выбирает целевую температуру, и модель обеспечивает соответствующее время кипения.

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

Обучение нейронной сети, даже простой, — задача слишком дорогая для Raspberry Pi. Тем не менее, в одной из самых распространенных библиотек глубокого обучения, TensorFlow, есть кое-что, созданное именно для такого сценария: TensorFlow Lite, модуль, способный запускать уже обученные модели и предназначенный специально для устройств IoT, таких как Raspberry Pi.

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

Вот наша небольшая модель нейронной сети, определенная на стороне сервера с помощью обычной библиотеки TensorFlow. Мы видим, что используется один скрытый слой из 64 нейронов (№15) с нелинейностью ReLu. Модель обучается с помощью оптимизатора Adam (#19). Это очень стандартная установка.

Мы используем простой API, чтобы сделать эту модель доступной на сервере, как показано ниже. Два важных метода:

  • post_data используется для отправки данных калибровки для обучения модели;
  • get_model , используемый для получения версии модели, преобразованной в TensorFlow Lite, для локального использования Raspberry Pi.

Это можно настроить за считанные минуты у поставщиков облачных машин, таких как AWS или GCP, и у обоих есть бесплатный уровень для начала работы. Например, на AWS LightSail:

После создания вы можете использовать кнопку «Подключиться с помощью SSH», которую нельзя пропустить, которая откроет командную строку на сервере, в которой вам нужно выполнить следующие команды.

$ git clone https://github.com/pierremtb/kettle-manager-server
$ cd kettle-manager-server
$ python3 -m pip install requirements.txt
$ python3 src/api.py

Со стороны Raspberry Pi нам просто нужен еще один класс, который будет определять несколько фрагментов кода, необходимых для связи с сервером. Вам нужно будет соответствующим образом обновить BASE_URL.

1.7 Программа

Давайте теперь создадим точку входа, которая будет вызывать все эти модули следующим образом, по соглашению в виде файла main.py, показанного ниже. Мы импортируем основные модули — отметив, что Display охватывает другие — и создаем бесконечный цикл с комбинацией печально известных while True и time.sleep.

Чтобы он работал при запуске платы (т. е. при включении продукта), мы создаем launcher.sh, который выполняем в /etc/profile.

$ echo "cd kettle-manager//npython3 src/main.py" > ~/launcher.sh
$ sudo echo "sh launcher.sh &" > /etc/profile

Убедитесь, что вы установили безголовый автологин, запустив

sudo raspi-config

и выбираяBoot Options > Desktop/CLI > Console Autologin > Finish.

2. Создание красивого корпуса: 3D-печать

Теперь, когда у нас есть полностью рабочий прототип, давайте подумаем об упаковке, которая позволила бы использовать его на нашей кухне, а не только в лаборатории электроники. Хотя раньше это было проблемой, с точки зрения знаний, навыков и стоимости, как современное программное обеспечение для автоматизированного проектирования, так и недорогие настольные решения для 3D-печати делают это возможным для любителей.

2.1 Цели

Они двояки:

  1. Оказывать минимальное влияние на дизайн
  2. Установите все компоненты прототипа

В то время как первое очень понятно, второе — это скорее направление, которое мы хотим сохранить в этом руководстве: да, мы хотим стремиться к продукту, но мы не хотим жертвовать модульностью и возможностью повторного использования компонентов. Если любитель решит, что дать воде закипеть — это нормально, и что эти кабели и детали электроники лучше использовать в другом месте, пусть будет так!

2.2 Дизайн

Мы остановились на Autodesk Fusion 360 в качестве нашей платформы САПР, которая является облачной, многоцелевой и имеет бесплатный план для любителей, объединяющий все, что нам нужно. Он также интегрируется с Ultimaker Cura, программным обеспечением, которое мы будем использовать для преобразования модели в формат языка печати.

В дополнение к целям, которые мы только что обсудили, мы должны принять во внимание метод 3D-печати, используемый для получения деталей в конце, который представляет собой моделирование методом наплавления, которое имеет свои собственные ограничения, такие как максимальный угол 45 градусов с вертикалью. ось для свеса, если нужно ограничить использование поддержек.

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

Вот пост Thingiverse с различными готовыми к печати моделями STL (альтернативная ссылка), а также полный продукт Fusion 360 с загружаемыми исходными файлами в различных форматах.

2.3 Распечатать!

Мы использовали принтер Creality Ender 3 для изготовления этих дизайнов, которые надежны и недороги для любого новичка и даже опытного в настольной 3D-печати.

Слайсер Ultimaker Cura предоставляет отличный интерфейс для преобразования моделей STL в G-код, язык, на котором говорят промышленные машины и наш принтер. Однако некоторые принтеры имеют собственную встроенную программу нарезки и могут выполнять этот шаг автоматически.

Вот таймлапсы.

После того, как все собрано, конструкция становится реальностью. В этот момент он чувствует себя очень хорошо.

3. Идем дальше: продукт

Будет ли эта идея иметь место на рынке? Невозможно сказать, идеи стоят дешево, хорошие исполнения стоят миллионы.

3.1 (Не очень) легкий путь

Учитывая, что общая спецификация (ведомость материалов) составляла около 50 долларов США для прототипа, мы, вероятно, могли бы стремиться к цене 9,99 или 19,99 долларов США в зависимости от качества, к которому мы стремимся. Это потребует перепроектирования всей системы, от создания печатных плат (PCB) до проектирования пресс-форм или многих других ограничений проектирования для производства (DFM).

Чтобы быть устойчивыми и избежать повторяющихся затрат, нам нужно было бы вернуть аспект обучения в автономный режим, что было бы не так уж сложно, учитывая простоту задачи моделирования. Тем не менее, такое простое устройство было бы так легко клонировать, что мы бы увидели появление подражателей в течение нескольких недель по невероятной цене, например, 4,99 доллара.

Хотя копирование часто означает, что вы что-то делаете, вам все равно нужно быть в состоянии конкурировать, а глупые продукты массового рынка не приведут к достаточной узнаваемости бренда, чтобы сбалансировать это.

3.2 Путь приключений

Что, если бы мы больше использовали сегмент Интернета вещей (IoT) нашего Kettle Manager? С его помощью продукты могли бы приносить больше пользы, чем просто прогнозировать время кипения: например, отслеживание гидратации было бы интересным направлением.

Специальное приложение и связанная учетная запись действительно могут регистрировать воду, которую вы подаете для нагрева, и предоставлять вам полезную информацию о том, сколько вы пьете. Чтобы действительно представлять ценность для пользователя, эти данные можно будет экспортировать на распространенные медицинские платформы, поддерживающие отслеживание гидратации, такие как Apple Health, Samsung Health или Runtastic.

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

Сочетая эти аспекты с необходимым программным обеспечением и облачной инфраструктурой, он вполне может продаваться по цене 49 долларов, что чуть ниже среднего чайника с регулируемой температурой, и сосредоточиться исключительно на предоставлении ценности клиентам, а не на конкуренции.

Подведение итогов

  • Определение требований и целей пользователя
  • Повседневное применение методов машинного обучения
  • Использование Autodesk Fusion 360 в качестве полноценной платформы САПР/рендеринга
  • Быстрый сбой и повторение соответственно с 3D-печатью