AVR-USB-MEGA16: новая жизнь старого «Милихрома» Печать
Добавил(а) Сергей Кухтецкий   

В статье описано подключение хроматографа "Милихром" к компьютеру через USB с помощью макетной платы AVR-USB-MEGA16. Разработка произведена в лаборатории проблем материаловедения Института химии и химической технологии Сибирского отделения РАН, г. Красноярск, http://www.icct.ru, автор Кухтецкий Сергей.

[Что такое «Милихром»]

«Милихром» – это марка отечественного жидкостного хроматографа. Хроматограф предназначен для анализа химического состава смесей веществ. Метод, реализованный в «Милихроме», называется ВЭЖХ (ВысокоЭффективная Жидкостная Хроматография) или HPLC (High Performance Liquid Chromatography). Принцип работы такого хроматографа основан на том, что скорость сорбции и десорбции обычно не одинакова для различных веществ. Это дает возможность разделить анализируемую смесь на отдельные компоненты, затем измерить количество каждого из них и, таким образом, определить химический состав исходной смеси.

На практике процесс жидкостной хроматографии выглядит так. Применяется хроматографическая колонка - стеклянная или металлическая трубочка, заполненная сорбентом. В моем хроматографе я применял колонку типа КАХ-2. Сорбент образует так называемую «неподвижную фазу». В качестве сорбента для жидкостной хроматографии обычно используется силикагель, поверхность которого химически модифицирована. Через колонку прокачивается жидкость, которая называется «подвижной фазой» или «элюентом». Состав элюента зависит от типа сорбента и решаемой аналитической задачи. В определенный момент времени в поток элюента перед входом в колонку вводится небольшое количество анализируемого вещества (проба). В микроколоночных приборах типа «Милихром» объем пробы составляет несколько микролитров. Проба с потоком элюента поступает в колонку, где и начинается процесс ее разделения на отдельные химические компоненты. Молекулы пробы сорбируются на поверхности силикагеля и затем обратно десорбируются в свежие зоны элюента, непрерывно поступающего в колонку. Акты сорбции-десорбции происходят много раз, на протяжении всей колонки. Скорость этого процесса (сорбции-десорбции) зависит от поверхности сорбента, состава элюенты и главное – от химического состава веществ, входящих в пробу. Поэтому, в среднем, различные химические компоненты продвигаются по колонке с различными скоростями. В результате если сорбент, элюент и режим работы колонки подобраны правильно, то на выходе колонки мы получим слои жидкости, каждый из которых содержит только один компонент пробы. Т.е. вещества, входившие в пробу, мы пространственно разделили. Дальше поток поступает в детектор. Детектор - по сути дела датчик, сигнал которого пропорционален концентрации химических компонентов, содержащихся в жидкости. Поскольку на выходе из колонки компоненты уже разделены, то по мере их прохождения сквозь детектор, последний выдает последовательность сигналов (пиков), площадь которых пропорциональна содержанию компонента в пробе.

В приборах типа «Милихром» используются ультрафиолетовые детекторы. Принцип работы таких детекторов основан на том, что многие растворы хорошо поглощают свет в ультрафиолетовой области спектра. Длину волны, на которой работает детектор, можно изменять в зависимости от задачи. В приборах серии «Милихром» переключение длины волны происходит достаточно быстро по сравнению со скоростью движения элюента. Это дает возможность прописывать хроматограммы сразу на нескольких длинах волн (многоволновой режим работы). Более того, можно остановить поток (например, в момент максимума пика) и прописать спектр поглощения данного компонента во всем диапазоне длин волн детектора 190-360 нм с шагом 2 нм. Это дает дополнительные возможности при идентификации неизвестных компонентов пробы.

Современный жидкостный хроматограф представляет собой мощный аналитический прибор, способный анализировать широчайший класс химических соединений в сложнейших смесях. Общий недостаток жидкостных хроматографов (впрочем, как и многого другого оборудования для научных исследований) – это их цена. Базовая стоимость современных хроматографов – порядка 1 млн. руб. Стоимость одной колонки для обычных рутинных анализов составляет от 10 до 20 тыс. руб. Поэтому в наше сложное для науки время этот метод доступен далеко не каждой исследовательской лаборатории.

[Реанимация «Милихрома» №268, 1985 года рождения]

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

К сожалению, в нашем институте не было работающего жидкостного хроматографа. Делать анализы на стороне – сильно накладно, т.к. нужны были достаточно большие серии. Лишнего миллиона для приобретения хроматографа, к сожалению, тоже не наблюдалось.

Я уже начал прорабатывать альтернативные варианты решения этой задачи, но помог счастливый случай. Идя как-то по коридору, я увидел на полу кучу старого хлама, предназначенного для списания и выкидывания на свалку. Среди этого оборудования оказались два набора «железа», которые когда-то были хроматографами «Милихром» самых первых выпусков. Оказывается, они с незапамятных времен валялись в «закромах» соседней лаборатории, их давно никто не использовал и не собирался использовать. Теперь соседи решили их списать и выкинуть. Естественно, дать этому добру безвозвратно погибнуть я не мог, и оно перекочевало в нашу лабораторию. Наборы «железа» оказались неполными. У одного комплекта отсутствовала кювета и одна электронная плата в блоке управления, у другого - был треснут корпус насоса. Тем не менее, удалось отыскать полный комплект документации и какие-то фрагменты ЗИПа. Это и помогло мне собрать из этого хлама один, но вполне работоспособный прибор. Фотография его представлена на Рис.1.
chromo01-common-view.jpg

[Подключение к компьютеру]

Первые выпуски хроматографов серии «Милихром» регистрировали сигналы при помощи самописцев. Мой хроматограф как раз был из их числа. Разъем для подключения самописца находится на задней стенке прибора. Простейший вариант компьютеризации – оцифровать сигнал прямо с этого разъема. С аппаратной точки зрения – несложная задача. Аналоговый сигнал с уровнем до 100 мВ, частота оцифровки – до 10 Гц вполне хватит с запасом, общая длительность сигнала - от единиц до десятков минут. С учетом того, что вывод был на бумажную ленту, 8-10-разрядного АЦП было бы достаточно. Однако, более внимательное изучение прибора и документации подсказало другое решение. Разработчики хроматографа уже предусмотрели цифровой выход. На задней стенке прибора расположен соответствующий разъем «Регистратор» (Рис.2). 
chromo02-connector.jpg

На ножки этого разъема выведены 15 двоичных разрядов сигнала, знак сигнала, признак переполнения, два строба (один – готовность данных, второй – конец развертки детектора по спектру), +5 В и земля. Уровни сигналов – TTL.
Макетная плата AVR-USB-MEGA16 здесь может быть использована следующим образом. 15 двоичных разрядов, знак и признак переполнения подаются на свободные ножки портов ATMega16. Поскольку аппаратное прерывание INT0 занято USB-интерфейсом, то строб готовности данных подается на порт INT1, а строб конца цикла развертки по длинам волн детектора – на INT2. Таблица соответствия ножек разъема «Регистратор» и контактов платы AVR-USB-MEGA16 приведена ниже (все сигнальные контакты платы работают как TTL-входы).

ножки разъема
«Регистратор»
наименование
сигналов 
контакты
AVR-USB-MEGA16
ножки ATmega16
(все порты - входы)
 1
 20  P1  PA0
 2  21  P2  PA1
 3  22  P3  PA2
 4
 23  P4  PA3
 5  24  P5  PA4
 6  25  P6  PA5
 7  26  P7  PA6
 8  27  P8  PA7
 9  28  P9  PB1
 10  29  P11  PB3
 11  210  P12  PB4
 12  211  P13  PC0
 13  212  P14  PC1
 14  213  P15  PC6
 15  214  P16  PC7
 16 знак  P17  PD0
 17 переполнение  P18  PD1
 29 конец цикла  P10  PB2/INT2
 30
конец
преобразования
 P19  PD3/INT1
 32
земля
 -  GND - выв. 6, 18,
28, 39

Таким образом, для решения данной задачи (подключение персонального компьютера в качестве регистратора) никаких дополнительных элементов не требуется. Только – подсоединение ответной части разъема «Регистратор» к готовой макетной плате AVR-USB-MEGA16. Результат представлен на Рис.3.
chromo03-USB.jpg

Отметим, что плата и разъем вполне сопоставимы по размерам, так что потом можно будет плату прикрутить непосредственно к корпусу разъема и убрать длинные отладочные провода. Там как раз есть пара подходящих винтов. Теперь займемся программным обеспечением.

[Firmware (прошивка микроконтроллера Atmega16)]

Для разработки firmware использовался пакет AVR-USB (сейчас он называется по-новому V-USB) компании Objective Development [7]. За основу данной разработки выбран из пакета пример Custom Class. Средство разработки – WinAVR [7].

Само firmware очень простое и работает следующим образом. Блок управления хроматографом по окончанию работы своего АЦП выставляет данные (оцифрованный сигнал детектора) на шину и выдает строб «Конец преобразования». Этот строб инициирует аппаратное прерывание INT1 микроконтроллера Atmega16, установленного на плате AVR-USB-MEGA16. Обработка этого прерывания заключается в «защелкивании» выставленных на шине данных в специальном статическом буфере, через который они могут быть переданы хосту через USB. Здесь же устанавливается и флаг готовности данных, который тоже может быть считан через USB. Дополнительно включается светодиод, установленный на плате AVR-USB-MEGA16. Ну очень оживляет работу…

Задействовано также и третье аппаратное прерывание (INT2) для установки флага конца цикла развертки детектора. Этот флаг тоже может быть считан через USB. Он используется при прописывании спектра поглощения пробы и в многоволновом режиме работы хроматографа.

В функции usbFunctionSetup (где реализован основной функционал firmware) обрабатываются три ситуации:
1. RQ_DATA_READY - чтение флага готовности данных;
2. RQ_DATA_READ - чтение данных детектора (15 двоичных разрядов, знак и флаг переполнения);
3. RQ_END_FLAG_READ - чтение флага конца цикла работы детектора (по спектру).

Когда хост считывает данные (RQ_DATA_READ), сбрасывается флаг готовности данных и гасится светодиод на плате.

Весь проект с подробными комментариями можно скачать по ссылке [8]. Компиляция и сборка проекта производится командой make hex из командной строки. Прошивка получится в файле main.hex.

[ПО хоста, работающее с хроматографом]

Средство разработки – Visual Studio 2008 Express Edition, свободно доступное для закачки на сайте Microsoft. Язык программирования – C#. Для работы с USB используется библиотека libusb-win32, как скачать и установить см. [7]. Для построения графиков используется бесплатная библиотека zedGraph [9]. Весь проект ПО хоста можно скачать по ссылке [8].

Для работы с библиотекой libusb-win32 и портами USB был разработан класс-обертка DevHPLC (файл DevHPLC.cs проекта) в котором инкапсулированы структуры данных и методы библиотеки libusb-win32. Работа с платой AVR_USB_MEGA16 реализована через три свойства: dataReady (готовность данных), байтовый массив data (сами данные детектора) и endFlag (конец развертки по спектру). Необходимо отметить, что в классе DevHPLC реализован ограниченный набор методов и свойств (только для работы с хроматографом). Для других задач был разработан более универсальный класс-обертка ATMega16 и соответствующее firmware. Они будут описаны в следующих проектах. В силу специфичности данного проекта, я не буду детально рассматривать конкретную реализацию программного обеспечения хоста. Все необходимые комментарии приведены в тексте программы. Естественно, необходимо инсталлировать библиотеки libusb-win32 и zedGraph, и в свойствах проекта (меню «Project/ Имя проекта Properties») включить флажок «Allow Unsafe Code» на закладке «Build». Последнее связано с тем, что в проекте используется небезопасный код (библиотека libusb-win32) и класс DevHPLC имеет модификатор unsafe.

Коротко об алгоритме работы программы. По событию от таймера timer1 (см. Host\HPLC\FormMain.cs) каждые 0.1 сек проверяется флаг готовности данных на плате AVR-USB-MEGA16 (свойство dataReady). Поскольку минимальное время оцифровки сигнала детектора хроматографа – 0.15 сек, такой частоты опроса будет достаточно. Итак, если флаг готовности установлен, то оцифрованные данные детектора, которые к этому времени уже «защелкнуты» по прерыванию INT1, считываются с платы (свойство data). Далее они преобразуются, сохраняются в массиве и отображаются на графике (по вертикали). По горизонтальной оси откладывается время, прошедшее с начала записи (оно совпадает со временем ввода пробы, причем паузы тоже учитываются). Аналогично производится запись спектра поглощения вещества в детекторе в режиме снятия спектра.

В обоих режимах предусмотрены паузы в процессе регистрации сигналов, возможность сохранения спектров и хроматограмм на диск в текстовом формате, их копирование в буфер обмена - например, для дальнейшей работы в Excel или другом приложении. Сама библиотека zedGraph также предоставляет возможности экспорта графиков (в виде картинок), печати и копирования в буфер обмена.

[Пример работы «Милихрома» в новом качестве]

Для примера я выбрал простейшую задачу – разделение смеси двух карбоновых кислот. Под рукой оказалась щавелевая кислота и уксусная. Сначала введем водные растворы этих кислот по очереди в детектор и пропишем их спектры поглощения (в ячейке сравнения – вода). С помощью этого мы узнаем, на какой длине волны УФ-дектора нам нужно работать. Можно, конечно, воспользоваться справочными данными, но так интереснее. Для записи спектра в инструментальной панели приложения (HPLC) нажмем кнопку «Снять спектр» (Рис.4).
chromo04-dialog.jpg

Появится форма для снятия спектра. Включим полную развертку спектра на блоке управления «Милихрома». Для этого нажмем все кнопки длин волн и кнопку «Спектр» Рис.5). В этом режиме детектор циклически проходит весь спектр (от 190 до 360 нм) с шагом 2 нм.
chromo05-spectrum-unit.jpg

Ниже приведены полученные таким образом спектры уксусной кислоты (Рис.6) и щавелевой (Рис.7). По горизонтали – длина волны в нанометрах.
chromo06-spect01.jpg

chromo07-spect02.jpg 

Мы видим, что спектры поглощения этих кислот очень похожи и имеют выраженный максимум в области 200 нм. Значит там и будем работать. Для того, чтобы не возникло ощущения, что ультрафиолетовые спектры всех жидкостей одинаковы, ниже приведен спектр поглощения этанола.
chromo08-spect03.jpg

Итак, устанавливаем длину волны детектора равную 200 нм. Здесь обе кислоты поглощают хорошо. Закроем диалог записи спектра и приготовим модельную смесь, содержащую обе кислоты примерно в равной пропорции. Особая точность нам здесь не нужна. В качестве элюента возьмем дистиллированную воду (стеклянный дистиллятор), обезгаженную 30 минутным кипячением (pH почти 7). Промоем колонку элюентом. Колонка очень старая, поэтому пришлось долго-долго гонять через нее воду (элюент), пока не перестали в детекторе появляться пузырьки, и ноль стал более-менее стабильным. Вводим пробу, содержащую две кислоты и пишем хроматограмму. На хроматограмме, как и следовало ожидать, мы видим два пика (Рис.9). По горизонтали – время в минутах.
chromo09-spect04.jpg

Первый пик (1.27 мин) соответствует щавелевой кислоте, второй (3.11 мин) – уксусной. Это легко проверить, прописав хроматограммы каждой кислоты по отдельности. Условия: колонка КАХ-2, подача элюента – 100 мкл/мин, объем пробы – 8 мкл.

Качество пиков, конечно же, оставляет желать лучшего. Есть небольшой «хвостик» у щавелевой кислоты. Есть заметная асимметрия и какое-то переднее «плечико» у уксусной. Оно (плечико) повторяется и для чистой уксусной кислоты. Но все эти вопросы - это вопросы хроматографических методик. Их обсуждение выходит за рамки данной статьи. А с другой стороны, не так уж и плох этот результат для моих первых опытов в жидкостной хроматографии и для колонки, которая почти четверть века (!) провалялась в ЗИПе. По крайней мере, пики хорошо разделены, и площади их вполне измеримы. Теперь остается дополнить программное обеспечение модулем подсчета площадей пиков, заказать чистые реактивы (нужный для задачи набор органических кислот), подобрать оптимальный элюент, «помыть руки» и – осваивать жидкостную хроматографию, решая задачу, о которой шла речь в начале статьи. Полагаю, что оживший и обновленный «Милихром» вполне с ней справится.

[Выводы и обсуждение]

Итак, в этой статье я продемонстрировал один из простейших вариантов морального обновления старых приборов – замена старого модуля регистрации (самописец) на персональный компьютер. Модернизация дает два значительных преимущества:

1. Экспериментатор избавлен от стрессов, связанных с обслуживанием самописцев - которые могут заклинить, или перестать писать за счет высыхания чернил, или появления воздушного пузырька в капилляре пера. Причем, обычно это происходит в самый неподходящий момент - чтобы испортить весь анализ.
2. Не нужно сканировать и оцифровывать бумажные носители для обработки зарегистрированных на самописцах кривых (например, для подсчета площадей пиков, в случае хроматограмм). Совсем в старые времена, экспериментаторы вырезали пики ножницами и взвешивали их (т.к. вес вырезанных из бумаги пиков, естественно, пропорционален их площади).

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

Действительно, большинство нововведений, которые появились в новых приборах (кроме, конечно, компьютерной регистрации и обработки), остались бы для наших задач невостребованными. Рассмотрим этот вывод на примере хроматографа «Милихром А-02», который поставляется фирмой ЭКОНОВА (http://www.econova.ru) в настоящее время.

1. УФ детектор. Диапазон длин волн не изменился, немного меньше стал объем кюветы (было 1.6 мкл, стало – 1.2 мкл), скорость чуть выше. Наверное, повысилась надежность и уменьшились шумы. Это дает для наших задач что-нибудь принципиально новое? Похоже, что нет.
2. Колонка. Немного увеличена длина. Эффективность – 6000 теоретических тарелок. На старом хроматографе – 3000 тарелок. Для наших задач – и этого более, чем достаточно.
3. Термостат. Чего нет в старом, того нет. Но, опять-таки все зависит от задач. Для наших систем (водные растворы карбоновых кислот) термостат не нужен.
4. Насос. Повышено давление до 70 атм. (было – 50). Это хорошо, но не принципиально. Насос двухшприцевой, градиентный. Это тоже хорошо, но для наших простых задач, скорее всего, не пригодится. Судя по литературе, наши кислоты хорошо разделятся и так. В принципе, с некоторыми мучениями, градиенты можно создавать и на одном шприце.
5. Автодозатор. В старом был ручной ввод пробы. Конечно, если речь идет о больших (промышленных) объемах работы, эти нововведения просто необходимы. Но наша нагрузка – максимум несколько анализов в день.

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

Просто жаль, что разработчикам так не удалось создать жидкостный хроматограф на микроколонках для рутинных, не очень сложных анализов, такой же доступный по цене, как хороший измеритель pH, или аналитические весы. Хотя, если компьютер, софт и колонки поставлять отдельно, упростить и сделать модульным детектор (УФ, электрохимический и т.д.), вернуться к ручному дозатору и простому одношприцевому насосу, наверное, это можно было бы сделать.

В заключение хотелось бы обратить внимание еще на один важный момент. При любой автоматизации и модернизации оборудования главное – вовремя остановиться. В нашем случае (хроматограф «Милихром») мы могли бы продвинуться дальше. Например, - сделать компьютерное управление шприцевым насосом. Задача несложная – просто управление шаговым двигателем и обработка сигнала с датчика давления. Делается на этой же макетной плате AVR-USB-MEGA16. Силовую часть - тоже можно обновить. Но даст ли такая модернизация новое качество прибору? Для наших задач - скорее всего, нет. Детектор, тем более, не имеет смысла модифицировать. Работать мы будем, как правило, в одноволновом режиме. А больше там (в «Милихроме») и автоматизировать-то нечего… На этом уровне компьютеризации старого доброго «Милихрома» мы и остановимся.

@ S.V.Kukhtetskiy, 2009 Кухтецкий Сергей Владимирович, лаборатория проблем материаловедения, Институт химии и химической технологии СО РАН, Красноярск, ku@icct.ru

[Ссылки]

1. Макетные платы с интерфейсом USB.
2. AVR-USB-MEGA16: быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16. Класс C# (для Visual Studio Express Edition 2008) и соответствующая прошивка, позволяющие быстро сделать USB HID устройство и написать для него приложение для компьютера. Вы управляете микроконтроллером прямо из кода на C# (дергаете его ножками, читаете регистры и т. п.).
3. Библиотека AVR-USB, примеры, документация на русском языке.
4. Как работать с платой AVR-USB-MEGA16 из Visual Studio (версия 2003). На примере описано управление светодиодом на макетной плате из кода на C++.
5. V-USB Projects site:obdev.at - проекты, которые основаны на V-USB. Все эти проекты можно реализовать на макетной плате AVR-USB-MEGA16.
6. Простой пример управления портами P1..P22 платы AVR-USB-MEGA16 (portctrl) - как управлять портами микроконтроллера через USB.
7. Разработка устройства USB - как начать работу с библиотеками AVR USB и libusb.
8. Исходный код firmware и ПО хоста.
9. zedGraph site:sourceforge.net.