KiQ Toy

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

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


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

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


На видео 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 отлично проигрывались.
Казалось бы — вот оно счастье и готовая уже платформа! Но потом мы столкнулись с суровой реальностью ограничениями их закрытого SDK и эйфория прошла.

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

Итак, нам предстояло выбрать (февраль 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.

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

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

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

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

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

Магия на ESP8266


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

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

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

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

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

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

image

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

image

В то же время подтвердились опасения, что события с телефона могут приходить довольно часто и в итоге пользователь получил бы раздражение вместо веселья. Требовалась гибкая логика для фильтрации, которую можно легко менять в любой момент без перепрошивки. В связи с этим я, изучив матчасть и поняв, что для 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)


  1. Lamaster
    14.10.2016 16:10

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


    1. rekod
      14.10.2016 16:19
      +1

      Дело в том, что iOS позволяет по умолчанию отправлять уведомления о событиях в системе и от приложений на подключенные устройства — различные умные часы и т.д.
      Спецификация ANCS — открытая.


      Понятно, что на Android такой службы по умолчанию нет.
      И готовой реализации я не нашёл на момент старта проекта.
      Поэтому для Android приложения KiQ я реализовал службу (служба понятное дело работает и тогда когда приложение не запущено), которая ловит все Status Bar Notifications в Android (а там много интересного приходит) и уведомляет подключенные устройства по BLE об этих событиях в формате ANCS.


      Соответственно устройства находят ANCS службу, получают от неё уведомления и думают, что перед ними не Android, а iPhone.


  1. x893
    14.10.2016 16:29

    Поиск на github не дал результатов. Грустно.


    1. rekod
      14.10.2016 16:33

      Наверно потому, что он ещё и тут.


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


      1. x893
        14.10.2016 16:45

        Железо тут обычное. Программы более интересны. Вернее только программы и интересны.


        1. rekod
          14.10.2016 16:58
          +1

          Ну про "железо обычное" я бы не стал утверждать. Точнее отдельные модули и чипы — да, довольно распространённые. Но вот правильно их собрать, чтобы стабильно работало, а ещё пройти FCC сертификацию в США… ;-)


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


          1. x893
            14.10.2016 17:23

            Да — это всё понятно. Буду ждать завершения на кикстарте. Время есть :)


  1. Frimen3
    14.10.2016 16:32

    А можно узнать какой динамик используется? Может ссылочкой поделитесь?


    1. rekod
      14.10.2016 16:54

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


      1. Frimen3
        14.10.2016 17:14

        Спасибо. А если не коммерческая тайна — какова себестоимость всего железа отдельно и пошива игрушки (материал+работа) отдельно, массовым тиражом если делать и то и то?


        1. rekod
          14.10.2016 17:17

          К сожалению это как раз относится к коммерческой тайне. Как минимум до окончания компании на kickstarter.


        1. MaximKit
          14.10.2016 17:20

          Разработка плюшевой игрушки обошлась примерно в 5000 долларов. Художник, дизайнер, пошив прототипов, подготовка к производству


  1. x893
    14.10.2016 18:44

    Я бы замутил на AP6212 с бонусом FM в придачу. Но дело хозяйское.


    1. tormozedison
      14.10.2016 20:38

      AP6212 — это чисто радиомодуль, а в ESP8266 ещё и контроллер, в который можно прошить свою фирмварь.


      1. x893
        14.10.2016 21:10

        Это невызывает никаких сомнений. Естественно с процессором за 3-4$. Датиками температуры и метестанцией (ирония).


        1. x893
          14.10.2016 21:15
          -2

          Весь интерес представляет только софт. Железо 10-15$ за 2-3 часа делается, котик плюшевый на фиг не нужен. Я бы в R2D2 вставил, но программировать лень.


          1. rekod
            14.10.2016 21:23
            +2

            Железо 10-15$ за 2-3 часа делается
            Предлагаю Вам написать статью "как я сделал железо на ESP8266+nRF51822+ALC5627+AXP209 за 10-15$ и 2-3 часа" с пошаговой инструкцией.
            Нашей команде будет интересно почитать. Не шучу. В общем очень ждём.


            1. netsnail
              14.10.2016 21:48

              А что, не так уж и сложно. Берем AP6212 ($5), добавляем процессор ($4), память ($5), SD ($3), батарейку ($6), прочее ($5), разводим это все хозяйство на шестислойной плате с дифференциальными парами, накатываем линух и получается… получается… Не получается. :(


              1. x893
                14.10.2016 21:55

                Двухслойки за глаза хватит. Сразу с PIFA антенной и остальной лабудой. По NTP можно время и страну узнавать и на нужном языке травить анекдоты.


            1. x893
              14.10.2016 21:50

              Давайте так — с вас софт мне без права распостранения, а с меня пошаговая инструкция. AXP поменяю на более простой вариант из TI сэмплов. nRF есть разные модули от 1х1 см до 2х3 см — от ног нужных зависит. ALC посмотрю на что-то имеющееся — можно с STM-DISCO сдуть или болгаркой вырезать кусок, но там другой немного контроллер. ALC заказать можно, но недели три будет идти.


              1. netsnail
                14.10.2016 21:56

                Ненене, так не интересно! Компромиссы с простыми зарядниками — не наш путь! Опять же сдуть — тоже не вариант. Нужно то, что потом можно будет производить. Модули — только одобренные --минздравом-- FCC.


                1. x893
                  14.10.2016 22:04

                  Нам минздрав не указ :)
                  Как что-то городить если вдохнуть туда нечего?
                  В общем буду ждать код на github.


                  1. x893
                    14.10.2016 22:09

                    Надо будет заказать
                    https://redbear.cc/product/redbear-duo.html
                    для тестов


                    1. x893
                      14.10.2016 22:47

                      C 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 для аудио


                  1. r00tGER
                    17.10.2016 09:35

                    Такое чувство складывается, что они перед вами обязаны.

                    Соберите свой вариант, напишите свой код — и вдыхайте сколько влезет!


                    1. x893
                      17.10.2016 11:29

                      Нет — это чувство обманчиво. Конечно никто не должен ничего и код написать можно самому.


                      1. r00tGER
                        17.10.2016 11:38

                        Тогда статейку напишите, как будет готово. Ну, и ссылку на Гитхаб, обязательно!


                        1. x893
                          17.10.2016 11:44

                          Это естественно. Добавлю к имеющимся — но как руки дойдут. Быстро не получится.


    1. netsnail
      14.10.2016 21:18

      AP6212 стоит примерно столько же сколько EP8266+nRF52832. При этом требует неслабый хостовый контроллер c памятью и т.д. Стоимость устройства увеличивается раза в два. Плюс усложняется вопрос сертификации в FCC.


  1. tormozedison
    14.10.2016 20:17

    Обычная Bluetooth-гарнитура содержит всё необходимое, кроме акселерометра. Но микрофон тоже можно использовать для определения, гладят игрушку или бьют.


    1. Vespertilio
      14.10.2016 21:22

      Я бы не стал недооценивать паранойю людей =) Игрушки с микрофоном это уже почти как игрушки с камерой, а еще открытое железо… думаю не стоит.


      1. rekod
        14.10.2016 21:27

        Да, в том числе поэтому не стали делать с микрофоном.


        1. shara
          15.10.2016 01:33

          Вот только как с гироскопа, так и с динамика можно писать звук


          1. netsnail
            15.10.2016 01:59
            +1

            Теоретически. С цифрового гироскопа качество выйдет не ахти.


    1. rekod
      14.10.2016 21:26

      Обычная Bluetooth-гарнитура содержит всё необходимое
      Дайте ссылку на Bluetooth Low Energy (BLE) гарнитуру, чтобы жила не менее недели с одной зарядки. Мне очень-очень надо. Я куплю.


    1. netsnail
      14.10.2016 21:33

      Вывод произвольных звуков на Bluetooth динамик в произвольные моменты времени на мобильных платформах возможен лишь теоретически.


      1. rekod
        14.10.2016 21:45

        Лучше по простому посоветуй (как мне) посмотреть видео с использованием bluetooth наушников. У меня это быстро "эйфорию" выключило. Но народ видимо не в курсе… :)


        1. netsnail
          14.10.2016 21:51

          Тут как раз есть решение. В свежих версиях Bluetooth есть Low Latency audio. Однако, далеко не каждое устройство и не каждая гарнитура это поддерживает.


          1. rekod
            15.10.2016 01:04

            Ключевые слова "В свежих версиях Bluetooth" и "не каждое устройство это поддерживает".
            чопочём? (с)


            1. netsnail
              15.10.2016 01:58

              Вот тут наверняка есть :) http://www.apple.com/airpods/
              А если серьезно, ключевое слово «aptX».


  1. Drako_Staarn
    14.10.2016 21:28
    +1

    Реквестирую неофициальное имя — Хатуль мадан :) https://lurkmore.to/Хатуль_мадан

    Если что — куплю.


    1. rekod
      14.10.2016 21:29

      "кот учёный" — хорошая идея для персонажа! спасибо :)


  1. himch
    14.10.2016 23:57
    +1

    А какая функция у James the founder'а?
    Лицо проекта?


    1. rekod
      17.10.2016 15:50

      И это в т.ч.


  1. jafariuse
    17.10.2016 10:58

    Нет ли приложения для андроид выполняющее те же функции (прилюдно шутить, реагировать на события и т.д.)?


    1. rekod
      17.10.2016 15:50

      Да можно и написать — не проблема. Где будете "шутки юмора" брать? А у нас обновление контента от комиков будет ;-)


      1. jafariuse
        17.10.2016 18:38

        поработал над вопросом. шутки умеет шутить Дуся