Этот проект посвящён замене кабеля передачи данных VINCA DTCR-03 «RS232» для цифрового штангенциркуля на микроконтроллер ESP8266/ESP32 с поддержкой Wi-Fi.
Штангенциркуль VINCA DCLA-0605 поддерживает передачу данных на ПК только через проприетарный кабель. Можно, конечно, купить адаптер, но это не так интересно, поэтому я решил разобраться с принципом работы RS232 и реализовать собственное решение.
Примечание переводчика: данный перевод содержит две небольших статьи от двух разных авторов. Причиной включения второй стало желание наиболее полно раскрыть суть используемого в штангенциркулях протокола передачи данных.
▍ Расшифровка протокола последовательной передачи
На кабеле использован разъём micro-USB, который я обрезал, чтобы найти интересующие меня линии с помощью осциллографа. Было несложно определить, что D+ и D- связаны с тактовым генератором и передачей данных. Наличие тактового генератора указывает на то, что это синхронный протокол, хотя на Amazon сказано, что это RS232. Я написал скрипт Python для извлечения 24 бит, отправляемых с интервалом 150 мс, и их перевода в формат CSV. После этого немало времени мне потребовалось, чтобы понять эти данные через их сопоставление со всеми стандартами с плавающей точкой, какие я мог найти. Ничего не работало. В итоге мне всё же удалось добиться работоспособности протокола за счёт использования фиксированной точки1 при помощи дополнительных 4 бит, использованных для флагов. Один флаг представляет единицы измерения (дюймы/мм), а другой знак (при 1
отрицательный).
▍ Аппаратная часть
Когда с протоколом я разобрался, то был готов приступать к работе над аппаратной частью своего решения. Я хотел использовать платформу ESP, чтобы иметь возможность отправлять данные по Wi-Fi, но последовательная передача работает на 1.2 В, а ESP на 3.3 В. Тогда я занялся поиском схем для сдвига уровня, но большинство встречавшихся в сети вариантов основывались на мосфете 2N7000, а 1.2 В было недостаточно для активации его затвора. Меня интересовал мосфет с более низким напряжением между Gate (затвором) и Source (истоком), но при этом я не хотел использовать особую деталь. В конечном счёте я понял, что можно просто взять биполярный 2N2222. Так я немного терял в быстродействии, но его всё равно вполне достаточно для цифровых уровней 1
и 0
.
▍ Программная часть
Пользовательский интерфейс здесь оформлен в стиле Excel, позволяя собирать и именовать полученные в ходе измерений данные. Основной дисплей постоянно обновляется через WebSocket, а показания измерений можно вставлять кнопкой или с помощью пробела.
Web-интерфейс сжат и сохранён на флеш-память ESP. При этом я использовал библиотеку, которую поддерживаю для других IoT-проектов. Она обеспечивает следующие возможности:
- Web-сервер со страницей
/wifi
для установки учётных данных Wi-Fi. - Режим точки доступа; когда при загрузке последняя сохранённая сеть Wi-Fi оказывается вне доступа.
- mDNS-публикация службы HTTP, чтобы не искать её IP, а просто использовать vinca_reader.local.
- Беспроводное программирование (OTA).
▍ Поддержка прочего оборудования
В линейке продуктов VINCA есть три адаптера:
- DTCR-03 для цифровых штангенциркулей.
- DTCR-02 для штангенциркулей Clockwise Tools.
- DTCR-01 для цифровых индикаторов Clockwise Tools.
Во всех них использован разъём micro-USB, но при сравнении с дюймовыми цифровыми индикаторами DIGR-0105 я обнаружил у штангенциркулей кое-какие отличия:
- У индикатора линия +5 В подключена к 1.5 В, а на штангене она не подключена.
- Интервал между последовательной передачей пакетов у индикатора короче.
Было несложно добавить поддержку для тех и других, к тому же я считаю, что прочие модели вполне должны заработать, ну или потребуют незначительных модификаций.
Адаптер, запитанный от внешнего аккумулятора. Используется по Wi-Fi
Адаптер также используется по Wi-Fi. При этом он подключён к цифровому индикатору и запитан напрямую от планшета
Оригинальный кабель от Clockwise Tools распознаётся как USB-клавиатура и при нажатии кнопки вводит измерения. При использовании ESP32-S2 эту функциональность также можно получить (у ESP8266 нет нативной поддержки USB).
Таблицы Google на Android с адаптером, подключённым как USB-клавиатура
Сноска:
1. Уже после завершения проекта я наткнулся на старенькую статью, в которой объяснялся формат бит. Там он намного проще — всего лишь количество единиц расстояния, то есть количество 0.01 мм или 0.0005”, в зависимости от используемых единиц измерения. В итоге код я обновил, а саму статью можно найти здесь (перевод дан ниже, — прим. пер.) ↩
▍ Формат данных у штангенциркулей Harbor Freight
На прошлой неделе я начал писать новую прошивку, которая позволит цифровому индикатору MSP430 Launchpad считывать данные различных цифровых линеек и штангенциркулей. В своей последней статье я говорил о необходимости изменения оборудования и затрагивал высокоуровневые требования.
После сборки и тестирования платы адаптера я начал изучение форматов данных, используемых среди небольшого ассортимента штангенциркулей, который смог раздобыть. С помощью моего проверенного Open Logic Sniffer я идентифицировал два разных протокола. В цифровом индикаторе BG Micro использовался 48-битный протокол, описанный в замечательной статье Chinese Scales господина Shumatech. На удивление, ни в одном другом штангене этот протокол не задействовался.
Вместо двух 24-битных потоков, разделённых коротким интервалом, они передавали один такой поток, разбитый на шесть фрагментов по 4 бита каждый. Кроме того, скорость передачи в сравнении с 48-битными линейками была почти в 20 раз меньше. Если последние передавали данные примерно с частотой 80 КГц, то первые делали это в ленивом ритме со скоростью менее 4 КГц.
Штангенциркуль Harbor Freight отправил данные с помощью шести 4-битных фрагментов
В результате своих поисков я наткнулся на статью с сайта robotroom.com, где Дэвид описывает аналогичный протокол, называемый BCD 7, в котором используется семь 4-битных фрагментов. Каждый из первых шести фрагментов служит для представления десятичной цифры от 0 до 9, а последний содержит метаданные о её положении. Немного поэкспериментировав, я, к своей досаде, обнаружил, что в штангенциркулях использовался другой протокол. Порывшись в интернете, я так и не нашёл полезной информации, и мне оставалось лишь пойти путём реверс-инжиниринга этого протокола.
Примечание: BCD означает «Binary Coded Decimal» (двоично закодированное десятичное значение). С помощью этой схемы каждая десятичная цифра представляется посредством 4-битного фрагмента. Например, десятичное число 256, или 28, в двоичном виде будет выглядеть как 10000000. В формате BCD это будет 0010, 0101, 0110 (2,5,6). Отрицательные числа представляются с использованием дополнительного кода. Этот формат менее компактен, чем прямое двоичное представление, но для человека понятнее (на мой взгляд, он понятен в той же степени, что и поток единиц с нулями).
В тот момент основная часть прошивки уже работала, так что контроллер мог считать необработанный поток в 32-битное целое и отправить его на UART. Мне лишь нужно было установить точку останова в нужном месте и начать перемещать штангенциркуль. Я сразу заметил, что всякий раз, когда экран обнуляется, поток данных показывает все 0. Это означало, что в отличие от остальных цифровых линеек штангены передают только относительное положение. Чтобы разобраться получше, я начал записывать указываемые на экране положения и поступающий со штангенциркуля необработанный поток данных в таблицу, аналогичную показанной ниже.
Таблица 1: Необработанные данные со штангенциркуля
Поток вывода | Показания | Единицы измерения | |
---|---|---|---|
000000000000000000000000 | 0 | мм | |
001001100000000000000000 | 1.0 | мм | |
111100100000000000000001 | 1.0 | мм | |
010000000000000000000000 | 0.02 | мм | |
100000000000000000000001 | 0.0005 | дюйм | |
101111000000000000000000 | 0.2 | мм | |
000010000000000000000001 | .008 | дюйм | |
010000000000000000001000 | -.02 | мм | |
010000000000000000001001 | -.001 | дюйм | |
001000000000000000000001 | 0.002 | дюйм |
При внимательном рассмотрении результатов вырисовываются кое-какие закономерности:
- Последний бит потока указывает на режим
inch
, когда установлен, и на режимmm
в противном случае. - 21-й бит указывает на отрицательность числа в противоположность остальным цифровым линейкам, где используется представление с дополнительным кодом.
- Похоже, что штангенциркуль отправляет сначала младший бит, поскольку значения индикатора изменяют первые биты потока.
Вооружившись этой информацией, я решил поближе взглянуть на биты. Сначала на режим mm
, а потом и на inch
. Результат показан в таблице:
Таблица 2: «Нормализованные» данные
Двоичное значение | Десятичное | Показания | Единицы измерения | |
---|---|---|---|---|
000000000000000000000000 | 0 | 0 | мм | |
000000000000000001100100 | 100 | 1.0 | мм | |
000000000000000000001010 | 10 | 0.1 | мм | |
000000000000000000000001 | 1 | 0.01 | мм | |
000000000000000000000010 | 2 | 0.02 | мм | |
000100000000000000000010 | 2 | -0.02 | мм | |
100000000000000000000100 | 4 | 0.002 | дюйм | |
100000000000000000001000 | 8 | 0.004 | дюйм | |
100000000000011111010000 | 2000 | 1.000 | дюйм | |
100000000000011111010001 | 2001 | 1.0005 | дюйм | |
100000000000111110100000 | 4000 | 2.000 | дюйм | |
100100000000111110100000 | 4000 | -2.000 | дюйм |
Эти данные предполагают, что в режиме mm
положение отправляется в сотых миллиметра с использованием прямого двоичного кодирования для положительных и отрицательных чисел. В режиме inch
штангенциркуль использует 2000 делений на дюйм (то есть положение передаётся в ½ тысячных). Поняв это, я смог начать работать над структурой прошивки, о чём напишу в следующей статье.
Примечание: я не смог определить, имеют ли какое-либо значение 22-й и 23-й биты. Кроме того, ничто не говорит о задействовании 20 первых бит. Используя 16 бит, штангенциркуль может проводить измерения в диапазоне более 65 см или 32 дюймов. Для DRO это неважно, поскольку я использую 32-битные целые со знаком (чтобы включить поддержку 24-битных цифровых линеек). В прочих случаях 16-битного целого должно быть достаточно для большинства измерений.
Автор: Дмитрий Брайт