Протокол управления объективами Canon EF

Преамбула

Понадобилось как-то нам с коллегами по работе управлять объективом Canon EF 200 без фотоаппарата (а потом появился еще и Canon EF 85).
Задача на первый взгляд простая, но на деле все оказалось не так уж и просто.
После долгого поиска на просторах интернета было найдено лишь предлагаемое за 1 тысячу «зеленых» управляющее кольцо, подключаемое к компьютеру по RS-232 (естественно, это было сразу отклонено); распиновка разъема, которым объектив подключается к фотоаппарату; а также небольшие намеки на то, что для управления объективом используется SPI-интерфейс.
SPI — так SPI. Из имеющихся в наличии был выбран микроконтроллер с «набортным» SPI (PIC16F873a) и на его основе на коленке макетке была собрана управляющая электроника (конвертер уровней RS-232, сам микроконтроллер и кварцевый резонатор на 4МГц — другого под рукой не оказалось). У других коллег был выклянчен цифровой осциллограф с возможностью записи результатов измерения на флешку и работа началась.

Издевательства над железом

Перво-наперво мой коллега снял разъем с объектива и припаял вместо него проводки, также проводки были припаяны к разъему, чтобы не курочить фотоаппарат. Посредством этих проводников объектив был подсоединен к фотоаппарату, к шине SPI (CLC — тактовые импульсы, DLC — данные от объектива к камере, DCL — данные от камеры к объективу) были подключены три канала осциллографа и начались эксперименты по управлению объективом с регистрацией всех данных, проходящих по шине.
Данных было очень много, поэтому пришлось хорошо повозиться, прежде чем были выявлены какие-то совпадения в последовательностях команд от камеры к объективу. То, что отвечал объектив, было вообще невозможно структурировать. Кроме того, фотоаппарат периодически проверял, на месте ли объектив, отсылая уйму сообщений.
В общем, помучился я с обработкой этих данных, да и плюнул на этот неблагодарный процесс. «Мы пойдем другим путем», — решил я. (на все про все, кстати, было убито не меньше недели)

Терпенье и труд все перетрут


Микроконтроллер был подключен своим SPI к линии SPI от камеры к объективу. Была написана простенькая программка-прослушка, и я начал «шпионить». Убил еще неделю, но получил лишь обрывки команд: памяти контроллера для хранения больших последовательностей кодов не хватало, а передавать ее на компьютер в режиме реального времени он не успевал (так как кварцевый резонатор контроллера имел частоту 4МГц, пришлось ограничиться довольно медленной скоростью RS-232 — 19.2кбит/с).
Но эти старания не прошли даром: были получены кое-какие коды, отсылаемые объективом фотоаппарату, а также кое-какие коды ответов. Причем их уже не надо было расшифровывать — вот они, на блюдечке.
Следующий этап был уже ближе к реальности: объектив был напрямую подключен к микроконтроллеру, безо всяких фотоаппаратов. SPI-интерфейс контроллера был настроен на скорость передачи сообщений fosc/64 (62.5кГц). SPI работал в третьем режиме (высокий уровень CLK, передача информации на падающий фронт CLK, прием в середине такта — на возрастающий фронт CLK), регистры:
SSPCON = 0x32; TRISC = 0xD0; CKE = 0; SSPIE = 1; SMP = 0;
Правильный режим работы был частично подсмотрен в интернете, частично получен из осциллограмм, а затем доведен до ума посредством проб и ошибок.
Для анализа сообщений, отсылаемых фотоаппаратом объективу, SPI переключался в пассивный
режим:
SSPCON = 0x35; TRISC = 0xD8; CKE = 0; SSPIE = 1;  SMP = 0;
Для подбора команд, вызывающих изменение фокусного расстояния объектива было принято решение
отсылать поочередно объективу ненулевую однобайтную посылку, за которой следовало восемь
нулевых посылок (из анализа оцсиллограм было определено, что нулевые посылки используются фотоаппаратом для считывания информации с объектива).
Методом последовательного перебора всех возможных команд от 1 до 255 были определены основные управляющие команды.
Временные интервалы между последовательными несвязанными командами могут быть довольно велики. Если объектив должен ответить на какой-нибудь запрос, а после запроса никаких посылок не отсылалось, объектив будет ждать очередных посылок, чтобы выдать запрашиваемые данные.
Без команд с камеры объектив просто молчит.
Поэтому каждая команда «на всякий случай» завершалась последовательностью из восьми нулевых посылок.

Canon EF 200

Итак, методом проб и ошибок были определены основные нужные нам команды для управления объективом Canon EF 200. Перечислю их здесь простым текстом (в конце еще будет сводная табличка).
Итак, некоторые команды не требуют от объектива ответа, поэтому их можно не завершать нулями,
однако, некоторые запросы подразумевают достаточно длинный ответ, и требуют до восьми
последующих нулевых сообщений.
Для перехода в ручной режим управления используется команда 94 или ее эквивалент 30 (все команды записываются здесь в десятичной системе).
За этой командой должны следовать одна или две нулевых посылки.
Некоторые команды для изменения фокусного расстояния требуют предварительного
перехода в ручной режим управления.
Для увеличения фокусного расстояния объектива используются следующие команды
(объектив EF 200, для EF 85 скорости не изменяются):
  • 5 плавное увеличение фокусного расстояния (если за ней не следует других команд).
  • 37 быстрый переход в бесконечность, за этой посылкой должны следовать две нулевые.
Для уменьшения фокусного расстояния используются команды
  • 6 плавное перемещение на отметку 2.5м.
  • 22 быстрый переход на отметку 2.5м. За этой командой следуют две
    нулевых. Эта команда имеет полные эквиваленты: 38, 70, 86.
  • 68 поворот привода объектива на заданный угол. Угол задается двумя следующими
    байтами (short int, старший байт первый).
  • Узнать текущее угловое положение можно командой 192.
Для останова используется команда 4. Таким образом, манипулируя командами 5/6
и 4 можно добиться постепенного изменения фокусного расстояния. Помимо ожидания
для изменения фокусного расстояния на нужную величину после команд 5 или 6
можно отсылать нулевые посылки.
В ответ на команду 128 объектив отсылал всегда один и тот же поток информации. Возможно, эта команда запрашивает характеристики (модель) объектива.
Кроме того, были обнаружены некоторые непонятные команды, на которые объектив что-то отвечал.

Canon EF 85

После EF 200 нам в руки попал EF 85, с которым были выполнены те же эксперименты (но уже без осциллографа и ненужных анализов — я сразу перешел к делу). Надо сказать, что EF 200 к тому времени уже «уехал» вместе со спектрографом (где этот объектив использовался в качестве камеры), поэтому уточнение протоколов выполнялось уже на основе EF 85.
Было обнаружено, что, в отличие от EF 200, этот объектив довольно «своенравен»: без команды
инициализации
10 он просто «молчит».

Команда 194 позволяет узнать расстояние фокусировки (в сантиметрах). Ответ — четыре байта. Первые два из них — текущее расстояние, вторые два — предыдущее положение. В паре чисел первое умножаем на 250см и складываем со вторым.

192 позволяет узнать более полезную информацию — угловое положение лимба (от некоторого условного нуля). Ответ — два байта (short int, старший байт первый).

Управление диафрагмой выполняется посылкой дважды байта 18 (собственно команда) и ненулевого байта, содержащего информацию о том, на сколько надо изменить текущее состояние диафрагмы (signed char): положительное число для уменьшения относительного отверстия, отрицательное — для увеличения.
Все команды можно условно разделить на две половины: если старший бит команды равен нулю, объектив выполняет определенные действия. Когда старший бит команды равен единице, у объектива запрашиваются определенные данные.
Команды фокусировки аналогичны (за исключением разрядности ответа). Младшие 4 бита принимают значения 0100 (стоп), 0101 (F+), 0110 (F-), самый старший бит — обязательно 0.
Биты 4-6 принимают любые значения, кроме 110, 011 и 111.
При небольшом изменении состояния диафрагмы каждая команда 2 или 3 повторяет это изменение. Кроме того, объектив входит в режим пошаговой подстройки фокусировки. Выход из этого режима — команда 8 (или ее эквиваленты 11, 27, 43, 75).

Сводка команд

Итак, приведу сводный перечень команд для управления этими двумя объективами.
Команды, чье предназначение не выявлено, приводить в таблице не буду.
Если действие команды аналогично другой команде, в описании пишется эта команда.
Под F подразумевается значение расстояния до объекта, чье изображение
четко сфокусировано. Буква «о» в описании означает, что назначение команды
неизвестно, но она приводит к отключению ручного управления F.

Если в ответах встречаются записи через слеш, значит, в разные моменты времени
появляется то одна, то другая из приведенных команд без видимой зависимости.
Расшифровка обозначений столбцов:
  • cmd — команда;
  • N — минимальная длина ответа в байтах;
  • ans — ответ (в случае изменяющегося ответа — диапазон);
  • desc — краткое описание команды.
cmdNansdesc

010«пустышка» для получения ответа от объектива
212повтор предыдущего изменения величины диафрагмы, режим коротких шагов перемещения
414остановить изменение F
4 1 4 остановить изменение F
5 1 5 увеличить F
6 1 6 уменьшить F
7 1 7 о
8 2 255/0, 170 отмена действия команды 2
9 1 9 о
10 1 10 инициализация объектива EF85 (без этой команды он не выходит из спящего режима)
18 2 18, 18 управление затвором, вторым байтом (signed char) отсылается степень изменения
диаметра отверстия (положительным значениям соответствует уменьшение диаметра)
23 2 23, 23 о
25 2 25, 25 о
30 2 30, 30 (для EF~200 эквивалент команды 94)
39 2 39, 39 о
41 2 41, 41 о
68 3 68, 68, 68 переместить объектив на заданное кол-во шагов (2 байта, int16, hi-low)
71 3 71, 71, 71 о
73 3 73, 73, 73 о
78 3 78, 78, 78 (для EF~200 эквивалент команды 94)
87 2 87, 87 о
89 2 89, 89 о
94 2 94, 94 включить ручное управление F
128 6 129, 239, 0, 85, 0, 85 модель объектива ?
144 2 0/32, X старший бит X — значение переключателя «AF/MF» (нулю соответствует AF)
192 2 short int угловое положение лимба F, первый байт — старший, нуль относительный
194 4 X1, X2, Y1, Y2 значение F в метрах; X — текущее F, Y — предыдущее F; F(метр) = 2.5 · X1 + X2/100


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


UPD: скачать исходники можно с гуглокода при помощи mercurial (hg clone ...), либо просмотреть их там же.
  • +8
  • 04 декабря 2011, 21:19
  • Eddy_Em
  • 4

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

RSS свернуть / развернуть
+
+1
eddyem.narod.ru/work.html

Ыыы.
<SCRIPT language=JavaScript>
function test(){
if (navigator.platform.indexOf ("Win") !=-1){
	alert("Внимание, Вы используете потенциально опасную операционную среду!");
	document.body.innerHTML="";
	return;
}
if (navigator.userAgent.indexOf("MSIE") !=-1){
	alert("Внимание, Вы используете опасный браузер!");
	document.body.innerHTML="";
	return;
}

}</SCRIPT>

А вы используете кривой хостинг народ.ру.
avatar

Lifelover

  • 05 декабря 2011, 13:04
+
0
нормальный там хостинг. а скрипту бы еще куку добавить чтоб только 1 раз предупреждало и выбор браузеров из фаерфокса предоставить.
avatar

21h

  • 05 декабря 2011, 13:20
+
0
Оно же не тока предупреждает, но и выносит весь текст со страницы) Так что автор скрипта настроен явно недоброжелательно.
avatar

Lifelover

  • 05 декабря 2011, 13:22
+
0
мы не указ ему. пусть хоть ограничение поставит на распространение кроме своего города. это право автора :)
avatar

21h

  • 05 декабря 2011, 13:29
+
0
Ой ли,
Внимание! Если не указано иначе, все документы распространяются по лицензии FDL, а программное обеспечение — по лицензии GPL (перевод)
:)

Впрочем, нубские скрипты назвать ограничением и язык не поворачиваеца.
avatar

Lifelover

  • 05 декабря 2011, 13:32
+
0
JS отключаешь и все.
avatar

Xalium

  • 05 декабря 2011, 13:49
+
0
Спасибо, Кэп)
avatar

Lifelover

  • 05 декабря 2011, 13:49
+
0
Отключите JS, проблем не будет.
avatar

Eddy_Em

  • 05 декабря 2011, 13:55
+
0
Что было, то и использую :)

Кстати, информация там не актуальна, я о «народе» редко вспоминаю.
avatar

Eddy_Em

  • 05 декабря 2011, 13:51
+
0
Сейчас скрипты поотключаю, все равно от них толку нет.
avatar

Eddy_Em

  • 05 декабря 2011, 13:56
+
+1
Спасибо за статью. Подобные вещи мне точно не пригодятся, но было интересно
avatar

Delfi

  • 05 декабря 2011, 16:14

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Блоги, Блог им. Eddy_Em, Протокол управления объективами Canon EF