Главная>Электроника для всех>Пульт дистанционного управления для фотоаппаратов Canon и Nikon

Пульт дистанционного управления для фотоаппаратов Canon и Nikon

Рубрика: Электроника для всехРаздел: Готовые устройства
дата:08-06-2010

Сильмаллирион
Случилось так, что примерно в одно и то же время у одних знакомых появился фотоаппарат Nikon, у другой знакомой - Canon, а в интернете я наткнулся на замечательную статью про пульт ДУ к ним.

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

Братство Кольца
Немного теории, найденной на просторах интернета:
для фотоаппаратов марки Canon собирается пульт RC-1 (RC-5 это такой же пульт, только без “моментального спуска”)

-Несущая частота 33 кГц:
-команда “Спуск”: посылка 480 мкс, пауза 7324 мкс, посылка 480 мкс
-команда “Спуск с 2 сек. задержкой”: посылка 480 мкс, пауза 5371 мкс, посылка 480 мкс

Важно!
Не у всех фотоаппаратов Canon есть ИК приёмник (обычно расположен на ручке, под спусковой кнопкой). Смотрите инструкцию к своему фотоаппарату!

Nikon выбрал себе алгоритм похитрее, но всё равно мы и его скопируем:

-Несущая частота 40 кГц:
-команда “Спуск”: посылка 2250 мкс, пауза 27600 мкс, посылка 650 мкс, пауза 1375 мкс, посылка 575 мкс, пауза 3350 мкс, посылка 650 мкс. Потом пауза в 63 мс (милли- не микро-!!!) и повтор всей последовательности еще один раз


Интернет-народ утверждает, что лучше всего выбирать светодиоды с длиной волны 940 нм, я поверил им на слово.
Самые дешевые светодиоды оказались SFH415-U, на 1.3-1.5 вольта и 100 мА, поэтому была выбрана таблеточная трёхвольтовая батарейка и последовательное соединение светодиодов.
Для тактирования тини2313 я, естественно, использовал внутренний RC осциллятор на 1 Мгц.

Для экономии батарейки питание на микроконтроллер подается только при нажатии на кнопку спуска, после чего пульт отрабатывает посылку и отправляется в sleep (на случай если в сумке что-нибудь надавит на кнопку, батарейка не сдохла до съемки).

Две твердыни
Ну что же, время составить схемку и написать программку.

Схемка для Никона:

не отличается чем-либо особым. Конденсатор С2 выбран танталовым потому, что у него оооочень маленький ток утечки, поэтому батарейке ничего не должно грозить (кстати, этот пульт используется уже в течении года).

Схемка для Кэнона:

Тут уже повеселее. Я решил выбрать переключатель на три позиции, тем самым у меня появилось три “режима”:

  • Выключен, чтобы при случайном нажатии на кнопку не садить батарейку.
  • Спуск с 2сек задержкой - чтобы при фотографировании себя успеть убрать пульт из кадра.
  • Немедленный спуск - отлично использовать для фотоохоты. Или фотографирования ночных пейзажей. Или для режима Bulb.

Естественно, при желании можно выкинуть переключатель, и использовать просто две кнопки, например так:

Или вообще оставить одну только функцию, и взять схемку как для Никона, контроллер ведь один, поэтому прошивка там заливается любая.

Варьируя количество и ток светодиодов можно регулировать и дальнобойность устройства. В данном исполнении фотоаппарат уверенно принимал на расстоянии 5-6 метров, а также хорошо ловил отраженный сигнал. Правда, при увеличении количества светодиодов надо не забыть увеличить емкость танталового конденсатора.

Программа написана на С (для ускорения времени разработки и простоты вычисления задержек)
Код для Никона:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include #include #include   #define led_port PORTD #define led_ddr DDRD #define led_pin (1<<6);   #define nop() asm("nop") //Посылка двух импульсов, количество нопов выверено в симуляторе #define two_pulses {led_port |= led_pin; nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); led_port &= ~led_pin; nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); led_port |= led_pin; nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); led_port &= ~led_pin; nop(); nop(); nop(); nop(); nop(); nop(); } //50 us   //Весь алгоритм передачи команды, ничего сверхъестественного void program (void) { unsigned char i; for (i = 0; i < (2250/50); i++) two_pulses; _delay_ms(27.6); for (i = 0; i < (650/50); i++) two_pulses; _delay_ms(1.35); for (i = 0; i < (600/50); i++) two_pulses; _delay_ms(3.35); for (i = 0; i < (650/50); i++) two_pulses;   _delay_ms(63);   for (i = 0; i < (2250/50); i++) two_pulses; _delay_ms(27.6); for (i = 0; i < (650/50); i++) two_pulses; _delay_ms(1.35); for (i = 0; i < (600/50); i++) two_pulses; _delay_ms(3.35); for (i = 0; i < (650/50); i++) two_pulses; }   int main (void) { MCUCR |= (1<<SM0); //PowerDown ACSR |= (1<<ACD); //AnaComp Disable led_ddr |= led_pin; _delay_ms(8); program(); sleep_enable(); sleep_cpu(); //Усыпляем до следующего включения питания }

А это для Кэнона:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 #include #include #include   //Leds port: #define led_port PORTD #define led_ddr DDRD #define led_pin 6 #define led_one (1< #define led_all (1<   //Delay 2 sec #define pin_delay (1<<0) //PortB pin0 //for delay #define all_button_pins pin_delay   #define nop() asm("nop")   //Функция, которая отправляет одну посылку void Post (char bits_to_set) { unsigned char i; for (i = 0; i < 16; i++) { led_port |= bits_to_set; nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop();   led_port &= ~bits_to_set; nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); //Количество нопов высчитано в симуляторе }   }   //Немедленный спуск void Shutter (char led) { Post(led); _delay_ms(7.324); Post(led); }   //Спуск с двух секундной задержкой void Shutter2 (char led) { Post(led); _delay_ms(5.371); Post(led); }   int main (void) { PORTB |= all_button_pins; //PullUp led_ddr |= led_all; // DDR out MCUCR |= (1<<SM0); //PowerDown ACSR |= (1<<ACD); //AnaComp Disable for(;;) { _delay_ms(8); //Debounce if (PINB&pin_delay)//Проверяем состоние пина { Shutter2(led_one); } else { Shutter(led_one); }   sleep_enable(); sleep_cpu(); //Усыпляем до следующего включения питания } }

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

Возращение государя
Конечно же, самое интересное — это корпус.

Для Никона, с его единственной кнопкой, подошел вот такой:

К сожалению, его внутренностей не могу показать, далеко он от меня…

А вот для Кэнона корпус я делал недавно, поэтому парочка фоток есть :)

Рассыпуха деталек для будущего пульта:

С платой замарачиваться не стал, тем более корпус всего-то 50х30х20 мм, поэтому микрушку и всякие транзюки понапаял на макетку, дрелью да напильником сделал необходимые отверстия, переключатель посадил на клей, распаял паутинку проводов:

Корпус оказался ооочень маленький, так что влезло всё впритык. Прижав коленкой закрутил винтики, и вот что получилось:

Результатом доволен и я, и те кому достался пультик. А на написание этой статьи ушло примерно столько же времени, сколько на изготовление одного пультика :)

Проект в AVR Studio

Если у вас какой-либо другой фотоаппарат, то то в статье от sappa есть алгоритмы и для них. Дерзайте, творческих (в пайке и в фотографии) успехов вам!

Bonus:
Ну и вот вам, бонусом, идея для корпуса кухонных часов. Со стратегическим запасом гречки на черный день.

<<< Предыдущая статья Следующая статья >>>

Материалы раздела Готовые устройства