Как стать автором
Обновить

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

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

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


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



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


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


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

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




А напоследок хорошая новость. Браслет уже с завода поддерживает обновление 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).


PS Вообще очень похоже, что SDK для PHY62 была создана на основе SDK от Texas Instruments для их BLE чипов.
Теги:
Хабы:
+36
Комментарии 31
Комментарии Комментарии 31

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн