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

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

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

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

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

Комментарии (17)


  1. Exchan-ge
    06.11.2022 13:11
    +2

    Представил, как я хожу со всем этим добром по цеху (а ведь таки приходилось :)

    (и тогда еще не было беспроводных технологий)


  1. AntonSor
    06.11.2022 13:12
    +2

    На чипмейкере статья про считывание показаний с цифрового штангенциркуля была ещё лет пять назад. Там и трехканальные дисплеи городили для трех координат.


  1. Javian
    06.11.2022 14:33
    +2

    Интересно почему в коллекторе транзистора стоит резистор всего на 100 ом, а не килоОм и более.


    1. Serge78rus
      06.11.2022 15:08
      +7

      Фраза:

      Тогда я занялся поиском схем для сдвига уровня, но большинство встречавшихся в сети вариантов основывались на мосфете 2N7000

      наводит на мысль, что автор оригинального текста не особо силен в схемотехнике, а предпочитает копировать чужие решения из сети, при этом не особо вникая в причины использования тех или иных номиналов элементов. То есть попалась где-то схема со 100-омными коллекторными резисторами, поэтому и поставил 100 Ом. Но это только мое предположение.


    1. FGV
      06.11.2022 18:22
      +1

      Интересно почему в коллекторе транзистора стоит резистор всего на 100 ом, а не килоОм и более.

      Может быть для хороших фронтов. КилоОм и более скорее всего их завалят в хлам, для примера - через H11L1 и 1К в коллекторной цепи 115200 бод уже с трудом пролазят.


      1. Javian
        06.11.2022 18:51

        На хабре была подобная статья про штангенциркуль https://habr.com/ru/post/133088/ Согласование уровней сделано специфично - светодиодом и резистором 200 Ом включенного в разрыв провода GND.

        Попадалось несколько лет назад видео блогерши SexyCyborg где она подключала модуль Bluitooth и использовала приложение на Android. Быстро не нашлось.


      1. VT100
        06.11.2022 21:01

        Дело в оптроне, а не в резисторе.


        1. FGV
          07.11.2022 06:58

          Ага. Точнее в емкости коллекторного перехода, которая вместе с резистором определяет постоянную времени rc-цепи. Фиг знает что за транзисторы у автора, но подозреваю что что то среднечастотное или вообще без маркировки выпаянное непойми откуда. Отсюда вопрос а нафиг в таких случаях мучатся и тыкать осциллографом смотря на завалленые фронты если незаработает? Уж лучше 100 ом воткнуть в коллектор, с гарантией.


    1. nixtonixto
      07.11.2022 12:44

      Потому что не догадался припаять конденсатор на сотню пФ, вот и пришлось занижать сопротивление до минимально возможного номинала. И вообще, каскад с ОЭ всегда будет медленней каскада с ОБ из-за насыщения, поэтому по-хорошему такие трансляторы делают на ОБ и добиваются сотен нс для BC817.


  1. staticmain
    06.11.2022 17:47

    • Последний бит потока указывает на режим inch, когда установлен, и на режим mm в противном случае.

    В четвертой строке бит 1, но измерения в мм


    1. Bright_Translate Автор
      06.11.2022 18:10
      +1

      Да, у автора, видимо, опечатка. Исправил


  1. pvvv
    06.11.2022 19:10
    +6

    выход с mitutoyo.

    делал когда-то очень давно чтение ещё lpt портом, а потом и через ft232h.

    сейчас еле нашел в электронном виде, в бумажном к микрометрам прилагалось, но в связи с тем что видимо самим очень хочется продавать провода за сотни $$ эти ненужные подробности со своего сайта похоже поубирали.


    1. dlinyj
      06.11.2022 19:28

      Спасибо добрый человек! А модель какая?


      1. pvvv
        07.11.2022 00:54
        +2

        Что-то из этого https://www.mitutoyo.com/products/small-tool-instruments-and-data-management/indicators/digimatic-indicators/

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


  1. serafims
    07.11.2022 10:05

    Esp32 по Bluetooth умеет прикинуться клавиатурой, что сделает ввод данных в эксель на пк, или в смартфон ещё удобнее.


    1. serafims
      07.11.2022 10:07

      может быть кто-то знает про цифровой штангенциркуль с памятью последних измерений?


    1. pvvv
      07.11.2022 14:51

      а можно и без esp32 с помощью пары резисторов, конденсатора и диода соединить клоки и данные вместе так, что на выходе на каждый импульс клока получится отрицательный импульс с длительностью, которая зависит от состояния выхода данных. Соответственно это можно просто втыкать в любой uart приёмник (неограниченное количество usb->uart приёмников) и получать поток из байтов типа 0x03 для бита 0 и 0x3F для бита 1. на скорости 115200 - 87мкс на байт, должно хватить.

      а уж клавиатуру потом можно и программно эмулировать.