Итак, вчера я написал базовый функционал для управления турелью "High Speed Filter Wheel" от Edmund Optics, сегодня добавил функцию смены имен колес/фильтров и более-менее дополировал. Код лежит на гитхабе (т.к. утилитка мелкая, я ее в сниппеты запихал, чтобы отдельную репу не делать), а также в одноименных репах на сосфорже, гитлабе и битбакете. Функционал сброса имен в "умолчательные" значения пока не добавлял (не думаю, что нужно).
Дальше )
Видео:


UPD


Сегодня взял вторую турель и доработал утилиту: избавился от вышеназванных багов, добавил возможность сброса имен в значения по умолчанию, добавил возможность установки в позицию "дом" той турели, в которой есть указанный фильтр. Да и вообще, оказалось, что все купленные колеса промаркированы как 'A', т.е. обращаться надо будет либо по идентификатору (что не очень удобно), либо по именам (что удобней). Хотя, конечно, плохо, что колеса одноименные: если колесо воткнуть в "чужую" турель, понять об этом можно будет лишь после пробных снимков (и то, возможно, не сразу)...

Систему управления фотометром планируем только под линукс писать (Тимур говорит, что "родной" линуксовый SDK для быстрой камеры присутствует и есть истории успеха работы с ним), архитектура будет клиент-серверная. А вот клиенты уже будут кроссплатформенными (для себя, наверное, консольную сделаю, а для народа тимур на Qt нарисует). Самой интересной и сложной будет методическая работа: как обрабатывать "кубы данных" с быстрой камеры, чтобы реализовать работу Lucky imaging. Заодно думали про фокусировку: если у цейсса нет каких-нибудь характерных асимметричных дефектов изображения (скажем, комы) с амплитудой выше полуширины первого максимума функции Эйри (но, понятное дело, меньше сиинга, иначе эти дефекты давно заметили бы), то определить знак изменения фокуса без перефокусировки (или установки в сходящемся пучке асимметричной маски) будет невозможно!
Появилось у нашей лаборатории желание создать фотометр для Zeiss-1000 с минимумом разработок железа/софта и т.п. Одной из частей фотометра будут две турели High Speed Filter Wheel. Как обычно, железо огороженное. В отличие от предшественника Intelligent Filter Wheel (у которого вполне нормальный последовательный интерфейс с описанным в документации протоколе), у этой железяки только мастдайнутый установщик и никакой документации о протоколах!

При подключении к компьютеру железяка создает устройство /dev/hidrawX. На основе примера работы с этими устройствами из ядра я попытался определить, как же им управлять. И, в принципе, основные вещи реализовал (установка в "дом", установка на заданную позицию), но без понятия, как реализовать сброс (в отличие от usbdevfs эмуляторов последовательных портов здесь простым ioctl'ом перезапустить соединение не вышло). А сброс очень важно реализовать, т.к. любая проблема в протоколе вызывает "глухоту" контроллера: он перестает реагировать на управляющие команды.

Кстати, в опытах выяснил интересную вещь: если в первую десятку регистров hidraw под ведром 3.12 писать ненулевые данные, ядро (случайным образом, кстати: можно десяток раз так сделать без последствий, а можно с первого раза попасть) уходит в глубокий kernel panic, перезагрузка после которого чревата десятиминутным fsck'ом (это еще хорошо, что у меня один винт и небольшой)!

Протокол )

Вот таким жутким велосипедостроением приходится порой заниматься, потому как разработчики железяки закрысили описать протокол (заодно передаю привет Canon'овцам)! То ли еще будет с ПЗС…

UPD


Пока вендокомпьютер был свободен, я поставил софт управления турелью и попытался проанализировать трафик сниффером.
Регистры изменения положения турели )

UPD-2


Я вспомнил, что у меня есть вендокомпьютер для работы с Шаком-Гартманном (да, каюсь: я уже 6 лет не могу собраться, и написать нормальное ПО без огораживания). С его помощью была проделана оставшаяся работа.
Регистры работы с EEPROM и сброса )
Все, как только напишу полноценную управлялку, создам новую тему.
Итак, поскребя по сусекам посмотрев примеры с easyelectronics.ru, я таки собрал все воедино и у меня получился рабочий эмулятор USB→COM (его, кстати, можно и как реальный использовать при небольшой доработке).
Вот — исходники. Пока что в них полным-полно мусора, но наконец-то после выполнения
make && make load

и переподключении USB (почему-то сразу после заливки железяка не определяется, наверное, нужно при запуске сначала отключить USB, подержать его немного так, а потом уже включать - ХЗ, будет моим домашним заданием) появляется устройство /dev/ttyACM0!!!
more )

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

После сборки и прошивки (make && make load) светодиод замигал, а dmesg выдал
[181351.201294] usb 1-1: new full-speed USB device number 69 using xhci_hcd

В /dev/ появилось устройство /dev/bus/usb/001/069. Конечно, с ним пока ничего не поделаешь: использовать libusb я не хочу, т.к. есть вроде бы возможность "оформить" железяку как посредник USB→RS232, чтобы появилось устройство /dev/ttyUSBx, с которым уже можно было бы работать, как с обычным последовательным портом, безо всяких libusb. А это будет намного лучше: все равно для работы эта плата будет использовать USART, но для тестовых подключений — как раз USB (т.к. я не собираюсь таскать туда-сюда "железный" переходник USB→RS232, не для того дорогущий ARM покупался).

Итак, остается почитать спецификации: как должно себя идентифицировать устройство, чтобы система решила, что это — USB→RS232, а не какое-то "левое" устройство.
А потом — дело за малым: подрихтовать исходники (выбросить все ненужное и заменить жирную printf на самописную) и добавить своих функций.
P.S )
Внеся минимальные правки в скачанный отсюда код (который по идее должен работать), получил вот это. Но фигвамушки ☹, не работает, собака!

Что-то уже крыша съезжает, так что, наверное, сегодня до конца рабочего дня пропинаю, а завтра с новыми силами возьмусь за внимательное вчитывание в код. А то непонятно, где что и в какой последовательности выполняется. Может, где-то забыта функция инициализации порта. А может, я где-то пропустил определение пинов, к которым USB подключены.

P.S. )

July 2017

S M T W T F S
      1
23 4 5 6 78
9 101112 131415
16171819 202122
23242526272829
3031     

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 02:43 pm
Powered by Dreamwidth Studios