Получив нужный опыт и знания, приступил к разработке электроники и программного обеспечения для микроскопа.
На видео — демонстрация того, как реализовано сканирование и захват изображения. Плата пока ни к чему не подключена, но данные реальные (по градиентам серого можно угадать моменты, когда я подключаю вход к выходам сканирования по X и Y).
Всю систему разделил на следующие независимые модули:
- Захват изображения и интерфейс с ПК.
- Блок питания для точных элементов, и блок питания для силовых элементов (реле, клапана и пр.)
- Управление магнитными линзами, статическое. Конденсор, фокусировка, смещение луча вначале, стигматор — всё это задаётся независимо от сканирования.
- Управление отклонением луча. Непосредственно отвечает за перемещение луча по образцу. Увеличение задаётся именно здесь.
- Управление вакуумной системой
- Управление высоким напряжением и накалом катода
- Источник высокого напряжения -1кВ для ФЭУ в детекторе вторичных электронов (SED)
- Источник высокого напряжения +12кВ для коллектора SED (без него детектор будет работать в режиме регистрации упругоотражённых электронов — BSE)
Оговорюсь, что описываемые здесь решения не претендуют на звание самых лучших и оптимальных. На данном этапе самым важным является достичь результата с наименьшими затратами времен. Поэтому я буду очень рад вашим конструктивным предложениям в комментариях о том, как сделать что-то лучше.
I. Захват изображения
Думаю, что это самая «вкусная» часть всего проекта. То, с чем человек будет иметь дело при работе с микроскопом: видеть изображение, настраивать параметры — то, для чего раньше служила панель управления.
Аппаратная часть
Основа — Arduino Due, имеющая два цифро-аналоговых преобразователя (ЦАП), которые как раз и будут задействованы для отклонения луча по осям X и Y, и несколько аналогово-цифровых преобразователей (АЦП) для оцифровки получаемого с датчиков сигнала. Смысл в том, чтобы действия по установке луча в нужную точку и считывания сигнала выполнялись синхронно.
Вообще, есть два различных варианта, как сделать сканирование.
- Два цикла по X и Y, внутри установка луча в нужную точку путём вывода на аналоговый выход через ЦАП нужных значений, и оцифровка значения с датчика.
- Управляемые пилообразные генераторы с синхроимпульсами, а Arduino непрерывно оцифровывает сигнал, разбивая его по синхромпульсам.
Ввиду большей универсальности я реализовал первый вариант. Тогда, при желании есть возможность «светить» лучом в нужную точку, и в перспективе даже можно управлять фокусировкой, чтобы обеспечить динамический фокус по изображению. Пишите в комментариях, если считаете, что второй вариант лучше. Непрерывная оцифровка сигнала в этом микроконтроллере (МК) будет заметно быстрее, возможно даже удастся достичь частоты 1МГц.
Так выглядит сигнал отклонения по строкам, генерируемый ЦАП платы. То есть читаем слева-направо, затем следующую строку справа-налево и т.д., сами понимаете для чего.
С компьютером МК связывается через отдельный USB-интерфейс.
Программная часть
Прошивка МК
Прошивка МК
Прошивка самого МК реализована стандартными средствами с помощью Arduino IDE, но используя прямое обращение через порты вместо функция библиотеки Arduino, что даёт значительный прирост скорости сканирования. Эта тема уже достаточно детально описана, но суть очень простая: Arduino функции универсальны и поэтому вынуждены делать то, чего делать не нужно. Например, при чтении значения с одного и того же входа десятки тысяч раз в секунду совсем не нужно каждый раз устанавливать номер читаемого входа, достаточно это сделать перед циклом.
Протокол обмена сообщениями
Для быстрого обмена данными с ПК разработал простенький бинарный протокол обмена сообщениями переменной длины. Каждое сообщение содержит обязательный заголовок
typedef struct { uint32_t magic; uint16_t type; uint16_t len; } MSG_HEADER;
и следующую за ним полезную нагрузку.
Например, отсканированную строку изображения.
typedef struct { uint16_t lineNumber; uint8_t pixels[MAX_SCAN_WIDTH]; } MSG_SCANLINE;
Мне уже посоветовали использовать режим USB Bulk Transfer вместо симуляции последовательного порта, но пока ещё я не освоил этот метод работы с Arduino Due.
Клиентская часть
Здесь не всё так тривиально. Клиентскую часть я сделал в виде сервера на Node.JS + React.JS так, чтобы микроскопом можно было пользоваться не только локально. Модуль serialport обеспечивает неплохое быстродействие, а вывод изображения реализован через элемент Canvas.
Наглядная демонстрация работы всего этого вынесена в начало статьи.
II. Блок питания
Отдельно останавливаюсь на том, что для работы микроскопа нужен источник питания, который не просто имеет большой запас по мощности (из-за возможных импульсных нагрузок при управлении магнитными линзами), но и обеспечивает низкий уровень пульсаций выходных напряжений под нагрузкой. Простой ATX блок питания по линии +12В не смог обеспечить достойное качество, поэтому был сконструирован линейный блок питания на основе трансформатора от 1кВА ИБП, вторичные (бывшие первичные) обмотки которого были разъединены для получения независимого переменного напряжения около 15В.
От конструируемого блока требуется получить биполярное питание +12 и -12, и биполярное же +5 и -5 вольт. Схемотехника достаточно простая: два выпрямителя, буферные конденсаторы ёмкостью 33000 мкФ, LM317 на каждый 12 вольтный канал с транзистором Дарлингтона TIP127, и парочка L8705 для 5 вольтного канала.
Двусторонняя печатная плата, метод ЛУТ:
После напайки компонентов плата выглядит так:
Часть деталей была повторно использована из вышедших из строя компьютерных блоков питания ATX, включая провода. А в качестве корпуса использован родной корпус этого же ИБП.
III. Управление высоким напряжением и накалом катода
Про него я уже частично рассказывал в прошлой статье, но там оставалось главное — научится всем этим управлять и сделать всё качественно, т.к. всё-таки 30кВ при большом токе — не игрушка.
Основа модуля управления высоким напряжением — Arduino Nano, подключённое своими выходами на:
— ЦАП, задающий опорное напряжение для высоковольтного блока
— драйвер мотора, перемещающего ползунок на трансформаторе накала катода
— драйвер мотора, регулирующего (через длинный диэлектрический стержен) переменный резистор, который задаёт смещение напряжения катода относительно цилиндра Венельта
— управления реле включения накала катода используя ту схему, про которую я рассказывал в прошлой статье
Также я сделал измерение тока накала, однако не до конца потестировал эту схему и оказалось, что чувствительность слишком низкая, надо будет переделать потом.
Со снятой крышкой устройство выглядит вот так:
Все эти провода аккуратно убираются в железный корпус от бывшего телевизионного ресивера (или чего-то подобного), который хорошо экранирует возможные помехи от «аквариума». По-крайней мере, после того как всё это было размещено в корпусе и сделано «как следует», Arduino Nano перестало виснуть вскоре после включения высокого напряжения. Да и эстетически оформлять готовые, работающие модули в коробочки — достаточно приятно и удобно.
Идём дальше!
Уже много людей спрашивают, когда же микроскоп наконец заработает. Так вот — скоро! 🙂
Осталось сделать датчик вторичных электронов (источник -1кВ, источник +12кВ, усилитель), либо подключить усилитель поглощённого тока (уже готов, но картинка с него по словам знающих людей будет не такая красивая, как с SED).
И разобраться с усилителем для системы отклонения луча, там есть свои хитрости.
Линзами пока управляю просто с лабораторного блока питания, но планирую накупить ЦАПов (пойдут даже 10-битные, но сперва выясню, какие из них лучше), их там потребуется, наверное, с десяток, учитывая, сколько возможностей регулировок есть в этой колонне, и сделать для них общую плату управления по SPI-шине, например.
P.S.
Посещая страну, в которой родился и жил Эванджелиста Торричелли не смог удержаться и зашёл в Римский университет, где как раз проходила тематическая выставки Нано-Инноваций, посвящённая различному оборудованию, в том числе и микроскопам.
Передаю привет всем читателям из этой солнечной страны!
Источник