С момента предыдущей публикации прошло уже очень много времени, пора уже и рассказать об успехах :) Всё это время я посвятил практическому изучению электроники (цифровой и аналоговой), сделал с десяток печатных плат (метод ЛУТ оказался неплох!), просмотрел сотни схем от разных электронных микроскопов различной давности изготовления. И даже собрал парочку проектов на Arduino, чтобы на чём-то попрактиковаться.

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



На видео — демонстрация того, как реализовано сканирование и захват изображения. Плата пока ни к чему не подключена, но данные реальные (по градиентам серого можно угадать моменты, когда я подключаю вход к выходам сканирования по X и Y).

Всю систему разделил на следующие независимые модули:

  • Захват изображения и интерфейс с ПК.
  • Блок питания для точных элементов, и блок питания для силовых элементов (реле, клапана и пр.)
  • Управление магнитными линзами, статическое. Конденсор, фокусировка, смещение луча в начале, стигматор — всё это задаётся независимо от сканирования.
  • Управление отклонением луча. Непосредственно отвечает за перемещение луча по образцу. Увеличение задаётся именно здесь.
  • Управление вакуумной системой
  • Управление высоким напряжением и накалом катода
  • Источник высокого напряжения -1кВ для ФЭУ в детекторе вторичных электронов (SED)
  • Источник высокого напряжения +12кВ для коллектора SED (без него детектор будет работать в режиме регистрации упругоотражённых электронов — BSE)

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

I. Захват изображения


Думаю, что это самая «вкусная» часть всего проекта. То, с чем человек будет иметь дело при работе с микроскопом: видеть изображение, настраивать параметры — то, для чего раньше служила панель управления.

Аппаратная часть


Основа — Arduino Due, имеющая два цифро-аналоговых преобразователя (ЦАП), которые как раз и будут задействованы для отклонения луча по осям X и Y, и несколько аналогово-цифровых преобразователей (АЦП) для оцифровки получаемого с датчиков сигнала. Смысл в том, чтобы действия по установке луча в нужную точку и считывания сигнала выполнялись синхронно.
Вообще, есть два различных варианта, как сделать сканирование.

  1. Два цикла по X и Y, внутри установка луча в нужную точку путём вывода на аналоговый выход через ЦАП нужных значений, и оцифровка значения с датчика.
  2. Управляемые пилообразные генераторы с синхроимпульсами, а 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, и парочка L7805 для 5 В канала.

Двусторонняя печатная плата, метод ЛУТ:



После напайки компонентов плата выглядит так:



Часть деталей была повторно использована из вышедших из строя компьютерных блоков питания ATX, включая провода. В качестве корпуса использован родной корпус этого же ИБП.

III. Управление высоким напряжением и накалом катода


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

Основа модуля управления высоким напряжением — Arduino Nano, подключённое своими выходами на:

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

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

Со снятой крышкой устройство выглядит вот так:



Все эти провода аккуратно убираются в железный корпус от бывшего телевизионного ресивера (или чего-то подобного), который хорошо экранирует возможные помехи от «аквариума». По-крайней мере, после того как всё это было размещено в корпусе и сделано «как следует», Arduino Nano перестало виснуть вскоре после включения высокого напряжения. Да и эстетически оформлять готовые, работающие модули в коробочки — достаточно приятно и удобно.

Идём дальше!


Уже много людей спрашивают, когда же микроскоп наконец заработает. Так вот — скоро! :)
Осталось сделать датчик вторичных электронов (источник -1кВ, источник +12кВ, усилитель), либо подключить усилитель поглощённого тока (уже готов, но картинка с него по словам знающих людей будет не такая красивая, как с SED).

И разобраться с усилителем для системы отклонения луча, там есть свои хитрости.

Линзами пока управляю просто с лабораторного блока питания, но планирую накупить ЦАПов (пойдут даже 10-битные, но сперва выясню, какие из них лучше), их там потребуется, наверное, с десяток, учитывая, сколько возможностей регулировок есть в этой колонне, и сделать для них общую плату управления по SPI-шине, например.

P.S.


Посещая страну, в которой родился и жил Эванджелиста Торричелли не смог удержаться и зашёл в Римский университет, где как раз проходила тематическая выставки Нано-Инноваций, посвящённая различному оборудованию, в том числе и микроскопам.

Передаю привет всем читателям из этой солнечной страны!

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


  1. Alex_ME
    30.10.2017 23:07
    +1

    С интересом смотрю за Вашим проектом и от всей души желаю удачи!


    По поводу ЛУТа. Используете утюг? Вижу, вы человек очень пряморукий (не то, что я), но все равно хочу порекомендовать ламинатор FGK 220 (не реклама, просто не знаю других на толщину листа 2+ мм). Купил и поставил в лаборатории ВУЗа — результат, по сравнению с утюгом, просто потрясающий. И самое главное — не нужно прикидывать силу нажатия, время прогрева — с его помощью передержаь и передавить невозможно, только недодержать.


    1. reactos Автор
      30.10.2017 23:15

      Спасибо! Я совсем не доволен тем, как получается ЛУТ с помощью утюга (местами приходится дорисовывать из-за того, что непропеклось до конца). Так что, на самом деле, я бы внял совету. Т.е. всё тоже самое, но плату с двумя листами заправляем в этот ламинатор?


      1. Alex_ME
        30.10.2017 23:21
        +1

        Да, все то же самое. В случае односторонней платы просто кладу текстолит, бумажку с распечатанной платой в "конверт" из бумаги — свернутый пополам лист. Полученный бутерброд аккуратно кладу в ламинатор и гоняют туда-сюда (там как раз удобная кнопка переключения направления) раз 10 на аксиальной температуре.


        В случае двусторонней платы, после совмещения, предварительно совсем немного прогреть утюгом, чтобы прилипло и не сместилось.


        Так получилось спокойно сделать плату размером примерно 10х20 с дорожками 0.3 мм.


        А так в интернете есть несколько видео с процессом.


      1. Impuls
        31.10.2017 08:36

        Еще могу дать совет. Когда-то на гиктаймсе его подсмотрел. Используйте не глянцевую бумагу, а самоклейку oracal. Т.е. алгоритм такой:
        1. Печатаете на обычной бумаге плату
        2. Отрезаете кусочек самоклейки с небольшим запасам по размерам (подойдут и другие, но именно с oracal-ом получается идеально), и клеите поверх напечатанного
        3. Кладете склеенный бутерброд снова в принтер и печатаете. В итоге у Вас получится рисунок печатной платы на кусочке самоклейки. Такой способ очень сильно экономит эту самую самоклейку.
        Все. Дальше как при луте, либо утюг, либо ламинатор. С той лишь разницей что не надо полчаса отдирать бумагу от платы. И вообще не надо мочить, только немного остудить. Тонер полностью отстает от oracal-а и рисунок получается идеальным.


      1. zartarn
        31.10.2017 14:35

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


      1. artp
        01.11.2017 13:49

        Очень рекомендую для ЛУТа термотрансферную бумагу. Сам недавно началь юзать такую, но есть и другие, которые продаются у нас. Раньше работал по заветам DIHALT на Lomond'е, но всегда приходилось что-то дорисовывать. Либо не пропечаталось, либо сам стер в процессе смывания. На термотрансферной все получается гораздо легче. Только греть надо меньше.


        1. DIHALT
          01.11.2017 18:39

          Плюсую за желтую шнягу с али. Хороший на ней результат получается. А еще ее после переноса можно типографским денсити тонером попшикать и вообще отлично получается.


  1. Psychosynthesis
    31.10.2017 01:34

    По поводу схемы блока питания. Линейные регуляторы это, конечно, здорово. Только вот раз вы усиливаете их ток внешнимим транзисторами, вы практически лишаетесь схемы внутреннего ограничителя тока данных регуляторов. Кроме того, вам не помешало бы добавить дополнительный диод на каждый регулятор, направленный с выхода на вход — для безопасного разряда ёмкостей и уменьшения бросков тока при включении\выключении индуктивной нагрузки. Вот тут более подробно: Схемы включения и особенности линейных стабилизаторов


    1. reactos Автор
      31.10.2017 01:59

      Да, но другого варианта не было, только делать дополнительную защиту от КЗ. С бросками от индуктивных нагрузок хотелось бы бороться в тех местах, где они случаются. А насчёт диода, он нужен в случае усиления регулятора транзисторной сборкой? По той ссылке диода нет в случае применения усиливающих транзисторов, и в datasheet тоже самое.


      1. Psychosynthesis
        31.10.2017 02:55

        Я его просто там не рисовал, чтоб не усложнять излишне схему. Он нужен в любом случае, если ёмкость на выходе больше 1мкФ.

        Я думал у вас этим блоком питается в том числе и отклоняющая система, а мне казалось она (как нагрузка) обычно носит, как минимум, комплексный характер и определённая индуктивность там присутствует.


        1. reactos Автор
          31.10.2017 04:06

          Ах, так это ваша страница! Благодарю за столь подробное изложение материала. Насчёт диода — да, там действительно на выходе тоже ёмкость стоит больше 1uF однозначно.
          Про отклоняющую систему, безусловно она индуктивная, я имел в виду, что ограничивающие элементы хочу расположить непосредственно в местах управления этой индуктивностью. Там же ещё и дополнительные согласующие элементв поставить. Наверное в следующей статье об этом напишу, чтобы можно было обсудить схему.


        1. reactos Автор
          31.10.2017 04:07

          А про защиту от превышения макс тока можете что-то подсказать?


          1. Psychosynthesis
            31.10.2017 14:04

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


            1. semen-pro
              01.11.2017 10:28

              А если взять самовосстанавливающийся предохранитель? Или несколько параллельно?


              1. Psychosynthesis
                01.11.2017 12:00

                У них своя специфика. Я данный вопрос не изучал досконально, могу ошибаться, но, вроде бы, они в основном подходят если повышение тока происходит плавно (например от температуры). Насколько я знаю, большинство опытных схемотехников данные решения стараются избегать — якобы при слишком быстром превышении тока они не успевают отрабатывать и схему не спасают. Не могу никак комментировать данный вопрос, так как не имею достаточно опыта применения, но пока не тестировал, склонен соглашаться.


  1. token
    31.10.2017 10:21
    +1

    Не знаю насколько вам нужно быстродействие, но со штатным модулем SerialPort — ничего хорошего там не будет точно. Если кратко, то проблема в FTDI (та что делает USB <-> Serial интерфейс в ардуине), а если точнее то у нее самой по умолчанию прошит буфер (64 байта), и пока этот буфер не наполнится, данные никуда не пойдут. Более подробно о том что настраивать здесь: www.ftdichip.com/Support/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf Можете также почитать про мои мытарства с разгонянием FTDI здесь: www.drive2.ru/l/473443110924321694 и тут: www.drive2.ru/l/473948611395190975
    Но! Даже после разгона FTDI до максимально возможной скорости (+ установке максимально возможной скорости передачи данных по Serial) — возникает проблема в том, что эти данные с такой скоростью — очень сложно принимать и визуализировать (их тупо слишком много), браузер не справится с этим точно )
    Кроме того, в ваш протокол взаимодействия нужно ввести коррекцию ошибок, в ином случае будете долго искать проблему пропажи пакетов либо их некорректности (так как там много мусора сыпется).


    1. reactos Автор
      31.10.2017 12:42

      Нет, это не FTDI, а Native USB. Модуль SerialUSB в Arduino. С FTDI такой скорости, как на видео не достичь


      1. token
        31.10.2017 14:02

        Ну с этим не работал, поделился тем что есть.


    1. Mirn
      31.10.2017 16:01

      насчёт проблемы приёма и визуализации данных я делал свою версию уарт терминала с отображением данных как текст и как графики (если по уарту идёт простой cvs формат с табуляторами и int'ами). на практике в реалтайме работало на скоростях до 50мегабайт в секунду или 2-3 миллиона целых чисел в секунду. Давно думал писать про это статью или нет. Всё кажется что это тривиальная задача. Но постоянно замечаю что коллеги жалуются на подобные проблемы и что это реально для них не простая задача.


      1. token
        31.10.2017 16:31

        У меня проблема была в том, что слать данные быстрее чем их возможно отобразить (визуализировать в виде live — графика) — не имеет смысла, поскольку FPS все равно задрать не получится.


      1. proton17
        31.10.2017 17:20
        +1

        50мбайт/с это около 400мбит/с, зачем такие скорости на UART и что у вас за физика канала была?


  1. SopaXT
    31.10.2017 10:22

    del, сверху объяснили


  1. Ig_B
    31.10.2017 12:12

    Какой ток накала? Может лучше не крутить трансформатор, а использовать ЦАП и стабилиатор тока на ОУ с мощным транзистором?


    1. reactos Автор
      31.10.2017 14:27

      Да, такая мысль есть, тогда и питание катода будет постоянным током, а не переменным. Это пока что, по пути наименьшего сопротивления идём. Кстати, этот трансформатор тоже местами нестабильно работает из-за износа графитового (?) ползунка.


  1. wyfinger
    31.10.2017 12:12

    По поводу обмена данными,- посмотрите EasyTransfer. Тоже сначала писал свою реализацию обмена пакетами, в Proteus все прекрасно работало, но в реальном устройстве (где было ШИМ-регулирование мощным двигателем) было много помех.


    1. reactos Автор
      31.10.2017 14:28

      Пока между двумя ардуинами не обмениваюсь данными — всем управляет компьютер, поэтому не применял эту библиотеку. В будущем, наверное, будет удобно, спасибо!


  1. DZent
    31.10.2017 13:49

    По поводу изготовления печатных плат. Вы смотрели фоторезистивный метод изготовления печатных плат? С ним точность повыше получается, и нет проблем с качественным переводом рисунка на плату как у ЛУТа. Статей сейчас об этом методе предостаточно, тут на Geektimes тоже были статьи. Плюс можно изготавливать платы с паяльными масками «избавившись» от лужения всей платы.
    Удачи Вам с проектом!


  1. superhimik
    31.10.2017 14:36

    А когда будут картиночки?


    1. reactos Автор
      31.10.2017 14:57

      Скоро (с)


  1. grafinventor
    31.10.2017 17:09
    +1

    Какого разрешения картинку вы планируете получить? Какую полосу для усилителя поглощенного тока выбрали? или в случае детектора вторичных элеткронов, Вы планируете использовать сцинтилляционный детектор? Будите ли использовать возможность подачи на клетку Фарадея сцинтилляционного блока детектора не только положительного потенцианало но и отрицательного? Вы сказали про 12 кВ ускоряющего напряжения, вероятнее всего вы имели в виду ускоряющее напряжение на сцинтилляторе, соответственно есть у меня подозрения, что в качестве сцинтиллятора вы планируете использовать цезиевый люминофор? Какое из согласующихся по длине волны с люминофором фэу вы планируете использовать и с какой скоростью нарастания и спада при вашей частоте сканирования что бы обеспечить контраст? pp.userapi.com/c840330/v840330133/11371/QSeiMe082RU.jpg


    1. reactos Автор
      31.10.2017 17:19
      +1

      • Разрешение — думаю о 1024x1024, но сейчас в программе сделал 512х512 (на видео оно). Меняется легко, от этого зависит частота обновления. Если усложнить, то можно сделать быстрое обновление выбранного пользователем кусочка, например, 128х128 для удобной настройки фокуса.
      • Усилитель поглощённого тока на LMC6001, у него gain bandwidth product = 1.3MHz.
        Как будет работать в реальности — ещё не пробовал
      • Я купил остатки старого детектора от советского микроскопа. Там сцинтиллятор и согласованный для него ФЭУ вместе с резистивным делителем на диноды. Из чего сделан сцинтиллятор — незнаю
      • Подача отрицательного потенциала — это усложняет схему, пока не предусматриваю этой возможности. Потом, наверное
      • Да, ускоряющее на сцинтиллятор, по инструкции так было в JEOL'е.


      1. grafinventor
        31.10.2017 17:43

        изменяемое разрешение это прекрасно! особенно для обзорного режима! Какой тип развертки думаете применить? Будите ли использовать гашение луча (и каким образом оно у вас реализовано, с помощью изменения потенциала цилиндра Винельта или физическое прерывание луча)? А вы уверены что в остатках «старого советского» детектора сцинтиллятор живой? Ускоряющее напряжение на сцинциллятор у joil это как раз напряжение необходимое для гарантированного возбуждения сцинциллятора Р-47 (как раз цезиевого).


        1. reactos Автор
          31.10.2017 18:37

          В сцинтилляторе совсем не уверен… Возможно придётся заказывать новый.
          Кстати да, про обзорный режим, похоже, что первая версия отклоняющего усилителя и будет полезна только для обзорных целей :) Для больших увеличений там очень малые токи и большая точность нужна, ещё надо обдумать, как это лучше сделать.
          Венельт решил не трогать, сложно там менять напряжение.


          1. grafinventor
            31.10.2017 19:27
            +1

            На счет усилителя отклонения, вы совершенно правы, проектирование этого усилителя очень не простая задача :) Но я так понимаю у нас с Вами разные задачи: Ваша — запустить, моя — спроектировать с нуля. Управление Винельтом весьма не сложная задача если изначально высоковольтный источник спроектирован с этой целью. Я потратил почти год на разработку концепции, принципиальных схем и апробацию конструкции. В моём случае Винельт помимо управления поддерживает ещё 2 режима быстрого (100нс) бланкига, т.е. прерывания луча. Так как в той колонне, которую я использую сейчас, нет механического бланкинга, однако в конструкции колонны, которую я разрабатывал и моделировал сам поддержка механического бланкинга имеется. А как вы планирую реализовать корректировку аберраций различного рода стигматором?


            1. alexhott
              31.10.2017 20:35
              +1

              А теперь можно последние 10 сообщений на русском?
              Шучу конечно, но обилие терминов стало зашкаливать, не успеваю в гугл ходить.
              С нетерпением жду каждой статьи про ваш микроскоп


            1. reactos Автор
              01.11.2017 00:38

              Задача схожая на самом деле — я проектирую и реализую с нуля всё, кроме самой колонны (потому, что делать ещё и колонну с нуля сразу — слишком тяжело, это второй этап :) ). Но стараюсь использовать готовые блоки, если попадаются, чтобы сократить путь до работающего прототипа, а затем уже улучшать.
              Динамическое управление Венельтом — это сила! Но да, это нужно ВВ БП с таким замыслом делать, а я пока пользуюсь готовым.
              Кстати, если сделать некоторое допущение и предположить, что бланкинг нужен только для того, чтобы не светить на образец постоянно, то в принципе можно существенно уменьшать интенсивность луча путём слишком сильного тока в конденсорной линзе, либо отключать конденсор вообще; смещать луч отклоняющей системой; расфокусировать последней линзой.
              Но это смотря зачем бланкинг нужен.


            1. reactos Автор
              01.11.2017 00:39

              В колонне этого JEOLа есть всё необходимое, и даже вторые неиспользуемые обмотки стигматора (зачем они пока не разгадал, на схеме называется STIGMA MONITOR). Проверил все обмотки, кроме стигматора — работают. Стигматор ещё не проверял


  1. ToSHiC
    02.11.2017 12:37

    По поводу развёртки и МК.
    Я правильно понимаю, что у вас в планах 1млн измерений сделать (1024х1024)? Тогда с вашим вариантом управления будет достаточно медленно работать. Попробуйте что нибудь на ядре ARM, с DAC и ADC работать через DMA. Т.е. для каждой строки сначала задаёте положение луча по Y через DAC, затем запускаете DMA, который будет выплёвывать некий паттерн в DAC на канале X, обеспечивая линейное передвижение луча, ну или какое вам необходимо. Параллельно запускаете, опять же через DMA, считывание показаний с ADC. На компьютер данные отсылать через нативный USB интерфейс, на ходу можно ещё сжать, если вдруг поток окажется слишком толстым.


    1. reactos Автор
      02.11.2017 16:32

      Ну вот в том видео, что наверху, это и есть основанный на ARM Arduino. Скорость работы — реальная, но дело в том, что на видео я делаю только одно измерение за один раз. Для начала усреднять (для устранения шума) планирую непосредственно на компьютере.
      Но в принципе подход интересен, я тоже думал об этом.