ИК-пульт управления для камер Canon на базе микрокомпьютера Freeduino Through-Hole

Часть вторая: создание пульта и управляющей программы
Пульт управления на Freeduino

В первой части статьи было описано, как с помощью контроллера Freeduino и ИК-светодиода генерировать сигнал для управления съемкой камерами Canon. Эта часть будет посвящена практической реализации пульта управления на Freeduino. Пульт должен дистанционно запускать съемку в обычном режиме и режиме с предварительной паузой, а также запускать съемку серии с заранее заданным интервалом между снимками. С помощью кнопок и потенциометра пульта управления будем управлять длительностью пауз между снимками, запуском съемки и выбором режима ДУ.

Пульт управления

К контролерам типа Arduino могут быть подключены кнопки и потенциометры, позволяющие управлять работой программ, загруженных в контроллер. Узнать об основных функциональных возможностях контроллеров, подключении внешних устройств и программировании для Arduino можно, к примеру, из книги (переведенной на русский) «Arduino: блокнот программиста» автора Brian W. Evans. Стандартные способы подключения кнопок и потенциометров (я использовал потенциометр и нагрузку на кнопках ≈10 кОм) приведены далее на схемах:

Компоненты

Схемы симметричны относительно подключения «земли» и питающего напряжения +5 В. Однако при том подключении для кнопки, которое показано на схеме, можно использовать встроенные в контроллер подтягивающие сопротивления, что обеспечит стабильную подачу сигнала +5 и 0 В на входы контроллера в процессе работы схемы. При этом нужно лишь обратить внимание на то, что кнопка в разомкнутом положении соответствует сигналу +5 В, а в замкнутом — нулю, и потому проверка на включение будет соответствовать константе LOW, а выключение — HIGH. После этих замечаний перейдем к созданию самого́ пульта.

В пульте я использовал 1 потенциометр и 6 кнопок и переключателей. Три переключателя будут дискретно задавать время задержки между снимками. Потенциометр выполняет псевдоаналоговую (дискретную с большим количеством шагов) регулировку. Две кнопки с фиксацией будут управлять включением программы-таймера и режимом работы пульта (с задержкой и без). Одна кнопка без фиксации (синяя на картинке) дублирует кнопку «сброс» контроллера. Количество кнопок было выбрано исходя из возможностей понравившегося мне телефонного разветвителя — у него 8 выводов, что достаточно для «земли» и 7 сигнальных линий. Схема подключения элементов проста — кнопки и потенциометр собраны вместе и подключены к общей земле и +5 В в соответствии с указанными выше схемами их индивидуального подключения. Фотография конструкции приведена далее:

Пульт управления на Freeduino
Пульт управления

Пульт управления на Freeduino
Схема в сборе в варианте автономной работы (без подключения к компьютеру) на стенде, описанном в статье «Установка для съемки панорам на базе контроллера Freeduino. Часть 1, механическая»

Те, кто уже знаком с Arduino, возможно, заметят необычное подключение пульта управления не к цифровым линиям контроллера, а к аналоговым. Так как я планирую использовать контроллер одновременно для управления шаговыми двигателями поворота камеры и для управления съемкой, приходится задействовать все доступные порты. Сигналы для шаговых двигателей и ИК-светодиода управления передаются через цифровые линии, сигналы пульта управления — через аналоговые.

Управляющая программа

Пульт управления на Freeduino, программа
Управляющую программу для пульта можно скачать по ссылке.

Отмечу некоторые особенности программы.

Пульт управления на Freeduino, программа
Первая часть программы — объявление переменных и констант

В блоке объявлений из необычного — переопределение аналоговых портов как цифровых и использование типа long для переменной счетчика задержки съемки. Аналоговые порты с адресами по умолчанию 0—5 переопределены как цифровые 14—19 — теперь к ним можно обращаться, как к стандартным цифровым. Счетчик задержки съемки cycle_delay может принимать довольно большие значения, поэтому нужно выбрать допускающий такие значения тип — long.

Пульт управления на Freeduino, программа
Функция инициализации. Обращу внимание на команды digitalWrite(var, HIGH) включения подтягивающих резисторов, встроенных в контроллер, на портах, соответствующих переменным var.

Пульт управления на Freeduino, программа
Основной цикл программы loop

Цикл будет исполняться, если включена кнопка start_switch; проверка на включение/выключение: digitalRead(start_switch)==HIGH.

Проверка условия digitalRead(type_rc_switch)==HIGH задает режим работы пульта — с задержкой перед срабатыванием затвора и без таковой.

Счетчик пауз в процессе съемки суммирует «секунды» задержки. Пауза по умолчанию — 1 секунда. Три переключателя, определенные переменными switch1/switch2/switch3 работают как разряды двоичного числа, позволяя задавать паузу в пределах от 0 до 7. Потенциометр с аналоговым подключением по умолчанию позволяет задать 1024 шага управления. Для ограничения формируемой им задержки величиной в ≈100 секунд значение считываемого уровня округляется умножением на 0,1: 0.1*analogRead(potentiometer).

Так как в нашей схеме нет цифрового индикатора времени задержки (паузы), для отладки шкалы потенциометра в программу введен блок индикации задержки в секундах — светодиод, встроенный в плату Freeduino на 13-м порту, мигает задаваемое счетчиком задержки (в секундах) число раз:

for (int i=0; i {
    digitalWrite(ledPin, HIGH); // индикаторный светодиод включен
    delay(500); // ждем 0,5 секунды
    digitalWrite(ledPin, LOW); // индикаторный светодиод выключен
    delay(500); // ждем 0,5 секунды
}

После нанесения шкалы потенциометра на пульт управления этот блок нужно просто закомментировать: /*…*/.

За блоком индикации следует блок генератора ИК-сигнала, описанный в первой части статьи. К нему лишь добавлен небольшой объем кода для индикации срабатывания (для визуального контроля — сигнал ИК-светодиода для глаза невидим) с помощью встроенного во Freeduino светодиода на 13-м порту.

Пауза между циклами съемки задается командой delay(1000*cycle_delay).

Эксплуатация пульта

Пульт подключается к батарее питания или компьютеру по USB. Чтобы выбрать время задержки между снимками в диапазоне 1—8 секунд, используем переключатели, установив потенциометр в положение с минимальным сопротивлением. Если диапазон 1—8 секунд не достаточен, расширяем его с помощью потенциометра. Установив потенциометр примерно в положение 1/10 от полного оборота, включаем кнопку съемки. Считаем число миганий индикатора-светодиода на 13-м порту и отмечаем получившуюся задержку на пульте маркером. Таким образом можно проградуировать весь диапазон допустимого угла поворота потенциометра. Далее закомментируем (/*…*/) часть программы, отвечающую за индикацию задержки. После этого используем пульт по назначению. Отмечу еще, что программа допускает изменение задержки между импульсами в процессе съемки, то есть при необходимости можно вести съемку с разными по длительности паузами, не перегружая программу.




30 сентября 2011 Г.

��-����� ���������� ��� ����� Canon �� ���� ��������������� Freeduino Through-Hole. ����� ������, �������� ������ � ����������� ���������

��-����� ���������� ��� ����� Canon �� ���� ��������������� Freeduino Through-Hole

����� ������: �������� ������ � ����������� ���������

����� ���������� �� Freeduino

������ ����� ������ ���� �������, ��� � ������� ����������� Freeduino � ��-���������� ������������ ������ ��� ���������� ������� �������� Canon. ��� ����� ����� ��������� ������������ ���������� ������ ���������� �� Freeduino. ����� ������ ������������ ��������� ������ � ������� ������ � ������ � ��������������� ������, � ����� ��������� ������ ����� � ������� �������� ���������� ����� ��������. � ������� ������ � ������������� ������ ���������� ����� ��������� ������������� ���� ����� ��������, �������� ������ � ������� ������ ��.

����� ����������

� ����������� ���� Arduino ����� ���� ���������� ������ � �������������, ����������� ��������� ������� ��������, ����������� � ����������. ������ �� �������� �������������� ������������ ������������, ����������� ������� ��������� � ���������������� ��� Arduino �����, � �������, �� ����� (������������ �� �������) «Arduino: ������� ������������» ������ Brian W. Evans. ����������� ������� ����������� ������ � �������������� (� ����������� ������������ � �������� �� ������� ≈10 ���) ��������� ����� �� ������:

����������

����� ����������� ������������ ����������� «�����» � ��������� ���������� +5 �. ������ ��� ��� ����������� ��� ������, ������� �������� �� �����, ����� ������������ ���������� � ���������� ������������� �������������, ��� ��������� ���������� ������ ������� +5 � 0 � �� ����� ����������� � �������� ������ �����. ��� ���� ����� ���� �������� �������� �� ��, ��� ������ � ����������� ��������� ������������� ������� +5 �, � � ��������� — ����, � ������ �������� �� ��������� ����� ��������������� ��������� LOW, � ���������� — HIGH. ����� ���� ��������� �������� � �������� ������́ ������.

� ������ � ����������� 1 ������������ � 6 ������ � ��������������. ��� ������������� ����� ��������� �������� ����� �������� ����� ��������. ������������ ��������� ���������������� (���������� � ������� ����������� �����) �����������. ��� ������ � ��������� ����� ��������� ���������� ���������-������� � ������� ������ ������ (� ��������� � ���). ���� ������ ��� �������� (����� �� ��������) ��������� ������ «�����» �����������. ���������� ������ ���� ������� ������ �� ������������ �������������� ��� ����������� ������������ — � ���� 8 �������, ��� ���������� ��� «�����» � 7 ���������� �����. ����� ����������� ��������� ������ — ������ � ������������ ������� ������ � ���������� � ����� ����� � +5 � � ������������ � ���������� ���� ������� �� ��������������� �����������. ���������� ����������� ��������� �����:

����� ���������� �� Freeduino
����� ����������

����� ���������� �� Freeduino
����� � ����� � �������� ���������� ������ (��� ����������� � ����������) �� ������, ��������� � ������ «��������� ��� ������ ������� �� ���� ����������� Freeduino. ����� 1, ������������»

��, ��� ��� ������ � Arduino, ��������, ������� ��������� ����������� ������ ���������� �� � �������� ������ �����������, � � ����������. ��� ��� � �������� ������������ ���������� ������������ ��� ���������� �������� ����������� �������� ������ � ��� ���������� �������, ���������� ������������� ��� ��������� �����. ������� ��� ������� ���������� � ��-���������� ���������� ���������� ����� �������� �����, ������� ������ ���������� — ����� ����������.

����������� ���������

����� ���������� �� Freeduino, ���������
����������� ��������� ��� ������ ����� ������� �� ������.

������ ��������� ����������� ���������.

����� ���������� �� Freeduino, ���������
������ ����� ��������� — ���������� ���������� � ��������

� ����� ���������� �� ���������� — ��������������� ���������� ������ ��� �������� � ������������� ���� long ��� ���������� �������� �������� ������. ���������� ����� � �������� �� ��������� 0—5 �������������� ��� �������� 14—19 — ������ � ��� ����� ����������, ��� � ����������� ��������. ������� �������� ������ cycle_delay ����� ��������� �������� ������� ��������, ������� ����� ������� ����������� ����� �������� ��� — long.

����� ���������� �� Freeduino, ���������
������� �������������. ������ �������� �� ������� digitalWrite(var, HIGH) ��������� ������������� ����������, ���������� � ����������, �� ������, ��������������� ���������� var.

����� ���������� �� Freeduino,
        ���������
�������� ���� ��������� loop

���� ����� �����������, ���� �������� ������ start_switch; �������� �� ���������/����������: digitalRead(start_switch)==HIGH.

�������� ������� digitalRead(type_rc_switch)==HIGH ������ ����� ������ ������ — � ��������� ����� ������������� ������� � ��� �������.

������� ���� � �������� ������ ��������� «�������» ��������. ����� �� ��������� — 1 �������. ��� �������������, ������������ ����������� switch1/switch2/switch3 �������� ��� ������� ��������� �����, �������� �������� ����� � �������� �� 0 �� 7. ������������ � ���������� ������������ �� ��������� ��������� ������ 1024 ���� ����������. ��� ����������� ����������� �� �������� ��������� � ≈100 ������ �������� ������������ ������ ����������� ���������� �� 0,1: 0.1*analogRead(potentiometer).

��� ��� � ����� ����� ��� ��������� ���������� ������� �������� (�����), ��� ������� ����� ������������� � ��������� ������ ���� ��������� �������� � �������� — ���������, ���������� � ����� Freeduino �� 13-� �����, ������ ���������� ��������� �������� (� ��������) ����� ���:

for (int i=0; i<cycle_delay; i++)
{
    digitalWrite(ledPin, HIGH); // ������������ ��������� �������
    delay(500); // ���� 0,5 �������
    digitalWrite(ledPin, LOW); // ������������ ��������� ��������
    delay(500); // ���� 0,5 �������
}

����� ��������� ����� ������������� �� ����� ���������� ���� ���� ����� ������ ����������������: /*…*/.

�� ������ ��������� ������� ���� ���������� ��-�������, ��������� � ������ ����� ������. � ���� ���� �������� ��������� ����� ���� ��� ��������� ������������ (��� ����������� �������� — ������ ��-���������� ��� ����� �������) � ������� ����������� �� Freeduino ���������� �� 13-� �����.

����� ����� ������� ������ �������� �������� delay(1000*cycle_delay).

������������ ������

����� ������������ � ������� ������� ��� ���������� �� USB. ����� ������� ����� �������� ����� �������� � ��������� 1—8 ������, ���������� �������������, ��������� ������������ � ��������� � ����������� ��������������. ���� �������� 1—8 ������ �� ����������, ��������� ��� � ������� �������������. ��������� ������������ �������� � ��������� 1/10 �� ������� �������, �������� ������ ������. ������� ����� ������� ����������-���������� �� 13-� ����� � �������� ������������ �������� �� ������ ��������. ����� ������� ����� ��������������� ���� �������� ����������� ���� �������� �������������. ����� �������������� (/*…*/) ����� ���������, ���������� �� ��������� ��������. ����� ����� ���������� ����� �� ����������. ������ ���, ��� ��������� ��������� ��������� �������� ����� ���������� � �������� ������, �� ���� ��� ������������� ����� ����� ������ � ������� �� ������������ �������, �� ���������� ���������.