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

Сильмаллирион
Случилось так, что примерно в одно и то же время у одних знакомых появился фотоаппарат 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 <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>
 
#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 <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>
 
//Leds port:
#define led_port PORTD
#define led_ddr DDRD
#define led_pin 6
#define led_one (1<<led_pin)
#define led_all (1<<led_pin)
 
//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:
Ну и вот вам, бонусом, идея для корпуса кухонных часов. Со стратегическим запасом гречки на черный день.

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

    1. Конечно интереснее. Но совершенно избыточно для такого узкоспециализированного устройства, лично я сомневаюсь, что имея Кэнон я себе куплю ещё и Никон…
      Я считаю, что на такое простое устройство должно уходить как можно меньше времени при разработке, тем более, такой линейный код проще адаптировать под алгоритм своего фотоаппарата.

  1. Клас! И зачем нам буржуйские пульты, когда у нас руки золотые!

    Я вот давно хочу сделать такой пульт для MusikBox-ов, что в кафешках стоят, а то задолбали меншать отдыхать, только алгоритма нет, и пульта родного чтобы алгоритм просканировать пока не достал(

    1. Оригинальный пультик RC-1 для Canon стоит аж 60 евро!
      А в кафэшках нельзя так шалить. Лучше просто попросить хозяев.

  2. Я на tiny13V сделал, использовал один мощный TSAL5100 через транзистор BC517. схему чуть позже выложу, она сразу на печатке реализовывалась.

    1. Чтобы знать, какая из двух кнопок была нажата. Если их оттуда убрать, то при нажатии на любую кнопку сразу на двух выводах PIN_х будет по логическому нулю. А с диодами — только на одном :)

        1. Простите, но это Вы немножко не в тему.
          Данная схема с диодами позволяет не только узнать, какая кнопка нажата, но и также подавать напряжение на всю остальную схему.
          Кнопка ненажата — полнейшая экономия батарейки. Нажали, есть напруга, да ещё и можем определить, какая кнопка нажата.
          Конечно, можно и без диодов, но микрушки и в sleep режиме будет потреблять ток. А я этого хочу избежать. А схема мною не выдумана, она используется во многих многокнопочных пультах.

  3. А есть у кого инфа по кодам для SONY? Для остальных фотикав море кодов, а Соню как прокляли. Слышал я что раньше SONY была тождественна КоникаМинолта, но я брал китайские универсальные шутеры для камер, из трёх три не подошло. Среди фотографов почти нет радиолюбителей, хорошо, что среди радиолюбителей есть фографы.

  4. а hex’а готового для Canon нету? что то AVR Studio отказывается работать, через PonyProg2000 хочу попробовать прошить.

    1. Эта модель — урезанный вариант, он только с двухсекундной задержкой.
      + я уложился примерно в ту же сумму + в своем пульте можно поставить ТААКИЕ светодиоды, чтобы фотографировать из-за угла можно было :)
      В любом случае, выбор всегда за Вами!

  5. делал то же самое год назад, собственно это была первая конструкция после освоения нового ядра, протокол (Сanon) нарыл на каком-то англоязычном сайте. писал на ассме, ибо С/С++ не владею.
    — — —
    IMHO в такие девайсы приятнее запихивать микросхемы в корпусе -20S — места занимает меньше + немного дешевле контроллер.

    есть вопрос из практики — где нарыть светодиоды SFH415-U ? то, что продается на рынке мягко говоря мало пригодно.

    1. Конечно приятнее запихивать то что поменьше, но я запихивал то что было под рукой.
      С проблемами достать такие светодиоды (кстати, и в Литве и в Австрии (магазин конрад) это оказались самые дешевые из 950нм светодиодов) я не сталкивался. Можете спросить на форуме + там уже есть списки хороших мест по городам, думаю, найдете!

  6. Maksoff, никак не пойму — зачем 2 светодиода?
    Для увеличения «яркости», типа чтобы и от стен отражалось?

      1. Блин, ведь тем не менее, телевизионные пульты работают на 1 светодиоде и прекрасно отражается сигнал от стен! Впрочем, у них батареи другие… Может пальчиковые батареи способны отдавать ток лучше, чем литиевые таблетки?

        1. Всё зависит от светодиода. В любом случае, у меня была возможность поставить два, тем самым увеличив в два раза яркость, и я решил этим воспользоваться.

  7. Сделал данное устройство, работает, но только на расстоянии от фотоаппарата около 1 см, дальше уже не работает.
    Схема для Canon. Только применён другой светодиод, маркировки его не знаю, размером с совковые ал307, но продавец сказал что он на 2,0-2,2 В и 940 нм.Последовательно со светодиодом включил резистор на 10 Ом.
    ВОт его фото.
    http://s45.radikal.ru/i107/1012/0d/a3669b502736.jpg

    Поищу другие сведодиоды, может нормально заработает.

  8. Как дела обстоят с работоспособностью девайся для Canon(схема с переключателем)???
    Не могли бы,люди добрые,скинуть моделирование в Протеусе???

  9. Доброго времени суток Всем! Возникла проблема такого характера: сделал пульт упрвления для фотика Nikon по схеме, предложенной DIHALTом. Заряда батареи хватаем всего на пару дней. Ставил уже конденсатор танталовый на 100 мкФ вместо 4,7 мкФ. Разрядился также быстро. Помогите разобраться, в чем может быть косяк?

  10. пробовал на atmega8L с двумя кнопками на диодах не получается — слишком мало напруги. поначалу работала, а потом батарейка подсела и все

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha