Ни дня без спорта — 2: перепрограммируем китайский браслет

У людей, занимающихся спортом, частым спутником на пробежках или заездах является смартфон с различными приложениями. С велосипедом проще, можно закрепить смартфон, к примеру, на руль и смотреть выдаваемые с датчиков данные. А что делать, если ты бежишь или едешь на лыжах? Можно закрепить смарт на руку, для этого есть специальные чехлы (в том числе поворотные). Но это неудобно и порой громоздко. К тому же русский витязь прямо не ходит.

dbc29904599783c913ea03fe4562d334.png


В интернете есть различные статьи, в которых энтузиасты делают свои смарт-часы. Самостоятельно изготавливают или печатают корпус. Делают начинку. Но на алиэкспрессе много уже готовых устройств. Например, как на фото ниже. Если верить описанию, то прям супер устройство: измеряет пульс, давление, калории и еще чего-нибудь.

06ed7f9c88d5f8b0d3e34ee2b207f04c.jpg


Откроем и посмотрим, что внутри.

561f0d68ecd95dc466e728891024b038.jpg


45a16edca51e735379e7d51cde6342f8.jpg


А на самом деле
А на самом деле в браслете используются нанотехнологии. Он может измерять пульс и давление даже дистанционно на любом объекте. Помигают два зеленых светодиода и функция Random () выдает значение. Но, в общем, мне и не нужно, так как пульсометр у меня уже есть.
ce6a4128df9f3e7992ebbe71f77a9081.jpg


Мозгом данного браслета является чип 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, а один сплошной пример.
Распиновка браслета такая:
Дисплей стандартный (на алиэкспрессе их полно) на ST7735 с разрешением 80×160. Работает по SPI. Под него есть готовые библиотеки, но лучше сделать свою лайт-версию, под свой размер шрифта и свои символы. Дисплей цветной, но это на улице не сильно актуально, т.к. контрастность невысокая (с грустью вспомнил трансфлективные дисплеи от сименсовских телефонов). Да и стекло тонированное. Будем для отображения текста использовать белый цвет, его видно лучше всего.

Сенсорная кнопка сделана на чипе Tontec TTP233D-HA6.

Акселерометр неизвестный, но сканирование шины I2C показало, что он использует регистры как у всех ST акселерометров. Больше всего он похож на LIS2DH12. Вроде все управляющие регистры соответствуют.

Чтобы вывести свою информацию на браслет, нам нужен свой BLE-сервис для передачи данных. Что-то вроде SPP. Дополнительно можно добавить Battery Service и обновление прошивки через BLE.

За основу проекта возьмем пример прошивки для обновления OTA и переделаем под свои нужды. Добавим сервис для батарейки. Для передачи данных можно использовать пример реализации кастомного сервиса из SDK. Он использует один сервис FF01 и в нем одну характеристику FF02.

Спойлер

Все примеры из SDK при инициализации для всех GPIO выводов делают подтяжку к 0, для снижения потребления. Но есть один нюанс. С дисплея и акселерометра питание не снимается, даже когда процессор спит или выключен. И если в акселерометре выполнена подтяжка линий к питанию, то получится через этот pull-up и последующий pull-down (а он равен 100 кОм) будет просто так течь ток с десяток микроампер. Так на практике и оказалось. Изначально с родной прошивкой браслет в выключенном состоянии потреблял около 40 мкА, а если убрать «лишние» pull-down, то можно получить 15 мкА (столько по даташиту кушает спящий дисплей).


К работающим сервисам прикручиваем:
1) обработку прерываний по сенсорной кнопке. Помимо включения экрана и включения/выключения самого браслета, сделаем распознавание однократного и двойного нажатия с передачей команды через нашу FF02 характеристику.
2) вывод данных полученных со смартфона через ту же характеристику на дисплей.
3) короткое включение вибромоторчика для привлечения внимания.
4) используя акселерометр, включение экрана при резком взмахе рукой (настроить сложновато, т.к. при беге и так машешь руками).

Хорошо, браслет готов. Проверку делаем через nRFConnect, она позволяет и читать, и писать значения характеристик. На экране пульс, время, дистанция и еще один таймер (например, для вывода времени отставания или опережения графика, т.е. своеобразный pacemaker, но это только со своего приложения можно получить).

05ec2d523abd410d757d78d28404f495.jpg


Надо теперь где-то взять данные, чтобы их передать. Я на данный момент пользуюсь приложением Strava, хотя она мне нравится все меньше. Пожалуй, самый простой способ получить от нее время пробежки и расстояние (правда, с округлением до 100 м) из уведомлений в статусбаре. Для этого надо написать приложение с сервисом для прослушивания уведомлений. Особого труда это не составляет. А вот пульс будем читать напрямую с BLE или ANT+ пояса. Ну, а поскольку у нас есть уведомления от браслета о нажатии кнопок, то надо куда-нибудь их использовать. Например, можно, отправляя сообщения через BroadCastReceiver, ставить Страву на паузу и снова запускать. А лучше когда-нибудь сделать свою Страву with bells and whistles. Приложение требует прав для доступа к местоположению (это нужно для работы с BLE) и прав на доступ к уведомлениям.

Осталось проверить в деле. К сожалению зима закончилась еще в феврале, поэтому цикл из картинки в начале статьи уже завершился. Но можно и пробежаться. Акселерометр частенько включает экран без надобности, может быть его стоит выключить совсем. А сенсорная кнопка может среагировать на каплю, упавшую со лба.

28143465e076d0bfffd4713ee3714dfd.jpg


7de3964df105d5e81a14e8c74678a6fb.png


4a960d8303b719420a441aff10c0d60c.png


А напоследок хорошая новость. Браслет уже с завода поддерживает обновление OTA через приложение PhyApp (лежит там же где и SDK, изначально на китайском языке). Поэтому, имея уже готовую прошивку, даже разбирать браслет не требуется. Прошивай и пользуйся. Для этого нужно установить приложение, положить в «корень» телефона прошивку (HEX, а не HEXF, т.к. последний содержит bootloader, который у нас уже есть с завода), подключиться к браслету и через кнопку OTA залить прошивку в браслет. После прошивки браслет будет выключен, для включения нужно подержать кнопку 2 сек.

В целом часы и браслеты на PHY62 можно без проблем переделать во что угодно.

Ссылки:

  1. исходники и APK android-приложения (писалось под Android 8.1, под 9кой вроде работает, под другими не проверял);
  2. HEX файл прошивки через BLE, и HEXF — для прошивки через UART (исходники мне не жалко, но нужно понять, что по лицензионному соглашению я могу выложить, а что нет, кто в этом спец пишите) + переведенное на английский язык приложение PhyApp для прошивки OTA.
  3. браслет покупался тут, но гарантировать, что начинка будет аналогичная, я не могу, т.к. много одинаковых по виду, но с разным чипом. Есть вроде варианты с экраном побольше, в которых тоже стоят PHY6202. А вообще бывают часы/браслеты с разными чипами (Phy+, Telink, и даже nRF).

© Habrahabr.ru