Пульт дистанционного управления для фотоаппаратов 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:
Ну и вот вам, бонусом, идея для корпуса кухонных часов. Со стратегическим запасом гречки на черный день.

Запись опубликована в рубрике Готовые устройства с метками , , . Добавьте в закладки постоянную ссылку.

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

  1. Браво.

    Но думаю, почему нельзя было унифицировать прошивку — чтобы она брала систему команд из EEPROM’a? Так ведь интереснее :)

    • Maksoff говорит:

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

  2. Katran_t говорит:

    Часы отменные!!! [img]http://files.myopera.com/Creat0R/Opera_AC/Icons/buba.gif[/img]

  3. BenG говорит:

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

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

  4. Legath говорит:

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

  5. pkfo говорит:

    А зачем диоды там где две кнопки?

    • Maksoff говорит:

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

      • pkfo говорит:

        Убери диоды и включи подтяжку порта, диоды там вообще не в тему

        • Maksoff говорит:

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

  6. Legath говорит:

    обещанная схема в протеусе и прошивка в Codevision, http://slil.ru/29300778

  7. parus говорит:

    [offtop]а компилятор на отсутствие #define F_CPU 1000000UL не ругался?[/offtop]

  8. LEV-PRAV говорит:

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

  9. pvkent говорит:

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

  10. vopros говорит:

    у китайцев за 4$ купить выйдет дешевле.
    http://www.dealextreme.com/details.dx/sku.13090

    • Maksoff говорит:

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

  11. nestandart говорит:

    дык вот же ещё вариант:
    http://www.digit-el.com/files/articles/dslr_rem/dslr_rem.html
    и схема попрощще и разжёванно всё.

  12. d00die говорит:

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

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

    • Maksoff говорит:

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

  13. micos_s говорит:

    А с никоном д60 — работает?

  14. tranzistor говорит:

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

    • Maksoff говорит:

      Именно так. Тем более их напряжение и напряжение батарейки позволяет.

      • tranzistor говорит:

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

        • Maksoff говорит:

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

  15. ioleg73 говорит:

    А, гречка нынче удел богатых.

  16. mcsik говорит:

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

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

  17. Leontiev говорит:

    Сделал вариант для Nikon. Работает, в т.ч. БЕЗ повтора посылки через 63мс. Камера Nikon D5000.

  18. PavLeYka говорит:

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

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