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

В мире существует невероятное количество говорящих игрушек для детей и это только усугубляет впечатление, что взрослым быть скучно. Наша команда решила исправить эту ситуацию.
Всё началось с того, что в пытливый ум одного моего друга и коллеги netsnail [1] пришла светлая мысль: а почему бы не только детей, но и взрослых не повеселить тематическими шутками? Благо доступное и хорошо зарекомендовавшее себя железо сейчас уже ни разу не редкость, да и умеет оно не только лампочками мигать, но и песни петь [2].
В связи с этим он позвонил мне и предложил повторить эпический подвиг убедиться так ли хорошо ESP8266 музыку в MP3 формате играет по сети и не разрывает ли хомячка на куски хватает ли реально производительности, что я и сделал по быстрому в новогодние праздники 2016 года:
На видео ESP8266 играет интернет радио, выводя звук с помощью хака «5-битный PWM через I2S».
Однако проигрывание MP3 радио из интернет кушало почти весь ресурс ESP8266 и звучало «так себе», в то время как воображение уже рисовало нам нечто большее [3], чем просто MP3 радио колонку. С этими творческими порывами мы и пошли к нашей команде и любимому шефу Владимиру [4].
После небольшого мозгового штурма начала вырисовываться более детальная картина и даже логическая цепочка того, что мы не только хотим, но и можем сделать:
Изначально хотелось сделать очень простой, но полностью рабочий прототип на плате «всё в одном», поэтому решили попробовать на LinkIt ONE [8] от MediaTek. И netsnail [1] это почти сходу удалось. Был и коннект с телефоном и с SD карточки MP3 отлично проигрывались.
Казалось бы — вот оно счастье и готовая уже платформа! Но потом мы столкнулись с суровой реальностью ограничениями их закрытого SDK и эйфория прошла.
Мы поняли, что готовой платформы на одной плате, удовлетворяющей всем нашим пожеланиям, не было в природе, а значит нам предстояло создать её с нуля.
Итак, нам предстояло выбрать (февраль 2016) наиболее подходящий BLE чип, который необходимо было связать с ESP8266. В качестве связи между ESP8266 и BLE чипом (мы тогда не знали ещё какой это будет чип) решили использовать стандартный TWI (I2C).
А вот с BLE выбор был тогда не особо велик:
В итоге первое железо выглядело как паук тарантул примерно так:

Ловить глюки из-за отваливающихся dupont кабелей, особенно на модуле nRF51822, где pin'ы чуть меньше размером, было очень грустно.
Тем не менее я и affair [17] уже на этом железе-пауке начали реализовывать BLE сервисы и характеристики на nRF51822, поделив всё примерно пополам:
MaximKit [19] в это же время делал приложение под iOS.

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

На фото не видно, но слот для microSD карты там уже есть. На маленькой квадратной платке внизу — ALC5627 [21], звук был уже гораздо лучше, чем 5-битный PWM через I2S.
Для управления питанием выбрали AXP209 [22]. Позволяет и заряжать и использовать аккумулятор одновременно, а также следить за его состоянием. Чип очень распространённый, но имеет много специфики как в программировании, так и в требуемых внешних компонентах, т.н. «обвязке».
Параллельно с этим flexxnn [6] портировал на ESP8266 Speex [5], FatFs [23], сделал bootloader для ESP8266 и nRF51822, чтобы можно было не шить обновлённые прошивки по проводам, а делать это помещая файлы прошивок на microSD карту.
Лично мне кажется ему помогали инопланетяне, так как сделал он это всё примерно за месяц. Но он не сознаётся в контактах с инопланетным разумом.
А затем и второй более нормальный прототип:

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

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

В то же время подтвердились опасения, что события с телефона могут приходить довольно часто и в итоге пользователь получил бы раздражение вместо веселья. Требовалась гибкая логика для фильтрации, которую можно легко менять в любой момент без перепрошивки. В связи с этим я, изучив матчасть и поняв, что для ESP8266 быстрых и компактных скриптов нет (Lua и microPython — интерпретаторы), решил портировать Pawn language [7], который быстро (всего лишь в 18 раз медленнее нативного) исполняет компактный байткод.
Кстати исходники на Pawn очень похожи на C, поэтому скрипты модифицировать одно удовольствие — их достаточно всего лишь скомпилировать в AMX байткод и скопировать на SD карту.
И тут «внезапно» мы все вспомнили, что Android телефонов в мире не так уж и мало, а даже больше, чем телефонов с iOS.
В итоге мне пришлось в темпе проверить сможем ли мы обмануть гаджеты и прикинуться iOS на Android, чтобы они увидели сервис ANCS, неотличимый от Apple.
В итоге всё удалось и уже через неделю гаджеты (и наш кот не исключение) искренне верили, что у меня iPhone с ANCS сервисом, подключаясь к моему Nexus 5 и даже к старому Samsung Galaxy с Android 4.4.
Так как никто не любит слушать шутку по несколько раз (факт), а также существуют предпочтения и культурные ограничения, решено было каждому пользователю формировать уникальный playlist. Для этого affair [17] вплотную занялся сервером в облаке.
Но как решить кому что понравится? Правильно — пусть решит сам пользователь! Для этого я сделал базовый gesture detection на акселерометре LIS3DH [24] от STMicroelectronics. Понравилась шутка — наклонил кота, как будто «да», не понравилась шутка — наклонил вбок, как будто «нет». А ещё добавил «незабудку» для телефона — если связь по BLE пропадает, а акселерометр фиксирует движение, значит кота куда-то несут, а телефон забыли.
После того как пользователь «полайкал» и обозначил тем самым свои предпочтения — информация уходит на сервер, где идёт сравнение «геномов» playlist'ов и пользователю формируются новые наборы шуток. Но это уже тема для отдельной статьи.
В итоге из развлечения получилась отличная платформа, которая умеет:
Что примечательно, «оч.умелые ручки» вполне могут подключиться к соответствующим 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/
Нажмите здесь для печати.