Глава 4. Автоматизация спектроскопического эксперимента

Взаимодействие с контроллером Arduino


Управление монохроматором МДР-23 осуществляет контроллер Arduino Uno. Для контроллера была написана программа, работающая с шаговым двигателем, поворачивающим дифракционную решётку. Команды для программы передаются через виртуальный «последовательный порт», связанный с платой Arduino.

Arduino подключена как USB-устройство и имеет собственный драйвер, реализующий интерфейс последовательного порта

Программирование снискавшего в настоящее время популярность контроллера Arduino не рассматривается в данном учебном пособии, но мы советуем вам обратить внимание на некоторые известные книги из обширной литературы по этой теме:

Петин, В. А. Arduino и Raspberry Pi в проектах Internet of Тhings, Санкт-Петербург:БХВ-Петербург, 2016. –320 с.
Иго, Т. Arduino, датчики и сети для связи устройств, Санкт-Петербург:БХВ-Петербург, 2015. – 544 с.
Монк, С. Программируем Arduino. Профессиональная работа со скетчами, Санкт-Петербург:Питер, 2017. – 252 с.

Программа, разработанная для Arduino и загруженная в микроконтроллер, умеет распознавать и выполнять среди прочих следующие команды:

init L – инициализация установки, L – текущая длина волны монохроматора, которую следует указать (вещественное число, в нанометрах);

repl N – установленная оператором дифракционная решётка, N – наименование решётки (целое число);

wave L – сместить дифракционную решётку на относительную величину L (вещественное число, в нанометрах)

goto L – установить дифракционную решётку на указанную длину волны L (вещественное число, в нанометрах)

show – без параметров, выдаёт в порт текущее значение длины волны (в нанометрах) и наименование установленной дифракционной решётки.


Например, команда wave 20 приведёт к запуску шагового двигателя, который сместит (повернёт) дифракционную решётку на 20 нм в сторону увеличения длин волн. Команда wave –20 сделает то же, но в сторону их уменьшения. Команда goto 555.5 установит решётку в положение, соответствующее длине волны 555.5 нм. После выполнения каждой команды в последовательный порт возвращается символ «.» (точка). Если команда завершилась с ошибкой или была прервана, возвращаются символы «X.».

Таким образом, задачей управляющей программы на Python является только передача управляющих команд через виртуальный «последовательный порт» и приём результатов их выполнения. Рассмотрим вариант взаимодействия программы на Python и платы Arduino, который, очевидно, можно использовать не только для выбранной нами экспериментальной установки, но и для многих других вариантов автоматизации.

Инициализация обмена командами через последовательный порт реализована в пункте меню 1 «Инициализация установки».


Работа с последовательным портом осуществляется с использованием модуля pyserial. Установка пакета:

pip install pyserial

Параметры последовательного порта устанавливаются в строке 10. Поскольку программа в Arduino запрограммирована на скорость обмена 19200 бод, та же скорость выбрана и здесь. Задержка при инициализации порта в 2 секунды (строка 11) выбрана опытным путём при запуске программы на различных компьютерах. Не рекомендуется делать её меньше 1 с. При инициализации программа Arduino выводит в порт начальное сообщение, которое читается в строке 12. Информация через последовательный порт передаётся в виде байтов, поэтому для её преобразования в строку символов используем метод decode().

Далее программа запрашивает ввод двух параметров, необходимых для инициализации системы, и пишет в последовательный порт команды repl и init (строки 20 и 28). В этом случае используется обратное преобзование из строки в байты и устанавливается необходимая временная задержка после каждой команды. Заметим, что мы не стали программировать последовательный порт на автоматическое добавление символа «возврата каретки» и «перевода строки» – вместо этого к каждой выводимой строке добавляем символ «\n» разрыва строки. После ввода каждой команды переключаемся в режим чтения порта и ожидаем окончания выполнения команды (прихода со стороны Arduino символа «.»). Если все команды выполнены без ошибок, переменная meas_flag принимает значение rTrue, и становится доступным режим проведения измерений (пункт меню 4).

Для отладки и настройки работы программы нижнего уровня (записанной в контроллер Arduino) реализован пункт меню «8. Консоль команд управления». Из этого меню вызывается функция, основное назначение которой – служить посредником при передаче команд от пользователя (режим «командной строки») к микроконтроллеру через интерфейс последовательного порта. Текст функции приведён ниже – он намного проще предыдущего и не нуждается в дополнительных комментариях. Выход из цикла – команда quit.


Конечно, созданный интерфейс для виртуального последовательного порта можно было заменить любой из множества существующих программ-терминалов, работающих с последовательным портом. Но зачем, если реализация такого терминала занимает не более 11 строк кода на Python?


Если вы заметили неточность, ошибку или хотите поделиться своими мыслями по поводу статьи - мы рады обратной связи. Давайте вместе сделаем ресурс лучше!

От кого:
Ваш комментарий будет виден всем пользователям