Говорит и показывает кофеварка

История создания одной говорящей кофемашины
Умный домГоворит и показывает кофеварка

Итак, начнём! Дойдя до конца нашей истории, мы будем знать, несомненно, больше, чем теперь. Итак, жил-был Тролль, — злющий-презлющий, сущий дьявол!

Do not panic!

Пролог

Итак. Это не история о Снежной Королеве. Тем не менее, началась эта замечательная история совершенно неожиданно и чудесно, — ровно так, как и обязаны начинаться все приличные и уважающие себя истории. Где-то в начале Апреля.

Утром совершенно нежданно-негаданно вышел на связь Николай Данилов (он же Норвежский Лесной), человечище для меня настолько же легендарный, насколько бесконечно загадочный, и, как следствие, трепетно уважаемый.

Начало истории

Означенная встреча, конечно же, состоялась, содержание встречи даже осведомленные источникии не раскрывают, отмечая только лишь, что встреча сия имела эпохальное значение, и оттого, дату 7 апреля 2018 года следует считать точкой отсчета Новой Эпохи в истории человечества!

Сегодня, 3-го июля 2018 года, мы можем раскрыть для вас некоторые подробности и детали этой эпохальной встречи, а также кратко осветить некоторые обстоятельства, кои сия встреча за собой повлекла, раз и навсегда разделив историю Человека Компьютерного (Home computicus) на «до» и «после».

Часть первая. Постановка задачи.

На самом деле, всё было очень даже просто, ибо инициатор встречи, он же Великий Возмутитель Спокойствия, он же Генератор Идей, он же (в недалеком обозримом будущем) Укротитель Восстания Машин, — и все это один человек, скрывающийся за скромным ником одного из самых известных блогеров рунета, Норвежский Лесной, поинтересовался, нет ли у меня желания поучаствовать в некоем техническом проекте. Идея поработать над чем-бы-то-ни-было под руководством Лесного была прекрасной сама по себе, а технические подробности проекта показались мне настолько любопытными, что я, не раздумывая, согласился.

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

P.S. Здесь следовало бы сразу отметить, — я честно предупредил, что на фоне театральных задач смогу уделять проекту не более нескольких часов в неделю, причем, с очень высокой долей вероятности, код придется писать ночами. Заказчик не протестовал, и задача была принята!

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

Яндекс.Диалоги

Умения Алисы стали называть «навыками», сами навыки могли быть реализованы любым сторонним разработчиком в виде внешнего WEB-Hook севиса, взаимодействующего с Алисой по заранее определенному протоколу.

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

Но отнюдь не это входило в наши планы.

Нам предстояло на примере создаваемого прототипа электронного устройства научить Алису, а заодно и её пользователей, новым подходам к построению голосовых интерфейсов.

Лирическое отступление.

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

Давно ли вы покупали, для примера, железнодорожные билеты?

Итак, — уж если у нас машина, наконец-то, научилась разговаривать, то пусть она делает это легко и непринужденно — по-возможности, без канцеляризмов и занудства!

Часть вторая. Реализация

В качестве «сердца» всех трех подзадач «железной» стороны проекта был выбран микроконтроллер ESP8266, бюджетное решение от компании Espressif Systems. Сам выбор, собственно, был продиктован компактностью чипа, имеющего полноценную RISC-архитектуру, и содержащего «на борту» почти полноценный WiFi, а помимо этого, — еще целую груду интерфейсов и портов ввода-вывода.

ESP8266

Для того, чтобы не утруждать читателя техническими деталями и подробностями, всех интересующихся отправим изучать общедоступные источники. От себя же добавим, что чип как таковой предназначен для использования во встраиваемых решениях, и требует, как минимум, внешнего источника питания напряжением 3.3V, а при необходимости работы с периферийными устройствами — развязки портов ввода-вывода, имеющих конечный допустимый выходной ток.

Поэтому для быстрого прототипирования нами была выбрана версия чипа, имеющая собственное наименование NodeMCU, представленная в виде небольшой отладочной платы, имеющей разъем USB, постредством виртуального COM-порта осуществляющего связь между устройством и компьютером; стабилизатор напряжения, кнопку начального сброса и сигнальный светодиод.

ESP8266

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

Весь программный код навыка на стороне сервиса писался на Perl (выбор определен исключительно моими пристрастиями и не накладывает никаких ограничений на выбор языка программирования), а на стороне микроконтроллера на «классическом» Си (GCC).

Шаг 1. Приручение Алисы

На первом шаге ставилась задача просто научиться управлять с помощью голосовых команд Алисы каким-либо реальным устройством. К примеру — зажигать один из трех светодиодов. Эта простая задача была немного модернизирована, и, благодаря трем разноцветным светодиодам, названа «Веселый светофор».

Штатные примеры использования чипа ESP8266 от производителя содержат скетч, управляющий портами ввода-вывода, поэтому написать прототип для первого шага не составило особого труда. Единственное, что было сделано — немного модифицрован пример скетча примера зажигания светодиода через WEB-интерфейс.

Traffic Light WEB console

В итоге получили работающий пример управления целевым устройством без рук и проводов, по командам с WiFi!

Traffic Light Controller

Traffic Light Controller

Traffic Light Controller

На стороне микроконтроллера реализован простейший WEB-сервер, слушающий GET-запросы от сервиса, и реагирующий на них изменением логических уровней соответствующих портов ввода-вывода, — то есть «зажигающий» светодиоды. Для простоты реализации каждый светодиод соответствует собственному URL на WEB-сервере контроллера.

Шаг 2. Волшебная магия кофе.

Задачей второго этапа было научить Алису варить кофе. По требованию. Без капризов и выкрутасов.

Для того, чтобы сварить кофе, нужна кофемашина.

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

Такая машина от Philips была обнаружена Николаем на небезизвестном Алиэкспрессе, заказана, и благополучно доставлена в Столицу Революций Мира.

Unboxing. Step 1.

Unboxing. Step 2.

Unboxing. Step 3.

Unboxing. Step 4.

Unboxing. Step 5.

Собственно, самая простая из возможных машин с реальными кнопками была необходима именно для того, чтобы в процессе прототипирования (напомню, что перед нами стояла задача аппробации именно идеи программного взаимодействия между Яндекс.Диалогами и реальным устройством, а не изыски в области микропрограммирования встроенных девайсов) не тратить время на разборки с интерфейсами самой кофемашины, а сосредоточится исключительно на разработке навыка управления процессом заказа и приготовления кофе.

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

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

Disassembling. Step 6.

Самым страшным ночным кошмаром инженера-программиста был процесс поэтапного освобождения этой печатной платы панели управления! Справедливости ради стоило бы отметить, что ни одна пластиковая деталь не была повреждена, более того, в процессе обратной сборки не осталось ни одного «лишнего» винтика!

Итог сборки панели управления с выведенным наружу плоским кабелем управления.

Assembling. Step 7.

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

Assembling. Step 8.

Assembling. Step 9.

После непродолжительных экспериментов с си-кодом на стороне микроконтроллера и подбором временных задержек — наконец, первое, долгожданное включение!

First Test. Step 10.

Сразу же стоит сказать, что в процессе экспериментов с временными задержками, были обнаружены и первые «грабли», впоследствии успешно обнаруженные и скорректированные Николаем, — документацию на девайсы непременно следует читать сразу, внимательно, и от корки до корки! Потому, что передержав кнопку приготовления американо, я, тем самым, сбил внутренние настройки приготовления этого типа кофе, — это видно на видео, — вместо стандартной порции, машина готовит мне огромную чашку, не желая останавливать процесс приготовления кофе. Для остановки кнопка была нажата «в ручном режиме».

Первый блин — комом, но все-таки она вертится!

Шаг 3. Дрессировка Алисы.

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

Testing. Step 11.

Testing. Step 12.

На третьем, — последнем шаге этапа реализации, — мы занимались, в основном, программированием. Был реализован следующий базовый функционал навыка:

  1. Реализован вывод голосового меню кофемашины в ответ на запросы типа «что ты можешь?» и «что ты умеешь?» (навык возвращает ответ ’умею готовить эспрессо, лунго и американо’)
  2. Реализованы реакции как на односложные запросы, содержащие только наименование кофе, так и сложносоставные запросы типа «приготовь, пожалуйста, эспрессо»
  3. Добавлена реакция навыка на присутствие ключевого слова «двойной/двойное» в команде и добавлен код на стороне микроконтроллера, реализующий двойной клик выбранной кнопки
  4. Добавлена реакция навыка на команды, сожержащие типы кофе, не входящие в допустимый список возможностей машины («Я не умею готовить кофе с молоком. Могу приготовить эспрессо, лунго и американо»)
  5. Реализована стандартная реакция на запросы, лежащие за пределами навыка («Алиса, сколько звезд на небе?») — сервис отвечает: «Я вас не понимаю» и далее произносит стандартную фразу меню: " Могу приготовить эспрессо, лунго и американо«

Вся дальнейшая работа по расширению возможностей голосового интерфейса велась в направлении синонимии («приготовь маленькую чашку» — машина готовит эспрессо), и упрощения способов получения и уточнения запросов (на запрос «приготовь, пожалуйста, кофе», сервис уточняет: «Какой кофе приготовить? Я умею готовить эспрессо, лунго и американо»)

Кроме этого, была добавлена возможность повторного заказа только что приготовленного напитка («повтори»), а также реализован механизм случайного выбора («приготовь на твое усмотрение»)

Технически, финальная версия навыка была немного изменена.

  • Контроллер теперь имеет служебное меню, одноразово конфигурируемое через COM-порт, позволяющее задать параметры подключеня к конкретной WiFi-сети. Сеть может быть как общедоступной, так и приватной, защищенной паролем. Настройки подключения сетевого соединения могут быть сохранены во внутренний файл конфигурации и при всех последующих включениях дополнительная конфигурация не требуется.
  • все взамодействие между контроллером и сервисом навыка теперь реализуется исключительно на стороне контроллера, «слушающего» API сервиса.
  • Все команды, отдаваемые пользователем, в конечном итоге приводят к изменению набора флагов состояния сервиса, запрашиваемых контроллером с определенной периодичностью.
  • Изменение набора флагов приводит к активизации контроллера и выполнению команд навыка