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

в 10:00, , рубрики: diy или сделай сам, esp32, esp8266, ruvds_перевод, vinca, Беспроводные технологии, Блог компании RUVDS.com, протокол rs232, реверс-инжиниринг, цифровой штангенциркуль

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


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

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

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

Пользовательский интерфейс здесь оформлен в стиле 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. Интервал между последовательной передачей пакетов у индикатора короче.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Штангенциркуль 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-битного целого должно быть достаточно для большинства измерений.

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

Автор: Дмитрий Брайт

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js