[Перевод] Считыватель показаний цифровых штангенциркулей VINCA

r5ntexonb2knq1h1mpszwocx5hy.png


Этот проект посвящён замене кабеля передачи данных 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.

8umfds99nj7iyfzftg4l24fm884.png


▍ Программная часть


Пользовательский интерфейс здесь оформлен в стиле Excel, позволяя собирать и именовать полученные в ходе измерений данные. Основной дисплей постоянно обновляется через WebSocket, а показания измерений можно вставлять кнопкой или с помощью пробела.

Web-интерфейс сжат и сохранён на флеш-память ESP. При этом я использовал библиотеку, которую поддерживаю для других IoT-проектов. Она обеспечивает следующие возможности:

  1. Web-сервер со страницей /wifi для установки учётных данных Wi-Fi.
  2. Режим точки доступа; когда при загрузке последняя сохранённая сеть Wi-Fi оказывается вне доступа.
  3. mDNS-публикация службы HTTP, чтобы не искать её IP, а просто использовать vinca_reader.local.
  4. Беспроводное программирование (OTA).


▍ Поддержка прочего оборудования


В линейке продуктов VINCA есть три адаптера:

  1. DTCR-03 для цифровых штангенциркулей.
  2. DTCR-02 для штангенциркулей Clockwise Tools.
  3. DTCR-01 для цифровых индикаторов Clockwise Tools.


Во всех них использован разъём micro-USB, но при сравнении с дюймовыми цифровыми индикаторами DIGR-0105 я обнаружил у штангенциркулей кое-какие отличия:

  1. У индикатора линия +5 В подключена к 1.5 В, а на штангене она не подключена.
  2. Интервал между последовательной передачей пакетов у индикатора короче.


Было несложно добавить поддержку для тех и других, к тому же я считаю, что прочие модели вполне должны заработать, ну или потребуют незначительных модификаций.

rv27aogqjgfwjf0nsui9doibdz0.jpeg

Адаптер, запитанный от внешнего аккумулятора. Используется по Wi-Fi

pvcagykrnsonto_xrqob2yixdt0.jpeg

Адаптер также используется по Wi-Fi. При этом он подключён к цифровому индикатору и запитан напрямую от планшета

Оригинальный кабель от Clockwise Tools распознаётся как USB-клавиатура и при нажатии кнопки вводит измерения. При использовании ESP32-S2 эту функциональность также можно получить (у ESP8266 нет нативной поддержки USB).

os924hhxxuns1movvfkcnqei7zc.jpeg

Таблицы Google на Android с адаптером, подключённым как USB-клавиатура

Сноска:
1. Уже после завершения проекта я наткнулся на старенькую статью, в которой объяснялся формат бит. Там он намного проще — всего лишь количество единиц расстояния, то есть количество 0.01 мм или 0.0005», в зависимости от используемых единиц измерения. В итоге код я обновил, а саму статью можно найти здесь (перевод дан ниже, — прим. пер.) ↩


▍ Формат данных у штангенциркулей Harbor Freight


f_3jzc__6b7tc17ugzbjcrzqbbk.png


На прошлой неделе я начал писать новую прошивку, которая позволит цифровому индикатору MSP430 Launchpad считывать данные различных цифровых линеек и штангенциркулей. В своей последней статье я говорил о необходимости изменения оборудования и затрагивал высокоуровневые требования.

После сборки и тестирования платы адаптера я начал изучение форматов данных, используемых среди небольшого ассортимента штангенциркулей, который смог раздобыть. С помощью моего проверенного Open Logic Sniffer я идентифицировал два разных протокола. В цифровом индикаторе BG Micro использовался 48-битный протокол, описанный в замечательной статье Chinese Scales господина Shumatech. На удивление, ни в одном другом штангене этот протокол не задействовался.

Вместо двух 24-битных потоков, разделённых коротким интервалом, они передавали один такой поток, разбитый на шесть фрагментов по 4 бита каждый. Кроме того, скорость передачи в сравнении с 48-битными линейками была почти в 20 раз меньше. Если последние передавали данные примерно с частотой 80 КГц, то первые делали это в ленивом ритме со скоростью менее 4 КГц.

oehxnbimri2hzxqnvw4lj3embey.png

Штангенциркуль 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: Необработанные данные со штангенциркуля

При внимательном рассмотрении результатов вырисовываются кое-какие закономерности:

  • Последний бит потока указывает на режим inch, когда установлен, и на режим mm в противном случае.
  • 21-й бит указывает на отрицательность числа в противоположность остальным цифровым линейкам, где используется представление с дополнительным кодом.
  • Похоже, что штангенциркуль отправляет сначала младший бит, поскольку значения индикатора изменяют первые биты потока.


Вооружившись этой информацией, я решил поближе взглянуть на биты. Сначала на режим mm, а потом и на inch. Результат показан в таблице:

Таблица 2: «Нормализованные» данные

Эти данные предполагают, что в режиме mm положение отправляется в сотых миллиметра с использованием прямого двоичного кодирования для положительных и отрицательных чисел. В режиме inch штангенциркуль использует 2000 делений на дюйм (то есть положение передаётся в ½ тысячных). Поняв это, я смог начать работать над структурой прошивки, о чём напишу в следующей статье.

Примечание: я не смог определить, имеют ли какое-либо значение 22-й и 23-й биты. Кроме того, ничто не говорит о задействовании 20 первых бит. Используя 16 бит, штангенциркуль может проводить измерения в диапазоне более 65 см или 32 дюймов. Для DRO это неважно, поскольку я использую 32-битные целые со знаком (чтобы включить поддержку 24-битных цифровых линеек). В прочих случаях 16-битного целого должно быть достаточно для большинства измерений.


Telegram-канал с полезностями и уютный чат
sz7jpfj8i1pa6ocj-eia09dev4q.png

© Habrahabr.ru