Как-то недавно мне понадобилось дистанционно управлять затвором зеркалки. Проводной вариант был отброшен, неудобно. Поискав по магазинам, нашел пульт ML-L3. Но отдавать за него тысячу рублей не хотелось, тем более что выполняемая функция на первый взгляд элементарная. Решил сделать сам. А тут, кстати, подоспели выходные и работа закипела…
Теория или как это работает
Вначале была надежда, что в сети можно найти все коды и описание того, как ИК пульт работает. Но в итоге удалось отыскать лишь описание последовательности, которую нужно сгенерировать для срабатывания затвора. Вот рисунок такой посылки для фотоаппаратов Nikon:
Как видно, ничего сложного. Частота заполнения 38,4 кГц.
Для фотоаппаратов Canon последовательность еще проще:
У них частота заполнения – 33 кГц.
Схема, печатная плата и детали
Хотелось не просто повторить пульт, но и снабдить его дополнительным функционалом. В итоге решил добавить таймер для съемки Timelapse видео и возможность управления фотоаппаратами Nikon и Canon. Исходя из имеющихся в запасе деталей, была создана следующая схема:
DD1 – PIC12F629
HL1 – ARL2-5013IRAB-940NM
R1 – 150 Ом
SB1 – Кнопка тактовая FSM4JH
A0 – DIP переключатель DS1040-03RN
C1 – Конденсатор танталовый, 47 мкФ х 10 В, тип B
+ Батарейный отсек BH-624 (1xAAA)
Итоговая стоимость всех деталей – 240 рублей (по ценам на апрель 2015, в не самом дешевом магазине города).
Выбранный микроконтроллер имеет порты ввода-вывода повышенной мощности, что позволяет коммутировать инфракрасный светодиод без дополнительного ключа. Кнопка SB1 генерирует выбранную последовательность. Выключателя питания нет, т.к. микроконтроллер постоянно находится в спящем режиме и потребляет 70 наноампер, «просыпаясь» лишь на время генерации сигнала. Джампер X1 переключает тип фотоаппарата: установлен – Canon, снят – Nikon. Переключатели А0…А2 задают период срабатывания таймера для съемки Timelapse видео:
А2 |
А1 |
А0 |
Период |
0 |
0 |
0 |
нет |
0 |
0 |
1 |
2 секунды |
0 |
1 |
0 |
4 секунды |
0 |
1 |
1 |
8 секунд |
1 |
0 |
0 |
15 секунд |
1 |
0 |
1 |
30 секунд |
1 |
1 |
0 |
1 минута |
1 |
1 |
1 |
2 минуты |
Спроектированная печатная плата, также как и схема, очень проста:
Изготовленная печатная плата стандартным методом ЛУТ и собранная:
Исходный код микроконтроллера
errorlevel 0,-207,-205,-302,-203
#include <P12F629.INC>
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
LED equ 5; ИК-светодиод
CFG equ 4; Nikon (1) / Canon (0)
;===============================================================================
; Переменные
;===============================================================================
CBLOCK 0x020
DEL
DEL_MS
IMP
COUNT
ENDC
;===============================================================================
; Сброс
;===============================================================================
ORG 0
GOTO START
;===============================================================================
; Прерывания
;===============================================================================
ORG 4
RETFIE
;===============================================================================
; Подпрограммы
;===============================================================================
; Подпрограмма задержки (в микросекундах, 770 мкс max)
;(Перед вызовом поместить величину задержки в W)
DEL_MK MOVWF DEL
M1 DECFSZ DEL, F
GOTO M1
RETLW 0
; Подпрограмма задержки (в миллисекундах, 256 мс max)
;(Перед вызовом поместить величину задержки в W)
DEL_M MOVWF DEL_MS
MOVLW 0xA5
M2 CALL DEL_MK
CALL DEL_MK
DECFSZ DEL_MS, F
GOTO M2
RETLW 0
; Подпрограмма вывода импульса для Nikon (заполнение 38,4 кГц)
;(Перед вызовом поместить длительность импульса в W)
NIK MOVWF IMP
M3 BCF GPIO, LED
MOVLW 0x02
CALL DEL_MK
NOP
BSF GPIO, LED
MOVLW 0x01
CALL DEL_MK
NOP
DECFSZ IMP, F
GOTO M3
RETLW 0
; Подпрограмма вывода сигнала для Nikon
NIKON MOVLW 0x4D
CALL NIK; импульс 2 мс
MOVLW 0x12
CALL DEL_M; пауза 27,8 мс
MOVLW 0x47
CALL DEL_MK
MOVLW 0x0F
CALL NIK; импульс 0,4 мс
MOVLW 0x01
CALL DEL_M; пауза 1,6 мс
MOVLW 0x69
CALL DEL_MK
MOVLW 0x0F
CALL NIK; импульс 0,4 мс
MOVLW 0x02
CALL DEL_M; пауза 3,6 мс
MOVLW 0xFF
CALL DEL_MK
MOVLW 0x0F
CALL NIK; импульс 0,4 мс
RETLW 0
; Подпрограмма вывода импульса для Canon (заполнение 33 кГц)
;(Перед вызовом поместить длительность импульса в W)
CAN MOVWF IMP
M4 BCF GPIO, LED
MOVLW 0x02
CALL DEL_MK
NOP
NOP
NOP
BSF GPIO, LED
MOVLW 0x01
CALL DEL_MK
NOP
NOP
NOP
DECFSZ IMP, F
GOTO M3
RETLW 0
; Подпрограмма вывода сигнала для Canon
CANON MOVLW 0x13
CALL CAN; импульс 0,5 мс
MOVLW 0x05
CALL DEL_M; пауза 7,3 мс
MOVLW 0x13
CALL CAN; импульс 0,5 мс
RETLW 0
; Подпрограмма задержки на 1 секунду 0xA1
DEL_1S MOVLW 0xFF
CALL DEL_M
MOVLW 0xFF
CALL DEL_M
MOVLW 0x88
CALL DEL_M
RETLW 0
;===============================================================================
; Основная программа
;===============================================================================
START BCF STATUS, RP0; Выбран банк 0
MOVLW B'00000000'
MOVWF INTCON
MOVLW B'00000111'
MOVWF CMCON; Отключаем встроенные компараторы
BSF STATUS, RP0; Выбран банк 1
MOVLW B'00000111'
MOVWF OPTION_REG
CALL 3FFh; Загрузить константу калибровки генератора
MOVWF OSCCAL
MOVLW B'00011111'; Порты (направление)
MOVWF TRISIO
MOVLW B'00010111'; Подтягивающие резисторы
MOVWF WPU
BCF STATUS, RP0; Выбран банк 0
MOVLW B'00100000'; Порты
MOVWF GPIO
;--------------------------
MOVLW 0x12
CALL DEL_M
LP1 BTFSS GPIO, CFG
CALL CANON
BTFSS GPIO, CFG
GOTO LP2
CALL NIKON
LP2 MOVF GPIO, W; Считать состояние перемычек
ANDLW B'00000111'
ADDLW B'11111000'
MOVWF COUNT
COMF COUNT, F
BTFSC STATUS, Z; Выключение, если нет
SLEEP
MOVF COUNT, W
XORLW 0x01; Включен 1 тайминг
BTFSC STATUS, Z
GOTO SET2
MOVF COUNT, W
XORLW 0x02; Включен 2 тайминг
BTFSC STATUS, Z
GOTO SET4
MOVF COUNT, W
XORLW 0x03; Включен 3 тайминг
BTFSC STATUS, Z
GOTO SET8
MOVF COUNT, W
XORLW 0x04; Включен 4 тайминг
BTFSC STATUS, Z
GOTO SET15
MOVF COUNT, W
XORLW 0x05; Включен 5 тайминг
BTFSC STATUS, Z
GOTO SET30
MOVF COUNT, W
XORLW 0x06; Включен 6 тайминг
BTFSC STATUS, Z
GOTO SET1M
GOTO SET2M; Включен 7 тайминг
SET2 MOVLW 0x02
GOTO TIME
SET4 MOVLW 0x04
GOTO TIME
SET8 MOVLW 0x08
GOTO TIME
SET15 MOVLW 0x0F
GOTO TIME
SET30 MOVLW 0x1E
GOTO TIME
SET1M MOVLW 0x3C
GOTO TIME
SET2M MOVLW 0x78
GOTO TIME
TIME MOVWF COUNT
LP3 CALL DEL_1S
DECFSZ COUNT, F
GOTO LP3
GOTO LP1
END
Проектирование корпуса
Современные технологии 3D печати решили давнюю проблему самоделок – на смену корявым и нелицеприятным корпусам пришли качественно выглядящие конструкции, ничем не уступающие промышленным образцам.
Корпус этого пульта разработан в SolidWorks, с расчетом последующей печати на 3D принтере. Выполнен он в лучших традициях китайского проектирования – ни одного винта, все на защелках.
Получившиеся габариты в большей степени обусловлены выбором источника питания. После непродолжительных раздумий было решено не использовать традиционный в подобных случаях литиевый элемент. Ибо режим Timelapse с постоянной генерацией посылки способен разрядить слабенький элемент довольно быстро. Поэтому используются 2 батарейки типа ААА.
Распечатанный на 3D принтере корпус:
Схему, печатную плату, исходный код и файлы для печати корпуса можно скачать
отсюда.
Сборка
Перед началом сборки необходимо аккуратно отрезать ножом от держателей батареек плоские части с контактами:
Получившиеся контакты приклеить к корпусу, соблюдая полярность:
Затем поместить кнопку и вставить плату до упора, проследив, чтобы она зафиксировалась защелками. Осталось подпаять провода от батареек к плате и устройство готово:
Вот так выглядит собранный ИК пульт ДУ:
Настройка фотоаппарата
Перед использованием пульта нужно выполнить несложную настройку фотоаппарата для управления им через ИК пульт. Для каждой модели он разный, привожу алгоритм для своего Nikon D7000: 1) повернуть левое кольцо на иконку пульта, как на фото слева 2) настроить в меню «режим пульта дистанционного управления» необходимое срабатывание.