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