В мире существует невероятное количество говорящих игрушек для детей и это только усугубляет впечатление, что взрослым быть скучно. Наша команда решила исправить эту ситуацию.
Начало истории
Всё началось с того, что в пытливый ум одного моего друга и коллеги netsnail пришла светлая мысль: а почему бы не только детей, но и взрослых не повеселить тематическими шутками? Благо доступное и хорошо зарекомендовавшее себя железо сейчас уже ни разу не редкость, да и умеет оно не только лампочками мигать, но и песни петь.
В связи с этим он позвонил мне и предложил
На видео ESP8266 играет интернет радио, выводя звук с помощью хака «5-битный PWM через I2S».
Однако проигрывание MP3 радио из интернет кушало почти весь ресурс ESP8266 и звучало «так себе», в то время как воображение уже рисовало нам нечто большее, чем просто MP3 радио колонку. С этими творческими порывами мы и пошли к нашей команде и любимому шефу Владимиру.
После небольшого мозгового штурма начала вырисовываться более детальная картина и даже логическая цепочка того, что мы не только хотим, но и можем сделать:
- MP3 заменить на что-то менее требовательное к ресурсам и более свободное, остановились на Speex, который flexxnn довольно удачно и быстро портировал на ESP8266.
- Записи шуток брать с сервера в облаке и складывать локально на SD карту, т.к. интернет не везде есть, да и на ESP8266 если постоянно включенным держать — никакой батарейки не напасёшься.
- Привязать «шутки юмора» к каким-то событиям, а не просто по random говорить. Генератором событий был выбран смартфон, так как он почти у всех уже есть. Ну а собственно события можно легко получать из Apple Notification Center Service (ANCS), который уже есть на iPod, iPhone и iPad.
- Использовать для связи со смартфоном Bluetooth Low Energy (BLE), потому что заряжать игрушку чаще раза в неделю мало кому покажется забавным.
- Чтобы игрушка не бесила пользователя частыми шутками на все приходящие события решили использовать логику на скриптовом языке. Остановились на Pawn language.
- Так как вкусы на шутки у всех разные, а слушать одну и ту же шутку это уже грустно — было решено дать пользователю возможность голосовать за шутки путём «погладить» и «побить» (акселерометр), чтобы на контент-сервере в следующий раз сформировать ему более релевантный плейлист.
Выбор железа
Изначально хотелось сделать очень простой, но полностью рабочий прототип на плате «всё в одном», поэтому решили попробовать на LinkIt ONE от MediaTek. И netsnail это почти сходу удалось. Был и коннект с телефоном и с SD карточки MP3 отлично проигрывались.
Казалось бы — вот оно счастье и готовая уже платформа! Но потом мы столкнулись с
Мы поняли, что готовой платформы на одной плате, удовлетворяющей всем нашим пожеланиям, не было в природе, а значит нам предстояло создать её с нуля.
Итак, нам предстояло выбрать (февраль 2016) наиболее подходящий BLE чип, который необходимо было связать с ESP8266. В качестве связи между ESP8266 и BLE чипом (мы тогда не знали ещё какой это будет чип) решили использовать стандартный TWI (I2C).
А вот с BLE выбор был тогда не особо велик:
- TI CC2541 — сразу как-то не приглянулся из-за архитектуры 8051, да и 8 Кб RAM выглядели малообещающими лёгкую жизнь, учитывая количество BLE сервисов и характеристик, которые требовались нам в игрушке.
- BCM20732 — выглядел очень многообещающе, но на поверку SDK оказался очень сырой, а железо BLE «брелка» Broadcom WICED Smart настолько глючным, что я ничего тут особо писать не буду, чтобы не ругаться. Дайте знать, если сейчас ситуация улучшилась.
- nRF52832 — первый чип, который сразу порадовал. Но тогда не было компактного BLE модуля — rekod начал прототипировать на отладочной плате, SDK очень понравился, содержал много разных рабочих примеров. Пример BLE ANCS запустился сходу и мы тут же увидели уведомления с iPhone в логах с UART. Кстати на этой отладочной плате есть настоящий программатор и отладчик SEGGER J-Link, что сильно облегчило нам жизнь в дальнейшем.
- nRF51822 — на тот момент существовали готовые модули, а программировали их через SEGGER от nRF52832. Что больше всего меня удивило — код со старшей модели nRF52832 отлично переносится на младшую nRF51822 и обратно!
В итоге первое железо выглядело
Ловить глюки из-за отваливающихся dupont кабелей, особенно на модуле nRF51822, где pin'ы чуть меньше размером, было очень грустно.
BLE сервисы на nRF51822 и iOS приложение
Тем не менее я и affair уже на этом железе-пауке начали реализовывать BLE сервисы и характеристики на nRF51822, поделив всё примерно пополам:
- Apple Notification Center Service (ANCS) — для получения уведомлений о событиях со смартфона.
- Apple Current Time Service (CTS) — при подключении игрушка берёт время с телефона.
- HandShake Service (HSS) — этот сервис, кстати, делает игрушку «неугонямой» в отличие от обычных гарнитур и подобных гаджетов. Дело в том, что в облаке есть СlientID и пользователь не просто делает pair телефона и игрушки по Bluetooth, но и дополнительную привязку, которую не так то легко сбросить. Описание этого процесса требует отдельной статьи, поэтому ограничусь кратким упоминанием.
- Battery As Service (BAS) — передача состояния батарейки в приложение на смартфон.
- Content Service (CONTS) — этим можно посмотреть список проигранных ранее шуток, с текстом (текст берётся с сервера в облаке).
- Settings Service (SETTS) — этим можно настроить фильтры неприемлемого контента шуток, время когда игрушка должна молчать (ночью, например) и т.д.
MaximKit в это же время делал приложение под iOS.
На картинке справа виден главный экран приложения.
Тут flexxnn не выдержал наших страданий из-за отваливающихся проводков и сделал дома методом лазерного утюга первый нормальный прототип:
На фото не видно, но слот для microSD карты там уже есть. На маленькой квадратной платке внизу — ALC5627, звук был уже гораздо лучше, чем 5-битный PWM через I2S.
Для управления питанием выбрали AXP209. Позволяет и заряжать и использовать аккумулятор одновременно, а также следить за его состоянием. Чип очень распространённый, но имеет много специфики как в программировании, так и в требуемых внешних компонентах, т.н. «обвязке».
Магия на ESP8266
Параллельно с этим flexxnn портировал на ESP8266 Speex, FatFs, сделал bootloader для ESP8266 и nRF51822, чтобы можно было не шить обновлённые прошивки по проводам, а делать это помещая файлы прошивок на microSD карту.
Лично мне кажется ему помогали инопланетяне, так как сделал он это всё примерно за месяц. Но он не сознаётся в контактах с инопланетным разумом.
А затем и второй более нормальный прототип:
Но более нормальный прототип уже не лез в мягкую игрушку. А если бы и влез, то при резком движении на потенциального пользователя из игрушки полез бы «чужой», что конечно было неприемлемо для MVP.
Поэтому решено было заказать плату профессионалам и вот что получилось в итоге:
В кота такая конструкция уже отлично помещается, правда выглядит это как-то негуманно:
В то же время подтвердились опасения, что события с телефона могут приходить довольно часто и в итоге пользователь получил бы раздражение вместо веселья. Требовалась гибкая логика для фильтрации, которую можно легко менять в любой момент без перепрошивки. В связи с этим я, изучив матчасть и поняв, что для ESP8266 быстрых и компактных скриптов нет (Lua и microPython — интерпретаторы), решил портировать Pawn language, который быстро (всего лишь в 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 вплотную занялся сервером в облаке.
Но как решить кому что понравится? Правильно — пусть решит сам пользователь! Для этого я сделал базовый gesture detection на акселерометре LIS3DH от STMicroelectronics. Понравилась шутка — наклонил кота, как будто «да», не понравилась шутка — наклонил вбок, как будто «нет». А ещё добавил «незабудку» для телефона — если связь по BLE пропадает, а акселерометр фиксирует движение, значит кота куда-то несут, а телефон забыли.
После того как пользователь «полайкал» и обозначил тем самым свои предпочтения — информация уходит на сервер, где идёт сравнение «геномов» playlist'ов и пользователю формируются новые наборы шуток. Но это уже тема для отдельной статьи.
Итоги
В итоге из развлечения получилась отличная платформа, которая умеет:
- связываться с телефоном по BLE и получать уведомления о событиях;
- связываться по WiFi и скачивать контент и обновления прошивок;
- сохранять и читать файлы в FAT32 на microSD;
- играть шутки, упакованные speex кодеком;
- определять предпочтения пользователя с помощью акселерометра (gesture detection);
- формировать playlists под каждого пользователя на основе его предпочтений в юморе;
Что примечательно, «оч.умелые ручки» вполне могут подключиться к соответствующим pin'ам (даже отверстия под разъёмы на плате оставлены) и «поумнеть кота» так, как им заблагорассудится. Это и делает платформу всё-в-одном привлекательной для гиков.
С этой платформой мы и вышли на kickstarter, назвав готовую игрушку KiQ. В первый же день собрали 40%, а сейчас уже 57%. Но это уже совсем другая история.
Спасибо всем тем, кто дочитал до этой строчки. Жду от вас интересных вопросов.
Комментарии (47)
x893
14.10.2016 16:29Поиск на github не дал результатов. Грустно.
rekod
14.10.2016 16:33Наверно потому, что он ещё и тут.
С другой стороны, подборка железа хороша и для самостоятельных экспериментов, благо железки там вполне стандартные, просто собраны удачно.
x893
14.10.2016 16:45Железо тут обычное. Программы более интересны. Вернее только программы и интересны.
rekod
14.10.2016 16:58+1Ну про "железо обычное" я бы не стал утверждать. Точнее отдельные модули и чипы — да, довольно распространённые. Но вот правильно их собрать, чтобы стабильно работало, а ещё пройти FCC сертификацию в США… ;-)
Что до программ, то я конечно же не могу выложить исходный код по некоторым объективным причинам.
Frimen3
14.10.2016 16:32А можно узнать какой динамик используется? Может ссылочкой поделитесь?
rekod
14.10.2016 16:54Мы специально купили разных динамиков и тестировали у каких хорошее качество звука и соотношение цена/качество. Остановились на одном из вариантов, заказ делали напрямую на фабрику.
Вот ближайший общедоступный аналог.Frimen3
14.10.2016 17:14Спасибо. А если не коммерческая тайна — какова себестоимость всего железа отдельно и пошива игрушки (материал+работа) отдельно, массовым тиражом если делать и то и то?
rekod
14.10.2016 17:17К сожалению это как раз относится к коммерческой тайне. Как минимум до окончания компании на kickstarter.
MaximKit
14.10.2016 17:20Разработка плюшевой игрушки обошлась примерно в 5000 долларов. Художник, дизайнер, пошив прототипов, подготовка к производству
x893
14.10.2016 18:44Я бы замутил на AP6212 с бонусом FM в придачу. Но дело хозяйское.
tormozedison
14.10.2016 20:38AP6212 — это чисто радиомодуль, а в ESP8266 ещё и контроллер, в который можно прошить свою фирмварь.
x893
14.10.2016 21:10Это невызывает никаких сомнений. Естественно с процессором за 3-4$. Датиками температуры и метестанцией (ирония).
x893
14.10.2016 21:15-2Весь интерес представляет только софт. Железо 10-15$ за 2-3 часа делается, котик плюшевый на фиг не нужен. Я бы в R2D2 вставил, но программировать лень.
rekod
14.10.2016 21:23+2Железо 10-15$ за 2-3 часа делается
Предлагаю Вам написать статью "как я сделал железо на ESP8266+nRF51822+ALC5627+AXP209 за 10-15$ и 2-3 часа" с пошаговой инструкцией.
Нашей команде будет интересно почитать. Не шучу. В общем очень ждём.netsnail
14.10.2016 21:48А что, не так уж и сложно. Берем AP6212 ($5), добавляем процессор ($4), память ($5), SD ($3), батарейку ($6), прочее ($5), разводим это все хозяйство на шестислойной плате с дифференциальными парами, накатываем линух и получается… получается… Не получается. :(
x893
14.10.2016 21:55Двухслойки за глаза хватит. Сразу с PIFA антенной и остальной лабудой. По NTP можно время и страну узнавать и на нужном языке травить анекдоты.
x893
14.10.2016 21:50Давайте так — с вас софт мне без права распостранения, а с меня пошаговая инструкция. AXP поменяю на более простой вариант из TI сэмплов. nRF есть разные модули от 1х1 см до 2х3 см — от ног нужных зависит. ALC посмотрю на что-то имеющееся — можно с STM-DISCO сдуть или болгаркой вырезать кусок, но там другой немного контроллер. ALC заказать можно, но недели три будет идти.
netsnail
14.10.2016 21:56Ненене, так не интересно! Компромиссы с простыми зарядниками — не наш путь! Опять же сдуть — тоже не вариант. Нужно то, что потом можно будет производить. Модули — только одобренные --минздравом-- FCC.
x893
14.10.2016 22:04Нам минздрав не указ :)
Как что-то городить если вдохнуть туда нечего?
В общем буду ждать код на github.x893
14.10.2016 22:09Надо будет заказать
https://redbear.cc/product/redbear-duo.html
для тестовx893
14.10.2016 22:47C i2s модулями напряженка — нашел такие
https://ru.aliexpress.com/item/UDA1380-Board-Stereo-MD-CD-Mp3-Audio-Voice-Module-Coder-Decoder-Development-Module-Kit/32615607788.html?spm=2114.10010208.1000016.1.fC7M1C&isOrigTitle=true
Хотя проще купить микросхемы и сделать сразу с динамиком модуль.
Пригодится в хозяйстве. Народ активно пользует I2S с ESP для аудио
netsnail
14.10.2016 21:18AP6212 стоит примерно столько же сколько EP8266+nRF52832. При этом требует неслабый хостовый контроллер c памятью и т.д. Стоимость устройства увеличивается раза в два. Плюс усложняется вопрос сертификации в FCC.
tormozedison
14.10.2016 20:17Обычная Bluetooth-гарнитура содержит всё необходимое, кроме акселерометра. Но микрофон тоже можно использовать для определения, гладят игрушку или бьют.
Vespertilio
14.10.2016 21:22Я бы не стал недооценивать паранойю людей =) Игрушки с микрофоном это уже почти как игрушки с камерой, а еще открытое железо… думаю не стоит.
rekod
14.10.2016 21:26Обычная Bluetooth-гарнитура содержит всё необходимое
Дайте ссылку на Bluetooth Low Energy (BLE) гарнитуру, чтобы жила не менее недели с одной зарядки. Мне очень-очень надо. Я куплю.
netsnail
14.10.2016 21:33Вывод произвольных звуков на Bluetooth динамик в произвольные моменты времени на мобильных платформах возможен лишь теоретически.
rekod
14.10.2016 21:45Лучше по простому посоветуй (как мне) посмотреть видео с использованием bluetooth наушников. У меня это быстро "эйфорию" выключило. Но народ видимо не в курсе… :)
netsnail
14.10.2016 21:51Тут как раз есть решение. В свежих версиях Bluetooth есть Low Latency audio. Однако, далеко не каждое устройство и не каждая гарнитура это поддерживает.
Drako_Staarn
14.10.2016 21:28+1Реквестирую неофициальное имя — Хатуль мадан :) https://lurkmore.to/Хатуль_мадан
Если что — куплю.
jafariuse
17.10.2016 10:58Нет ли приложения для андроид выполняющее те же функции (прилюдно шутить, реагировать на события и т.д.)?
Lamaster
> В итоге всё удалось и уже через неделю гаджеты (и наш кот не исключение) искренне верили, что у меня iPhone с ANCS сервисом, подключаясь к моему Nexus 5 и даже к старому Samsung Galaxy с Android 4.4.
Это, конечно, супер, но, всё таки, можно поподробней?
rekod
Дело в том, что iOS позволяет по умолчанию отправлять уведомления о событиях в системе и от приложений на подключенные устройства — различные умные часы и т.д.
Спецификация ANCS — открытая.
Понятно, что на Android такой службы по умолчанию нет.
И готовой реализации я не нашёл на момент старта проекта.
Поэтому для Android приложения KiQ я реализовал службу (служба понятное дело работает и тогда когда приложение не запущено), которая ловит все Status Bar Notifications в Android (а там много интересного приходит) и уведомляет подключенные устройства по BLE об этих событиях в формате ANCS.
Соответственно устройства находят ANCS службу, получают от неё уведомления и думают, что перед ними не Android, а iPhone.