Предыстория

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

В бюджетных мультиметрах ZT102 и ZT301, которые построены на чипе DTM0660, можно реализовать подключение к компьютеру, но для этого придётся редактировать EEPROM и вносить изменения на печатную плату. Это несложно и Kerry Wong описывал как это сделать на примере мультиметра ennoLogic eM860T.

В тоже время у моего настольного мультиметра Agilent U3402A на задней панели уже есть порт RS232, но на нём указано "используется только для калибровки". Аналогичное предупреждение есть и в инструкции пользователя на русском и английских языках.

На форуме Keysight нашлось упоминание что Agilent поддерживал подключение мультиметра U3402A к компьютеру через последовательный порт, но только для клиентов из Китая и Кореи. Ещё я помню как в одном из видео Keysight рассказывали про полностью автоматическую процедуру поверки и калибровки мультиметров. Для этого в процессе поверки/калибровки как минимум должны переключаться режимы измерений и читаться показания. Так что скорее всего управление через RS232 работает не только для китайских и корейских клиентов.

На одном из китайских сайтов нашлось руководство пользователя на китайском языке и в нём есть раздел описывающий работу через порт RS232. Я перевёл этот раздел на русский язык и залил на GitHub.

RS232 адаптер

На ноутбуке, к которому будет подключаться мультиметр, есть только порты USB. В продаже есть переходники USB-RS232, но у меня остался самодельный переходник, собранный на макетке в процессе ремонта домашнего сервера.

В нём используется готовый модуль USB-UART на базе FT232RL и микросхема MAX232 для конвертации уровней сигнала для RS232.

Управление через RS232

Согласно документации есть три категории команд:

  • KEY commands (эмулируется нажатие физических кнопок мультиметра)

  • SET commands (переключение режимов измерений, диапазонов, математические операции и т.д.)

  • QUERY commands (получение текущего статуса мультиметра, значений основного и дополнительного индикаторов, версии прошивки и программный сброс)

На ноутбуке установлен Debian Linux и далее все примеры будут ориентированы на Linux. Пробую выполнить программный сброс мультиметра командой "RST" а затем получить информацию о прошивке мультиметра:

$ screen /dev/ttyUSB0 9600
RST
=>
*>
RV
v1.39,6

Супер! Мультиметр отвечает на команды и на индикаторе загорелось "Remote". Далее подключил на вход генератор сигналов и подал синусоидальный сигнал 1kHz, 1Vrms. Теперь нужно переключить мультиметр в режим измерения ACV и вывести частоту сигнала на второй индикатор

S112S
=>
S271S
=>
R1
+0.98788E+0
=>
R2
+1000.00E+0
=>

Команды из документации отработали без проблем. Это означает что как минимум в моём образце никаких "технических" ограничений нет. Думаю их нет и во всех остальных.

Поддержка в Sigrok

Теперь можно было написать несложный скрипт, который будет считывать данные с мультиметра и записывать в файл. Или же написать скетч для Arduino который будет писать их на SD карту.

В процессе обдумывания каким путём дальше пойти я вспомнил про Sigrok. Sigrok предоставляет библиотеки libsigrok (отвечает за поддержку оборудования и форматов ввода/вывода) и libsigrokdecode (отвечает за декодирование протоколов), а также различные фронтенды (PulseView, SmuView, sigrok-meter и sigrok-cli).

Если добавить поддержку U3402A в libsigrok, то станут доступны все "плюшки", которые предоставляют его фронтенды.

Важная ремарка! Я не знаком с кодовой базой libsigrok и не уверен что всё проделанное является верным. Но тем не менее решил описать свой путь, т.к. наступил на несколько граблей и кому-то это может сэкономить пару часов времени.

Начал с чтения файла HACKING. Из него узнал рекомендуемый способ добавить новый драйвер:

$ git clone git://sigrok.org/sigrok-util
$ cd sigrok-util/source
$ ./new-driver "Agilent U3402A"

В итоге будет создан файл 0001-agilent-u3402a-Initial-driver-skeleton.patch который нужно импортировать в репозитарий libsigrok.

$ cd ../libsigrok/
$ git am ../sigrok-util/source/0001-agilent-u3402a-Initial-driver-skeleton.patch

Этот патч затрагивает следующие файлы:

  • Makefile.am

  • configure.ac

  • src/hardware/agilent-u3402a/api.c

  • src/hardware/agilent-u3402a/protocol.c

  • src/hardware/agilent-u3402a/protocol.h

В трёх последних файлах уже объявлен минимальный набор функций и выполнена регистрация нового драйвера.

Компиляция проекта не вызывает сложностей

$ ./autogen.sh
$ ./configure
$ make

Я не ставил все библиотеки, которые перечислены в выводе configure скрипта, а ограничился теми которые нужны для сборки моего драйвера:

  • libglib2.0-dev

  • libserialport-dev

  • libzip-dev

  • zlib1g-dev

В случае успешной компиляции новая библиотека будет находиться в .libs/libsigrok.so.4.0.0. Чтобы фронтенды Sigrok загружали именно этот вариант библиотеки нужно настроить переменную LD_LIBRARY_PATH или LD_PRELOAD. Я делал через LD_LIBRARY_PATH:

$ sigrok-cli -L | grep agilent
  agilent-dmm          Agilent U12xx series DMMs

$ export LD_LIBRARY_PATH=$PWD/.libs

$ sigrok-cli -L | grep agilent
  agilent-dmm          Agilent U12xx series DMMs
  agilent-u3402a       Agilent U3402A

До экспорта переменной LD_LIBRARY_PATH использовалась библиотека libsigrok, которая установилась по зависимостям sigrok-cli, а после - скомпилированная локально, которая добавляет поддержку драйвера agilent-u3402a.

Теперь нужно научить новый драйвер находить поддерживаемый мультиметр. Код добавляется в функцию scan(), которая находится в файле src/hardware/agilent-u3402a/api.c. Я подсматривал в код других драйверов чтобы понять как инициализиовать последовательный порт, записать в него команду и, прочитав ответ, решить подключено ли нужное устройство.

Для этого используется команда "RV\r\n" (без кавычек), которая запрашивает информацию о версии прошивки и модель мультиметра. Ответ должен быть в формате "vX.XX,M" (без кавычек).

Вначале не мог понять почему у меня не выполняется функция scan() если я указываю какой порт использовать драйверу. Оказалось что нужно добавить в функцию config_list() список параметров, которые поддерживает драйвер. После этого драйвер смог правильно опознать устройство:

$ sigrok-cli -d agilent-u3402a:conn=/dev/ttyUSB0 --scan
The following devices were found:
agilent-u3402a - Agilent U3402A v1.39 with 1 channel: P1

В строке идентификации устройства видна версия прошивки и количество каналов.

Следующий шаг - получить значение, которое измерено мультиметром. Для этого буду использовать команду "R1\r\n", которая возвращает последнее показания с основного индикатора. Пример ответа команды "+0.98788E+0" (без кавычек).

Для этого нужно написать реализацию нескольких функций:

  • dev_acquisition_start() в файле src/hardware/agilent-u3402a/api.c

  • agilent_u3402a_receive_data() в файле src/hardware/agilent-u3402a/protocol.c

Функции dev_open(), dev_close() и dev_acquisition_stop() я заменил на std_serial_dev_open(), std_serial_dev_close() и std_serial_dev_acquisition_stop() из стандартной реализации.

Функцию dev_acquisition_start() я "срисовал" с src/hardware/appa-55ii/api.c. А вот над функцией agilent_u3402a_receive_data() пришлось немного повозиться. Сначала добавил пропуск строк, которые возвращает мультиметр после ввода команд (я не нашёл их описания в документации, так что их значение это моя догадка):

  • "=>" (успех)

  • "!>" (ошибка)

  • "*>" (ожидание)

Пока реализация чтения показаний очень наивная и не проверяет какой режим измерений выбран. В регистрации значений используется постоянное напряжение. Получение одного значения из мультиметра выглядит так:

$ sigrok-cli -d agilent-u3402a:conn=/dev/ttyUSB0 -C P1 --samples 1
P1: 3.3007 V

Мультиметр на основном индикаторе показывает "3.3007 V DC".

Положительный результат получен, но в коде слишком много подпорок. Как минимум нужно написать определение текущего режима измерения (команда "R0\r\n") и разрядности индикатора. Дальше если не пропадёт интерес можно прикрутить переключение режимов измерений и показания второго индикатора.

Выводы

  • Производители мультиметров могут умалчивать о существующей функциональности и предоставлять её только некоторым регионам.

  • В чипах современных мультиметров есть поддержка подключения к компьютеру, но это требует вмешательство в EEPROM и доработку схемы.

  • Sigrok проще изучать по существующей кодовой базе

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


  1. qbertych
    19.08.2024 13:09
    +2

    Спасибо, интересно, не знал про Sigrok. Есть еще Qcodes, у него немного другая аудитория, но очень много драйверов, в том числе похожие модели Agilent/Keysight.


    1. tataranovich Автор
      19.08.2024 13:09

      Спасибо за Qcodes, не слышал про него раньше.


  1. Imaginarium
    19.08.2024 13:09

    Отличная работа, спасибо!


  1. Slym99
    19.08.2024 13:09
    +13

    У вас в названии ошибка! Правильнее "Как подключить мультиметр за 50К руб. имеющий com порт искаропки к компьютеру китайским шнурком за 1$ для чайников"...
    Но согласен: Производитель моего M830B умалчивает о функциональности и не предоставляет её никаким регионам...


    1. tataranovich Автор
      19.08.2024 13:09

      Если задаться целью, то и DT-шку можно подключить к компьютеру, но стоимость адаптера превзойдет стоимость этого мультиметра :)


      1. alextrof94
        19.08.2024 13:09
        +1

        Да ладно уж. "Ардуинкой" считывать сигналы выводимые на ЖК и после простейших преобразований по тому же ком порту передавать в комп - недорого и несложно.


        1. Bagatur
          19.08.2024 13:09
          +2

          Так ардуиной можно и непосредственно замеры делать в иных случаях так-то...


        1. NutsUnderline
          19.08.2024 13:09

          я кстати помниться видел здесь на хабре именно такую статью


        1. esaulenka
          19.08.2024 13:09
          +2

          Вы почитайте для начала, что такое ЖК-экран. Там изрядно придётся попрыгать, чтобы обработать все эти хитрые сигналы.


          1. sim2q
            19.08.2024 13:09

            Там изрядно придётся попрыгать, чтобы обработать все эти хитрые сигналы.

            Да ну что вы в самом деле. Камера на индикатор и нейросетка :)


  1. Grey83
    19.08.2024 13:09
    +1

    Вот же давняя тема про этот DTM0660 (и его обновлённую версию - DM1106EN) и как можно модернизировать мультики на его основе:
    https://kazus.ru/forums/showthread.php?t=112135
    Там в шапке (в нижней её трети) и про RS232 ссылки найти можно.


    1. tataranovich Автор
      19.08.2024 13:09

      В шапке статьи я кидал ссылку на статью Керри Вонга в которой он описывал подключение мультиметра на DTM0660 к компьютеру. Но ваша ссылка содержит больше материала.


  1. salieff
    19.08.2024 13:09
    +1

    Прямо просится скриншот из PulseView, как вишенка на торт.


    1. tataranovich Автор
      19.08.2024 13:09

      Я хочу завести в SmuView, но пока руки не дошли пересобрать appimage.


  1. XplldWanderer
    19.08.2024 13:09

    Ну, на тот же аджилентовский 34401А или 3458А в мануале есть раздел с командами для удаленного управления.

    Так что тут есть зависимость ещё и от модели мультиметра.


    1. tataranovich Автор
      19.08.2024 13:09

      Вся соль в том что Agilent/Keysight документировали связь через RS232 только для Китая, Кореи и Японии. Мол RS232 был реализован не по их стандартам и скорее всего существующий софт не поддерживает этот мультиметр. Дешевле сказать что RS232 только для калибровки, чем писать софт и саппортить его потом.

      Я про это узнал случайно, хотя уже подумывал "патчить" свой ZT102 или городить что-то на INA226.

      Машинный перевод с китайского - это отдельная грустная история.


  1. frozzzen
    19.08.2024 13:09

    Куда катится этот мир? В лабораторном мультиметре нет возможности подключения к компьютеру, а в простом мультиметре "для электриков" есть таковой. UNI-T 61B+, например. С оптронной развязкой и USB интерфейсом.


    1. tataranovich Автор
      19.08.2024 13:09

      Всё там есть, просто спрятали. В моём комментарии выше есть детали.


  1. SuperTEHb
    19.08.2024 13:09
    +1

    Как же хорошо, что у меня измерительные приборы на работе сразу имеют USB и представляются компьютеру последовательным портом. А ещё SCPI поддерживают (простой человекочитаемый протокол). Как и нагрузки, блоки питания, осциллографы... Теперь запускаю программу и иду пить чай заниматься нужными делами, а работа сама себя работает. Прикол в том, что один прибор запросто меняется на любой другой, поддерживающий такой формат команд. Кстати, а ваш прибор, случайно, не поддерживает заодно SCPI? В инструкции, конечно же, об этом не сказано.

    Даёшь автоматические измерения! Ручной труд на плечи машин!


    1. tataranovich Автор
      19.08.2024 13:09

      Кстати, а ваш прибор, случайно, не поддерживает заодно SCPI?

      Это можно выяснить только поковырявшись в его прошивке. Но скорее всего нет.


      1. SuperTEHb
        19.08.2024 13:09

        Достаточно написать ему VAL1?/r и посмотреть на ответ. Если скажет значение с экрана, то поддерживает. Ну а вдруг? Впрочем, сути дела это не поменяет, раз уже всё работает.


        1. tataranovich Автор
          19.08.2024 13:09
          +1

          Проверил на всякий случай - на все команды отвечает "!>".