- PVSM.RU - https://www.pvsm.ru -

Кот-анекдот KiQ или как мы говорящую игрушку для взрослых сделали

KiQ Toy

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

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

Всё началось с того, что в пытливый ум одного моего друга и коллеги netsnail [1] пришла светлая мысль: а почему бы не только детей, но и взрослых не повеселить тематическими шутками? Благо доступное и хорошо зарекомендовавшее себя железо сейчас уже ни разу не редкость, да и умеет оно не только лампочками мигать, но и песни петь [2].

В связи с этим он позвонил мне и предложил повторить эпический подвиг убедиться так ли хорошо ESP8266 музыку в MP3 формате играет по сети и не разрывает ли хомячка на куски хватает ли реально производительности, что я и сделал по быстрому в новогодние праздники 2016 года:

На видео ESP8266 играет интернет радио, выводя звук с помощью хака «5-битный PWM через I2S».

Однако проигрывание MP3 радио из интернет кушало почти весь ресурс ESP8266 и звучало «так себе», в то время как воображение уже рисовало нам нечто большее [3], чем просто MP3 радио колонку. С этими творческими порывами мы и пошли к нашей команде и любимому шефу Владимиру [4].

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

  • MP3 заменить на что-то менее требовательное к ресурсам и более свободное, остановились на Speex [5], который flexxnn [6] довольно удачно и быстро портировал на ESP8266.
  • Записи шуток брать с сервера в облаке и складывать локально на SD карту, т.к. интернет не везде есть, да и на ESP8266 если постоянно включенным держать — никакой батарейки не напасёшься.
  • Привязать «шутки юмора» к каким-то событиям, а не просто по random говорить. Генератором событий был выбран смартфон, так как он почти у всех уже есть. Ну а собственно события можно легко получать из Apple Notification Center Service (ANCS), который уже есть на iPod, iPhone и iPad.
  • Использовать для связи со смартфоном Bluetooth Low Energy (BLE), потому что заряжать игрушку чаще раза в неделю мало кому покажется забавным.
  • Чтобы игрушка не бесила пользователя частыми шутками на все приходящие события решили использовать логику на скриптовом языке. Остановились на Pawn language [7].
  • Так как вкусы на шутки у всех разные, а слушать одну и ту же шутку это уже грустно — было решено дать пользователю возможность голосовать за шутки путём «погладить» и «побить» (акселерометр), чтобы на контент-сервере в следующий раз сформировать ему более релевантный плейлист.

Выбор железа

Изначально хотелось сделать очень простой, но полностью рабочий прототип на плате «всё в одном», поэтому решили попробовать на LinkIt ONE [8] от MediaTek. И netsnail [1] это почти сходу удалось. Был и коннект с телефоном и с SD карточки MP3 отлично проигрывались.
Казалось бы — вот оно счастье и готовая уже платформа! Но потом мы столкнулись с суровой реальностью ограничениями их закрытого SDK и эйфория прошла.

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

Итак, нам предстояло выбрать (февраль 2016) наиболее подходящий BLE чип, который необходимо было связать с ESP8266. В качестве связи между ESP8266 и BLE чипом (мы тогда не знали ещё какой это будет чип) решили использовать стандартный TWI (I2C).

А вот с BLE выбор был тогда не особо велик:

  • TI CC2541 [9] — сразу как-то не приглянулся из-за архитектуры 8051 [10], да и 8 Кб RAM выглядели малообещающими лёгкую жизнь, учитывая количество BLE сервисов и характеристик, которые требовались нам в игрушке.
  • BCM20732 [11] — выглядел очень многообещающе, но на поверку SDK оказался очень сырой, а железо BLE «брелка» Broadcom WICED Smart настолько глючным, что я ничего тут особо писать не буду, чтобы не ругаться. Дайте знать, если сейчас ситуация улучшилась.
  • nRF52832 [12] — первый чип, который сразу порадовал. Но тогда не было компактного BLE модуля — rekod [13] начал прототипировать на отладочной плате [14], SDK очень понравился, содержал много разных рабочих примеров. Пример BLE ANCS запустился сходу и мы тут же увидели уведомления с iPhone в логах с UART. Кстати на этой отладочной плате есть настоящий программатор и отладчик SEGGER J-Link, что сильно облегчило нам жизнь в дальнейшем.
  • nRF51822 [15] — на тот момент существовали готовые модули [16], а программировали их через SEGGER от nRF52832. Что больше всего меня удивило — код со старшей модели nRF52832 отлично переносится на младшую nRF51822 и обратно!

В итоге первое железо выглядело как паук тарантул примерно так:

паучок из железа

Ловить глюки из-за отваливающихся dupont кабелей, особенно на модуле nRF51822, где pin'ы чуть меньше размером, было очень грустно.

BLE сервисы на nRF51822 и iOS приложение

Тем не менее я и affair [17] уже на этом железе-пауке начали реализовывать BLE сервисы и характеристики на nRF51822, поделив всё примерно пополам:

  • Apple Notification Center Service (ANCS [18]) — для получения уведомлений о событиях со смартфона.
  • Apple Current Time Service (CTS) — при подключении игрушка берёт время с телефона.
  • HandShake Service (HSS) — этот сервис, кстати, делает игрушку «неугонямой» в отличие от обычных гарнитур и подобных гаджетов. Дело в том, что в облаке есть СlientID и пользователь не просто делает pair телефона и игрушки по Bluetooth, но и дополнительную привязку, которую не так то легко сбросить. Описание этого процесса требует отдельной статьи, поэтому ограничусь кратким упоминанием.
  • Battery As Service (BAS) — передача состояния батарейки в приложение на смартфон.
  • Content Service (CONTS) — этим можно посмотреть список проигранных ранее шуток, с текстом (текст берётся с сервера в облаке).
  • Settings Service (SETTS) — этим можно настроить фильтры неприемлемого контента шуток, время когда игрушка должна молчать (ночью, например) и т.д.

MaximKit [19] в это же время делал приложение под iOS.

image
На картинке справа виден главный экран приложения.

Тут flexxnn [6] не выдержал наших страданий из-за отваливающихся проводков и сделал дома методом лазерного утюга [20] первый нормальный прототип:

первый более-менее прототип

На фото не видно, но слот для microSD карты там уже есть. На маленькой квадратной платке внизу — ALC5627 [21], звук был уже гораздо лучше, чем 5-битный PWM через I2S.

Для управления питанием выбрали AXP209 [22]. Позволяет и заряжать и использовать аккумулятор одновременно, а также следить за его состоянием. Чип очень распространённый, но имеет много специфики как в программировании, так и в требуемых внешних компонентах, т.н. «обвязке».

Магия на ESP8266

Параллельно с этим flexxnn [6] портировал на ESP8266 Speex [5], FatFs [23], сделал bootloader для ESP8266 и nRF51822, чтобы можно было не шить обновлённые прошивки по проводам, а делать это помещая файлы прошивок на microSD карту.

Лично мне кажется ему помогали инопланетяне, так как сделал он это всё примерно за месяц. Но он не сознаётся в контактах с инопланетным разумом.

А затем и второй более нормальный прототип:

первый более-менее прототип

Но более нормальный прототип уже не лез в мягкую игрушку. А если бы и влез, то при резком движении на потенциального пользователя из игрушки полез бы «чужой», что конечно было неприемлемо для MVP.

Поэтому решено было заказать плату профессионалам и вот что получилось в итоге:

image

В кота такая конструкция уже отлично помещается, правда выглядит это как-то негуманно:

image

В то же время подтвердились опасения, что события с телефона могут приходить довольно часто и в итоге пользователь получил бы раздражение вместо веселья. Требовалась гибкая логика для фильтрации, которую можно легко менять в любой момент без перепрошивки. В связи с этим я, изучив матчасть и поняв, что для ESP8266 быстрых и компактных скриптов нет (Lua и microPython — интерпретаторы), решил портировать Pawn language [7], который быстро (всего лишь в 18 раз медленнее нативного) исполняет компактный байткод.

Кстати исходники на Pawn очень похожи на C, поэтому скрипты модифицировать одно удовольствие — их достаточно всего лишь скомпилировать в AMX байткод и скопировать на SD карту.

Обман гаджетов. Прикидываемся iOS на Android

И тут «внезапно» мы все вспомнили, что Android телефонов в мире не так уж и мало, а даже больше, чем телефонов с iOS.

В итоге мне пришлось в темпе проверить сможем ли мы обмануть гаджеты и прикинуться iOS на Android, чтобы они увидели сервис ANCS, неотличимый от Apple.

В итоге всё удалось и уже через неделю гаджеты (и наш кот не исключение) искренне верили, что у меня iPhone с ANCS сервисом, подключаясь к моему Nexus 5 и даже к старому Samsung Galaxy с Android 4.4.

Go Cloud

Так как никто не любит слушать шутку по несколько раз (факт), а также существуют предпочтения и культурные ограничения, решено было каждому пользователю формировать уникальный playlist. Для этого affair [17] вплотную занялся сервером в облаке.

Но как решить кому что понравится? Правильно — пусть решит сам пользователь! Для этого я сделал базовый gesture detection на акселерометре LIS3DH [24] от STMicroelectronics. Понравилась шутка — наклонил кота, как будто «да», не понравилась шутка — наклонил вбок, как будто «нет». А ещё добавил «незабудку» для телефона — если связь по BLE пропадает, а акселерометр фиксирует движение, значит кота куда-то несут, а телефон забыли.

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

Итоги

В итоге из развлечения получилась отличная платформа, которая умеет:

  • связываться с телефоном по BLE и получать уведомления о событиях;
  • связываться по WiFi и скачивать контент и обновления прошивок;
  • сохранять и читать файлы в FAT32 на microSD;
  • играть шутки, упакованные speex кодеком;
  • определять предпочтения пользователя с помощью акселерометра (gesture detection);
  • формировать playlists под каждого пользователя на основе его предпочтений в юморе;

Что примечательно, «оч.умелые ручки» вполне могут подключиться к соответствующим pin'ам (даже отверстия под разъёмы на плате оставлены) и «поумнеть кота» так, как им заблагорассудится. Это и делает платформу всё-в-одном привлекательной для гиков.

С этой платформой мы и вышли на kickstarter, назвав готовую игрушку KiQ. В первый же день собрали 40%, а сейчас уже 57%. Но это уже совсем другая история.

Спасибо всем тем, кто дочитал до этой строчки. Жду от вас интересных вопросов.

Автор: rekod

Источник [25]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/gadzhety/199072

Ссылки в тексте:

[1] netsnail: https://geektimes.ru/users/netsnail/

[2] песни петь: http://hackaday.com/2015/06/06/esp8266-as-a-networked-mp3-decoder/

[3] нечто большее: http://www.hasbro.com/en-us/brands/furby

[4] Владимиру: https://www.linkedin.com/in/vladponomarev/en

[5] Speex: http://www.speex.org/

[6] flexxnn: https://geektimes.ru/users/flexxnn/

[7] Pawn language: http://www.compuphase.com/pawn/pawn.htm

[8] LinkIt ONE: http://labs.mediatek.com/site/global/developer_tools/overview/index.gsp

[9] TI CC2541: http://www.ti.com/product/CC2541

[10] 8051: https://en.wikipedia.org/wiki/Intel_MCS-51

[11] BCM20732: http://ru.mouser.com/new/broadcom/broadcom-bcm20732-soc/

[12] nRF52832: https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF52832

[13] rekod: https://geektimes.ru/users/rekod/

[14] отладочной плате: http://www.digikey.com/catalog/en/partgroup/nrf52-development-kits/54030

[15] nRF51822: https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF51822

[16] модули: https://ru.aliexpress.com/item/Low-Power-NRF51822-Wireless-Module-2-4G-Wireless-SOC-Single-Chip-BLE4-0-Bluetooth-Module/32334236969.html

[17] affair: https://geektimes.ru/users/affair/

[18] ANCS: https://developer.apple.com/library/content/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Introduction/Introduction.html

[19] MaximKit: https://geektimes.ru/users/maximkit/

[20] лазерного утюга: http://easyelectronics.ru/sozdanie-pechatnoj-platy-metodom-lazernogo-utyuga.html

[21] ALC5627: http://opendevices.ru/wp-content/uploads/2011/11/alc5627_datasheet_1.2.pdf

[22] AXP209: http://dl.linux-sunxi.org/AXP/AXP209_Datasheet_v1.0en.pdf

[23] FatFs: http://elm-chan.org/fsw/ff/00index_e.html

[24] LIS3DH: http://www.st.com/content/ccc/resource/technical/document/datasheet/3c/ae/50/85/d6/b1/46/fe/CD00274221.pdf/files/CD00274221.pdf/jcr:content/translations/en.CD00274221.pdf

[25] Источник: https://geektimes.ru/post/281492/