- BrainTools - https://www.braintools.ru -

Меня зовут Владислав Волох, я руковожу группой разработки сервиса DataSphere в Yandex Cloud — и я люблю учить нейросети тому, что делать вручную не хочется. Эта любовь к инженерным решениям и ML пригодилась в быту: так появился мой пет‑проект автомата для приготовления простых коктейлей со встроенной базой рецептов, который уже полюбился многим коллегам.
В этой статье расскажу, как это работает и как я собирал свой аппарат под управлением iOS, не написав при этом ни одной строчки кода.
Однажды друзья подарили мне на День рождения диспенсер для вина. Вину я предпочитаю коктейли, но с этой точки зрения [1] не мог не оценить возможности точного налива: настраиваем устройство на нужное количество миллилитров и смешиваем ингредиенты в нужных пропорциях.
Простота обращения натолкнула на мысль: а что если сделать такими же доступными все популярные (по версии меня) миксы напитков и масштабировать этот диспенсер?
В известных мне DIY‑сообществах, например на Reddit, уже давно мелькало немало реализаций автоматических машин для приготовления коктейлей. Но в большинстве своём они были громоздкими и медленными конвейерными автоматами, и не подходили для домашнего использования.
Особенно вдохновила вот эта история [2].
И вот недавно на рынок вышел капсульный робот‑бармен, который появился на витринах всех маркетплейсов и даже засветился в обзоре дяди Вилсакома.
Новинка меня заинтриговала. Но в ней не хватало нужной гибкости в создании коктейлей: такие модели работают примерно как капсульные кофемашины, производители которых часто зарабатывают на расходниках. Тот же принцип у капсульных коктейльных автоматов: они качают из машины напиток, выбранный в качестве основы микса, а для добавок используют капсулы со смесями разных соков. В результате пользователь может варьировать крепость коктейля (если он на основе алкоголя), но больше степеней свободы никаких нет, да и сам процесс приготовления не особо наглядный. А производитель продаёт капсулы и ёмкости для напитков в виде специальных перевёрнутых бутылочек.
Мне тоже хотелось сделать что‑то вроде кофейного автомата, у которых есть тачскрин с удобным выбором напитка, только для коктейлей. И раз уж это пет‑проект, хотелось обойтись без сложностей с погоней за редкими комплектующими.
Вот полный список требований к устройству, который сформировался:
удобный UI/UX в домашних условиях;
большая свобода в создании коктейлей, с возможностью дозировать разные ингредиенты;
доступность компонентов;
простота обслуживания;
энергоёмкость.
Я порисовал скетчи будущего изобретения, всё казалось простым и понятным. Но тут пришло озарение [3]: я никогда не имел дело с железом больше, чем тестовые проектики на STM32 и Raspberry Pi. И знакомых разработчиков, кто делал подобные продукты, тоже нет, только жена с опытом [4] работы в студенческой лаборатории.
Но я решил попробовать всё реализовать с применением современных технологий. Буду выступать продакт‑менеджером и сборщиком устройства, а в качестве помощника найму нейронки.
Итак, у меня был большой опыт проведения домашних вечеринок и общения с YandexGPT 5 (сейчас актуальная модель уже Alice AI LLM), а также Raspberry Pi Zero 2W и увесистая книга с рецептами коктейлей. Всё, что я знал из своего опыта, — скорее всего мне нужны перистальтические насосы. Остальное спросим у чат‑ботов.
Для начала я обратился к нейронкам, чтобы получить базовое представление по необходимому железу. ИИ сразу подсказал несколько хороших идей: электромагнитные клапаны, подумать над промывкой водой, минимизировать длину трубок, подумать над расходомером. Также чат‑бот объяснил мне, как подключить насосы и клапаны и что такое MOSFET [5]. А ещё нашёл первые компоненты для теста, собрав мне ссылки на маркетплейсах.
И вот первый моторчик и MOSFET‑модуль у меня в руках, я откопал в ящиках несколько dupont‑проводочков и был готов собрать первый прототип на Raspberry Pi. Пока прикидывал всё даже без паяльника, просто прицепил провода к мотору внатяг, примотав их к корпусу, а провода от MOSFET к насосу придерживал руками.

В итоге всё заработало: моторчик бодро перелил несколько миллилитров воды из стакана в стакан. Так я протестировал механизм налива, а ИИ получил роль главного технического консультанта в этом стартапе.
Изначально я хотел сделать аппарат модульным: есть головное устройство, отвечающее за логику [6], и есть модули для бутылок.
Как я уже говорил, многие коммерческие аналоги зарабатывают на расходниках: такие аппараты для основы коктейлей используют проприетарные бутылки, перевёрнутые вверх дном. Я хотел повторить примерно тот же механизм. Только планировал использовать родные бутылки со специальной пробкой: и выглядит стильно, и нет проблем с собиранием остатков со дна. Конечно, есть вопросы с тем, как организовать установку и замену бутылок без проливания, но казалось что решения найти можно.
Но первая же проблема оказалась в том, что у капсульных роботов есть нажимной клапан в бутылке: когда ставишь её в базу и утапливаешь кнопку в горлышке, жидкость начинает выливаться. Значит, всего‑то надо найти подобные клапаны. Они же много где используются, в баках кофемашин, в увлажнителях, в дешёвых настольных кондиционерах? ��а‑ха.
Десяток часов поисков на Reddit, в гугле и чат‑ботах показали мне реальность: все подобные клапаны изготовлены под заказ. Мне стоило трудов даже найти правильное название, чтобы получить выдачу, в которой были бы не только водопроводные или промышленные модели.
Из реалистичных вариантов нейронка на пару с реддитом на полном серьёзе предлагали купить поилку для хомячков и взять клапан оттуда. Ещё что‑то более‑менее похожее нашлось среди запчастей для моек высокого давления и кофемашин. Эти варианты не подходили, потому что неизвестно как их пластик будет взаимодействовать с разными напитками.
Я уже собирался заказать пару запчастей на пробу, но вскоре вскрылась и вторая проблема: владельцы капсульных аналогов часто жаловались на протекающие клапаны.
В итоге я нашёл пример другой коммерческой машины, которая всё‑таки использует стоящие вниз дном ёмкости. Внял и аргументам супруги про балансировку бутылок: самая тяжелая часть сосуда будет сверху и её легко опрокинуть.
В итоге идею перевёрнутых бутылок решил забросить.
Рано или поздно наступает момент, когда нужно делать полноценный прототип. В этот раз я решил сделать максимально (то есть немножко) по‑умному и разделить слои электроники и жидкости. Должны были образоваться три слоя в коробке:
электроника (Raspberry Pi, MOSFET’ы, проводка);
жидкостный слой (разводка трубок и клапана);
стаканный слой (ставим стакан).
Я спросил у главного нейроконсультанта, может ли он мне что‑нибудь порекомендовать. Тот выдал несколько неплохих вариантов. А потом ехидно спросил: слушай, ты же совсем первый прототип делаешь? У тебя никакого хлама вокруг не завалялось?
С оценивающим взглядом я пошёл по дому.
В итоге был найден идеальный корпус для самого первого прототипа — коробка от блока питания. Внутри даже был поролоновый каркас, который выглядел как основание окошка для стакана. Был и кусок поролона, к которому можно было примотать железо. Из запасов студенческих времён я выудил небольшой моток толстой проволоки.
Насос я безжалостно воткнул прямо в поролонку для монтажа — так, чтобы трубки остались на среднем слое, а часть с проводами — на верхнем слое. Из проволоки скрутил «полочку» для монтажной поролонки, отверткой пробил все отверстия, проводку развёл в лучших традициях хорроров для монтажников.
Затем были прорезаны сервисные окошки для стакана и подключений к Raspberry. Когда всё зажужжало, я украл у кота стакан воды, настал момент приготовить первый «коктейль».

Из первых испытаний и советов чат-бота вырисовывалась уже такая конструкция:
Корпус из фанеры: она достаточно прочная, с ней легко работать (даже тем, кто инструмент последний раз держал в седьмом классе на уроках труда). Продумать конструкцию, которую легко реализовать в домашних условиях, также помог чат-бот.
Трубки из пищевого силикона: в сам корпус я вмонтировал «ёлочки», которые соединяют внешние и внутренние трубки. Внутри все жидкости из разных трубок попадают в одну главную трубу с помощью специальных крестообразных четверников [7].

Изначально я сделал для трубок восемь слотов: за основу взял концепцию «Бар из 12 бутылок» и оптимизировал по непопулярным коктейлям.
Приведение жидкости в движение. Гигиенично забирать напитки из бутылок с ингредиентами в главную трубу помогает перистальтический насос [8], уже показанный выше на первом тесте. Единственное его ограничение: не умеет в газированные напитки.
Но всё перекрывают плюсы: благодаря конструкции он подходит для работы даже с медицинскими жидкостями. Внутри маленькой версии насоса три ролика, которые продавливают трубку, как тюбик зубной пасты. В результате жидкость заходит внутрь и не касается вообще ничего, кроме трубки.
Дозировать количество помогают электромагнитные клапаны [9] (на картинке они сверху, прилепленные):

Электроника. Если тач-скрин с AliExpress легко подключить к «малинке» через HDMI, то для всего остального от платы шла колхозная разводка автомобильными проводами. Сначала для соединения в параллель всех дорожек в одну я использовал макетную плату. На 30 дорожек выходило не очень:

Чат-бот предложил использовать для соединения клеммники Wago, которые часто используют для разводки электрики в квартирах. Стало аккуратнее, но в какой-то момент перестало работать. Как оказалось, на первом варианте разводки я использовал тонкие провода — не очень надёжно, но зато хватало питания от шины Raspberry Pi. Для более серьёзной финальной схемы пришлось ещё докупить Power Delivery Trigger [10].
На промежуточном этапе всё выглядело так, потом это аккуратно закрылось крышкой:

Тачскрин расположился над нишей для стакана:

Источник питания — банка на 10000mAh, на домашних тестах её хватает примерно на 7 часов. Вместе с механизмом power delivery агрегат получает оптимальное питание.

Как сейчас модно делать красивые интерфейсы? Сделаем всё на фронтенде, а потом уже как‑нибудь завернём. У меня в качестве основы «малинка», считай, обычный комп, — подумал я. Буду запускать браузер в киоск‑режиме, а там уже мой красивый интерфейс.
Но была проблема: я ничего не понимал в разработке фронта. Однако до сих пор нейронки справлялись с тем, чтобы помочь сделать всё за меня, попробуем и тут.
Первый подход. Я открыл Cursor и начал с ним разговаривать. Так появлялись фичи, нарисовался слой общения с базой, какое‑то подобие дизайна. Потихоньку вырисовывались первые странички — и первые кривые баги.
Как в классических шутках про менеджеров, моё воображение рисовало очередные ОЧЕНЬ НУЖНЫЕ фичи. Не будь я разработчик, если бы не захотел темную тему, например. Но Cursor на автоматическом выборе модели лепил код, как стажёр в белой горячке. Файлы разрастались на тысячи строк, попытки рефакторинга затягивались на часы, но это уже было не остановить.
Когда Cursor тупил, помочь ему было нечем: я не особо хотел разбираться в его коде. Просил добавить логирование, копировал ему логи и надеялся, что он поймёт, в чём баг. Моего энтузиазма хватало только на то, чтобы по диагонали читать изменения которые он хочет сделать, ну и бить по рукам за откровенные костыли и попытки удалить сломанные тесты.

Однажды он упорно не мог починить баг с вёрсткой — в приложении поехали кнопки, а Cursor убеждал меня, что всё нормально. После десятка безуспешных итераций фиксов я вспомнил совет Сергея Брина и начал угрожать нейронке, чтобы она работала лучше.

Это не помогло. Я в сердцах заскриншотил кривую вёрстку и кинул в чат. Так я узнал, что нейронки вообще‑то хорошо читают изображения. Это сильно ускорило починку багов.
В итоге, за несколько вечеров я получил работающее приложение. За код было так стыдно, что я попросил Cursor дописать в readme предупреждение, что этих строчек не касалась рука человека, во всём нужно винить ИИ. Он попытался отшутиться от этого, но я настоял.
Пора тестить это всё на «малинке», подумал я.
Первый запуск и второй подход. Реальность показала, что думать надо было сильно раньше — на моей Pi Zero браузер даже не хотел открываться. Ну ладно, он открылся, спустя минут 20 и повесил систему намертво. Мда.
Пошёл советоваться со своим нейроконсультантом: мы договорились до того, что десктопное приложение будет работать шустрее, и для простоты выбрали Python QT. Заодно можно облегчить систему, выбросив всё ненужное, и запускаться с минимально необходимым набором пакетов.
Cursor пошёл разрабатывать проект заново на PyQT. Тут дело пошло быстрее, так как в контексте уже лежало знание о проекте и фичах, которые я хотел реализовать, и был референс в виде фронтового проекта. Long story short, ещё за пару вечеров новое приложение заработало на моём компе. Я настроил ssh‑доступ до «малинки», попросил Cursor написать скрипты для деплоя.
Несмотря на провал первых тестов, я убедил Cursor, что он может ходить на «малинку» по ssh и читать логи самостоятельно. Он сам делал фиксы, деплоил их, забирал логи и разбирался с проблемами. Лишь иногда его буйную фантазию приходилось корректировать и бить по рукам. В итоге мы собрали облегчённую версию системы c небольшой in‑memory‑базой, отладили скрипты запуска, машина подала первые признаки жизни и работы.
За время тестов мне так надоело тыкать пальцем в мелкий экран, чтобы завести полтора десятка ингредиентов и коктейлей, что я написал для этого скрипт. Пришло осознание, что пользователь скрипт писать не будет. Значит надо делать удобный способ.
ИИ погоняет ИИ. Мой нейроконсультант набросал идею iOS‑приложения и Bluetooth‑протокола для общения. Он очень сильно рвался дать мне примерную архитектуру проекта, наброски кода: давай, говорит, тебе проект начну, вот структура файлов, вот сниппеты кода, давай я тебе это всё в один архив упакую, останется только скачать и открыть в IDE.
То, как свежие модели организуют код и планируют разработку мне понравилось намного больше, в сравнении с тем ужасом, что писал Cursor на автомоделях. Нейроконсультант участливо предложил мне готовый структурированный промпт для Cursor с подробным ТЗ, рекомендациями для него и ограничениями.
Подход нейронка‑менеджер + нейронка‑исполнитель сильно упростил процесс написания качественных промптов и планирования дальнейших шагов. Менеджер ставил исполнителю четкие спринты, исполнитель работал по четкому плану полчаса‑час без вмешательства с моей стороны. Затем менеджер просил исполнителя дать отчёт и обновить аудит проекта и проделанной работы.
Так я получил работающее приложение для iOS, рабочий Bluetooth‑протокол для общения с автоматом и наконец мог удобно настраивать свой агрегат сидя в кресле.
Итоговое приложение умеет подключаться к железяке по Bluetooth LE и синхронизировать стейт. Управлять базой ингредиентов и коктейлей и менять настройки с неё гораздо удобнее, чем редачить с самой железки. Затем мы добавили версионирование коктейлей, возможность заводить локальные коктейли, отправлять на авт��мат только необходимые и даже заложили основу под обновление прошивки автомата.
А я пока решил вернуться к основной цели — заставить машину смешивать коктейли.
Самый первый запуск оказался неудачным: аппарат просто не захотел ничего мне наливать. Но уже второй коктейль без проблем оказался в стакане:
Приключения с первыми запусками на этом не закончились. Когда я представлял свой пет‑проект на внутреннем конкурсе в Яндексе, в финале перед награждением мы захотели сделать пафосный запуск прямо на сцене. В честь такого праздника даже поставили напитки немного покрепче, расставили соки.

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

Как оказалось, для запуска организаторы купили апельсиновый сок с мякотью. А поскольку трубки и клапаны довольно небольшие по диаметру (3-4 мм), то эта мякоть быстро забила все пути для сока.
Так я узнал, что соки с мякотью у меня пока тоже не поддерживаются.
Сейчас на моём аппарате можно готовить коктейли из любых негазированных напитков (кроме соков с мякотью).
На главном экране видим список коктейлей, которые можно приготовить. Список динамический: из всех записанных в железяку рецептов отображаются только доступные коктейли, исходя из тех ингредиентов, что у меня поставлены.

За время экспериментов с разными рецептами я понял, что слотов немного не хватает, особенно для всяких сиропов. Думаю в дальнейшем сделать хотя бы 10 слотов или придумать отдельные вводы для дополнительных соков и сиропов, чтобы не усложнять обслуживание.
Эксплуатация пока выглядит так: я делаю пролив со всеми закрытыми клапанами, чтоб выкачать остатки из трубок внутри. Так внутри в трубках не остаётся жидкости, а вот до клапана она есть. Приходится вытаскивать трубку из бутылки, в сервисном режиме проливать остатки через машину, потом подставлять стакан с водой, проливать ещё раз. И если часть слотов не используются, то нужно либо мучительно скручивать силикон с «ёлочки», либо терпеть «осьминога» с болтающимися и пылящимися трубками.
В софтовой части хранится база коктейлей, есть возможность добавлять новые. Хорошей идеей для развития было бы сделать ИИ‑генерацию рецептов: чтобы нейросеть придумывала новые коктейли из доступных ингредиентов.
Также довольно много идей по доработке конструкции:
Упростить обслуживание можно за счёт быстросъёмных соединений для трубок, так будет проще всё мыть и ставить обратно.
Добавить базу‑поднос для удобства транспортировки.
Продумать более компактный вариант: сейчас внутри есть 50% свободного пространства, и можно высвободить еще 20-30%, если сделать нормальную печатную плату вместо проводной разводки. Текущая реализация хороша для стационарного варианта, но можно сделать и более компактный, «дорожный».
Опционально можно добавить LED‑подсветки.
Добавить весы в площадке со стаканом — для гарантии дозирования без донастроек под ингредиенты.
Если же делать полноценный продукт, то было бы правильно запилить полноценный сервер с возможностью загрузки апдейтов по прикольным коктейлям.
Еще киллер‑фичей было бы добавление льда, но это сильно увеличивает инженерную сложность, габариты и потребление. Так что это пока тоже оставил в бэклоге.
Если же глядя на моё изобретение, идеи появляются у вас — буду рад разогнать их в комментариях.
Автор: Chillintano
Источник [11]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/24366
URLs in this post:
[1] зрения: http://www.braintools.ru/article/6238
[2] вот эта история: https://www.youtube.com/watch?v=Z7GkGeZrb2Y
[3] озарение: http://www.braintools.ru/article/7570
[4] опытом: http://www.braintools.ru/article/6952
[5] MOSFET: https://ru.wikipedia.org/wiki/%D0%9C%D0%9E%D0%9F-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%81%D1%82%D0%BE%D1%80
[6] логику: http://www.braintools.ru/article/7640
[7] четверников: https://aliexpress.ru/item/1005008913817294.html?businessType=ProductDetail&sku_id=12000047179420054&spreadType=socialShare&srcSns=sns_More&utm_medium=sharing
[8] перистальтический насос: https://aliexpress.ru/item/1005007865453325.html?businessType=ProductDetail&sku_id=12000042601051476&spreadType=socialShare&srcSns=sns_More&utm_medium=sharing
[9] электромагнитные клапаны: https://aliexpress.ru/item/1005005744031305.html?businessType=ProductDetail&sku_id=12000034186241395&spreadType=socialShare&srcSns=sns_More&utm_medium=sharing
[10] Power Delivery Trigger: https://www.ozon.ru/product/trigger-bystroy-zaryadki-type-c-do-65w-s-vyborom-zaprashivaemogo-protokola-pd-qc-afc-i-napryazheniya-1570669388/?from=share_ios&perehod=smm_share_button_productpage_link
[11] Источник: https://habr.com/ru/companies/yandex/articles/985556/?utm_campaign=985556&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.