Рулетка нужна для того что бы составить карту парка. Потом по этой карте будет ездить робот и ориентироваться уже по визуальным ориентирам из карты. Такая стратегия нужна для максимального удешевления робота. Карта делается один раз и под присмотром человека, а роботов много, они работают самостоятельно и должны быть максимально дешевы, т.к. могут быть украдены.
Картографирование парка весьма трудоемкая задача. Но работа обезьянья: угол померь, дистанцию померь, в табличку запиши, погрешности посчитай, равномерно распредели, координаты посчитай. Рутинно, однообразно, утомительно и очень внимательно. Такая работа на первый взгляд должна хорошо автоматизироваться. Как мерить угол вроде бы понятно, расстояние предполагается мерить лазерной рулеткой. Пока это видится самым доступным по стоимости вариантом.
Для этого была выбрана рулетка INSTRUMAX SNIPER 80 PLUS IM0129. Стоит примерно как 1 грамм золота. Чуток поменьше. Выбрана из-за заявленной дальности измерения 80 метров (максимум в дешевом сегменте) и наличия Bluetooth канала передачи данных. Была гипотеза, что BT модуль это отдельная железка внутри рулетки и можно будет перехватить и расшифровать обмен между основным процессором и этим модулем. Это нужно для того, что бы собрать в одном месте данные от измерителей угла и дистанции для дальнейшей обработки.
День первый
Вскрытие рулетки показало, что собственно сам измеритель там фазовый, сделан на старом добром STM32f030C8T6 (Cortex-M0), Si5351 и рассыпухе, а ВТ канал сделан на SoC cy8c4247lqi-bl483. Причем это не Bluetooth Classic, a BLE. Внутре так же обнаружился трехосевой акселерометр - он нужен для определения угла поворота при косвенных измерениях.
Спец софт, предлагаемый производителем рулетки PHOTO PLAN устанавливаться на мой телефон c Андроид 9 не стал - сказал "устройство не поддерживается". Это несколько огорчило - предполагалось проводить измерения из этого софта и подслушивать обмен между основным процессором и ВТ модулем. Из
ДШ на SoC стало понятно, что это не BT, а BLE. Тогда была предпринята попытка подключиться терминальной программой. Вот чисто наугад. На удивление терминал увидел рулетку как Sniper 80. Сам предложил UUID и с нескольких попыток, методом перебора, удалось подключиться. Сначала подключался в режиме HEX, на случай если обмен там бинарный. Оказалось, что рулетка отдает в терминал какую то посылку после каждого измерения. Дальнейший анализ показал, что это обычный текст. Текст содержит только последние показания дистанции и при изменении режимов работы самой рулетки никак не менялся, кроме смены единиц измерения.
Для практического применения ВТ канал громоздок из-за сложностей установления связи. Для практической работы было бы удобнее управлять рулеткой по RS-485. Для этого необходимо найти внутри рулетки контакты клавитатуры и цифровые данные отправляемые на ВТ модуль. Внимательное вглядывание в плату и ощупывание ее осциллографом показало, что ВТ модуль соединен одной дорожкой с выводом передачи USART1 микроконтроллера. Вполе допустимо, что коммуникация может быть однонаправленной. Ввиду того, что на пузе BT SoC расположен огромный Termal Pad, было предположение, что это соединение BT SoC и микроконтроллера единственное. На этом выводе была явная активность в моменты как ожидания, так и работы. Правда несколько смущало, что в описании SoC этот вывод не был подключен к аппаратному USART, да и внешний вид сигнала был больше похож на тактирование, а не на USART. Но тем не менее была предпринята попытка отработать гипотезу, что это все же USART. Вдруг для экономии выводов контроллера были реализованы какие то смешанные схемы интерфейсов? Типа на SoC отправим USART, а на дисплей перенозначим порт и отправим как то иначе. Подключение к приемному терминалу по USART не дало осмысленных результатов ни при каких вариантах скоростей.
После отказа от гипотезы об USART, было еще раз проведено пристальное вглядываение с переворотом платы. Для этого пришлось отпаять контакт от батарейного отсека. На обратной стороне ничего полезного не обнаружилось.
Повторное ощупывание контроллера осциллографом показало, что рядом с предполагаемым выводом USART1_TX тоже есть активность. Очень похоже было на I2C. Да и две детали напоминающие резисторы очень были похожи на характерные для шины I2C резисторы подтяжки.
Дальнейшее вглядывание показало, что я неправильно посмотрел назначение вывода в документации на SoC. Вывод был как раз таки SCL I2C. Это хорошо совпадало с аналогичным назначением вывода микроконтроллера. Да и сигнал все же весьма был похож на тактирование, а не на USART. После этого была обследована активность на выводе рядом, который должен быть информационным сигналом SDA шины I2C. Несмотря на то, что визуально никаких дорожек видно не было, на выводе SDA SoC так же была активность, из чего следует вывод, что связь между BT SoC и управляющим микроконтроллером все же осуществляется через шину I2C, а дорожку все же умудрились запихать в промежутке между выводами и термопадом. На этой же шине сидит и дисплей. Это хорошо, т.к. можно считывать содержимое дисплея и после расшифровки понять что на нем отображается. Это резервный вариант, если не получится понять, что отправляется в BT SoC.
Теперь надо изготовить I2C сканер и посмотреть активность на шине.
День второй
Попробовал сделать сниффер шины I2C на контроллере - нашел
готовый проект. Вроде и работал, но 360 кГц тактовой частоты шины отрабатывать не успевал.
Далее применил логический анализатор Saleae. Т.к. уже был опыт первого дня и я примерно понимал как выглядит обмен на шине в момент когда я нажал кнопку измерения, то логи рассматривались чуток более прицельно. На шине были постоянные попытки прочитать что то из устройства с адресом 0х10. После измерений добавлялись длиннющие колбасы записи в устройство с адресом 0х60. Если отключить BLE (оказалось, это недокументированная функция долгого нажатия кнопки режима сложных измерений), то на шине оставалась только запись в устройство с адресом 0х60. Из чего был сделан вывод, что адрес BT SoC - 0x10, а LCD дисплея - 0х60.
После этого была предпринята попытка отыскать в логах какие то транзакции на запись в устройство с адресом 0х10. И такая посылка нашлась! Прямо в ASCII коде передавалось в BT SoC то, что потом появлялось в терминале.
Теперь уже нет сомнений, что получится взаимодействовать с рулеткой из внешнего компьютера - запускать измерения и получать данные. Для этого нужно сделать простенькую примочку которая будет читать данные которые отправляютсяна устройство с адресом 0х10 и передавать их в RS-485. А в обратную сторону, по командам из RS-485, нажимать кнопки.
Рис. Посылка в SoC с данными измерения 0,387 м. Все вполне читается.
Внешний вид рулетки:
Задняя сторона
Оптика
Вскрыта передняя крышка
Снята клавиатура и дисплей
Подвижное зеркало, которое замыкает оптический тракт для самокалибровки
BT SoC и управляющий микроконтроллер
Обратная сторона платы.
Такие UUID использовались для подключение по BLE
Так выглядит сообщение одиночного измерения от рулетки в бинарном виде. Строка не имеет CR LF на конце.
Так измерения выглядят в текстовой интерпретации.
Места подключения к шине I2C.
Активность на линии SCL шины I2C, лазер выключен. Это что то читается из BT SoC.
Активность на линии SCL шины I2C, лазер включен в режим наведения на место измерения. Опять что то читается из BT SoC.