В интернете есть различные статьи, в которых энтузиасты делают свои смарт-часы. Самостоятельно изготавливают или печатают корпус. Делают начинку. Но на алиэкспрессе много уже готовых устройств. Например, как на фото ниже. Если верить описанию, то прям супер устройство: измеряет пульс, давление, калории и еще чего-нибудь.
Откроем и посмотрим, что внутри.
Мозгом данного браслета является чип PHY6202 от производителя из Поднебесной Fengjia Microelectronics. Внутри у него Cortex-M0 и стандартный набор периферии. Память: 512кБ Flash, 138кБ SRAM и 128кБ ROM. В ROM содержится стек BLE и UART загрузчик, т.к. программируется чип через UART. Китайские товарищи заботливо вывели для UART контакты. Для перехода в режим UART bootloader нужно вывод TM подтянуть к высокому уровню и сбросить чип.
Утилиты и SDK для PHY6202 (а также для его старшего брата PHY6212) можно найти тут.
Непосредственно для программирования чипа предусмотрена утилита PhyPlusKit. В документации есть список команд: стирание, запись и др. Подробности в документе PHY62XX_UART_FlashWrite_Protocol по ссылке выше (на китайском). Честно говоря, список команд описан не полный. PhyPlusKit использует еще одну команду rdreg (чтение любого регистра).
Приступим. Разбираем, припаиваем нужные контакты к UART-USB переходнику и вперед.
SDK содержит много примеров. Сама по себе она, на мой взгляд, кривовата и сыровата. Приходится иногда править исходники, т.к. они не рассчитаны на только «внешнее» использование. Вот функция замера уровня батареи из Battery Service. Зачем она там вообще непонятно.
static uint8 battMeasure( void )
{
uint8 percent;
percent = 95;
return percent;
}
Не SDK, а один сплошной пример.
Распиновка браслета такая:
1) акселерометр | SDA P32 SCL P33 |
2) LCD | SDA P25 SCL P31 RS P00 Reset P01 CS P02 LED P34 |
3) сенсорная кнопка | P03 |
4) вибромоторчик | P20 |
5) USB Vin (индикация подключения к USB) | P15 |
6) Vbat | P14/AIO3 |
7) Green LED (вдруг помигать захочется) | P23 |
Сенсорная кнопка сделана на чипе Tontec TTP233D-HA6.
Акселерометр неизвестный, но сканирование шины I2C показало, что он использует регистры как у всех ST акселерометров. Больше всего он похож на LIS2DH12. Вроде все управляющие регистры соответствуют.
Чтобы вывести свою информацию на браслет, нам нужен свой BLE-сервис для передачи данных. Что-то вроде SPP. Дополнительно можно добавить Battery Service и обновление прошивки через BLE.
За основу проекта возьмем пример прошивки для обновления OTA и переделаем под свои нужды. Добавим сервис для батарейки. Для передачи данных можно использовать пример реализации кастомного сервиса из SDK. Он использует один сервис FF01 и в нем одну характеристику FF02.
К работающим сервисам прикручиваем:
- обработку прерываний по сенсорной кнопке. Помимо включения экрана и включения/выключения самого браслета, сделаем распознавание однократного и двойного нажатия с передачей команды через нашу FF02 характеристику.
- вывод данных полученных со смартфона через ту же характеристику на дисплей.
- короткое включение вибромоторчика для привлечения внимания.
- используя акселерометр, включение экрана при резком взмахе рукой (настроить сложновато, т.к. при беге и так машешь руками).
Хорошо, браслет готов. Проверку делаем через nRFConnect, она позволяет и читать, и писать значения характеристик. На экране пульс, время, дистанция и еще один таймер (например, для вывода времени отставания или опережения графика, т.е. своеобразный pacemaker, но это только со своего приложения можно получить).
Надо теперь где-то взять данные, чтобы их передать. Я на данный момент пользуюсь приложением Strava, хотя она мне нравится все меньше. Пожалуй, самый простой способ получить от нее время пробежки и расстояние (правда, с округлением до 100 м) из уведомлений в статусбаре. Для этого надо написать приложение с сервисом для прослушивания уведомлений. Особого труда это не составляет. А вот пульс будем читать напрямую с BLE или ANT+ пояса. Ну а поскольку у нас есть уведомления от браслета о нажатии кнопок, то надо куда-нибудь их использовать. Например, можно, отправляя сообщения через BroadCastReceiver, ставить Страву на паузу и снова запускать. А лучше когда-нибудь сделать свою Страву with bells and whistles. Приложение требует прав для доступа к местоположению (это нужно для работы с BLE) и прав на доступ к уведомлениям.
Осталось проверить в деле. К сожалению зима закончилась еще в феврале, поэтому цикл из картинки в начале статьи уже завершился. Но можно и пробежаться. Акселерометр частенько включает экран без надобности, может быть его стоит выключить совсем. А сенсорная кнопка может среагировать на каплю, упавшую со лба.
А напоследок хорошая новость. Браслет уже с завода поддерживает обновление OTA через приложение PhyApp (лежит там же где и SDK, изначально на китайском языке). Поэтому, имея уже готовую прошивку, даже разбирать браслет не требуется. Прошивай и пользуйся. Для этого нужно установить приложение, положить в «корень» телефона прошивку (HEX, а не HEXF, т.к. последний содержит bootloader, который у нас уже есть с завода), подключиться к браслету и через кнопку OTA залить прошивку в браслет. После прошивки браслет будет выключен, для включения нужно подержать кнопку 2 сек.
В целом часы и браслеты на PHY62 можно без проблем переделать во что угодно.
Ссылки:
- исходники и APK android-приложения (писалось под Android 8.1, под 9кой вроде работает, под другими не проверял);
- HEX файл прошивки через BLE, и HEXF — для прошивки через UART (исходники мне не жалко, но нужно понять, что по лицензионному соглашению я могу выложить, а что нет, кто в этом спец пишите) + переведенное на английский язык приложение PhyApp для прошивки OTA.
- браслет покупался тут, но гарантировать, что начинка будет аналогичная, я не могу, т.к. много одинаковых по виду, но с разным чипом. Есть вроде варианты с экраном побольше, в которых тоже стоят PHY6202. А вообще бывают часы/браслеты с разными чипами (Phy+, Telink, и даже nRF).
PS Вообще очень похоже, что SDK для PHY62 была создана на основе SDK от Texas Instruments для их BLE чипов.
wholeman
У меня есть своё приложение для спорта, правда, не уверен, что буду доводить его до релиза. Давно хочется добавить в него такую функцию, как определения стиля движения на лыжах. По идее это можно определить по данным акселерометра, но подходящее устройство как-то не находилось. Как думаете, возможно ли сделать подобный анализ в этом браслете?
greyfox13 Автор
Сложно сказать. Акселерометр вроде нормально относительно работает. А вот как определить стиль классика/свободный — это вопрос. Если только попробовать снять логи с него в движении. Но мне кажется — это всё будет глючить. Какая принципиальная разница в двух стилях с точки зрения браслета? Руки и там и там работают. Ускорения тоже будут примерно одинаковые.
wholeman
Однократно логи можно снять и смартфоном — у меня есть китайские «часы» на Android, они для этой цели вполне подходят. Они только садятся быстро, и кнопка иногда одеждой нажимается, поэтому приспособить их для постоянного использования не получилось. А такие браслеты можно повесить на каждую руку и ногу, что даст достаточно полную картину.) Жаль, что в них гироскопа нет.
greyfox13 Автор
А что за часы, если не секрет? А еще интересно цель этого автоматического разпознавания стиля, обычно или КС, или СС.
wholeman
KingWear KW88. Смартфон в форм-факторе часов. Очень китайский.
Я иногда чередую разные стили в пределах одной тренировки. Бесшажный классический, коньковый — одно- и двухшажный, а также без палок. Скорость и пульс получаются разные, и хотелось бы посмотреть, как эти показатели изменяются со временем.
commenter
Акселерометр как раз работает плохо. Во первых — он ограничен по максимальному ускорению, поэтому при резких движениях кривая просто обрезается, что очевидно даёт никакую точность. Во вторых, погрешность измерений на малых ускорениях очень большая, поэтому состояние плывёт буквально за секунду, когда уже становится непонятно, какая сейчас реальная скорость, и тем более — где мы находимся (второй интеграл).
Хотя может вы встречались с приличными гироскопами? Максимальные ограничения — от 8g, точность — миллиметры/с^2 или лучше.
greyfox13 Автор
Вот с тестовые данные с браслета. Диапазон 4g. Но когда бежишь вниз, там перегрузки больше. В лыжах тоже по разному. Частота 50 sps. Можно и 400 (возможно и больше) сделать, только кушать он будет больше.
commenter
В каких единицах ось Y? И где крепится браслет?
При беге и креплении на руке 4g часто хватает, но если чуть сильнее рукой взмахнёшь — выходит за диапазон. 4g это +-2g, то есть 1g сразу вычитается с одной стороны, а с другой запас 3g остаётся. У вас тоже видно на графике (если 10000=1g), что амплитуда взмахов руками выйдет за предел, если ещё вычесть 1g земного притяжения.
Собственно и по такому акселерометру можно получить некоторую информацию, но это лишь общий вид, то есть можно отличить бег от ходьбы или от взмахов палками, но не более. Для большего нужно получать скорости и перемещения по трём осям. Даже ходьбу от медленного бега можно не отличить. Вот поэтому я и говорю про необходимость расширить диапазон до 8g (будет +-4g) и повысить точность. Если ваши показания проинтегрировать, то через пару секунд вы по таким данным уже в космос полетите (положение будет «над землёй в 1-м метре»), а на самом деле всё так же бежите.
Я пытался по данным с часов бег измерять — даже сам бег и то сложно выделить. Поднимаюсь по лестнице — как будто бег получается, ну и тому подобное. Что бы отличить нужно считать положение, и считать достаточно точно. Если есть подъём на метр, значит это именно лестница, а не кривые показания — как-то так.
greyfox13 Автор
Ось Y в единицах выдаваемых акселерометром (16 бит, т.е. +-32768, разрешение вроде стояло 12 бит). В настройках чипа задал диапазон +-4g по даташиту. На графике видно, что в покое величина ускорения около +8000, что есть земное притяжение. Ну, а то что интегрировать «хаотичные» данные дело тухлое — это я знаю. Был опыт. А браслет был на руке.
greyfox13 Автор
Можно еще акселерометр самого смартфона попробовать, но опять надо снимать логи и анализировать.