Пульт дистанционного управления для цифровых зеркальных камер
Некоторые модели цифровых фотокамер имеют возможность дистанционного управления с помощью ИК-лучей. Дистанционное управление требуется в основном для съемки со штатива, когда вибрации камеры недопустимы. Еще его можно использовать взамен сэлф-таймера. В любом случае, дистанционное управление лишним не будет. Пульт дистанционного управления не так сложно изготовить самостоятельно. Описанный ниже пульт работает с зеркальными цифровыми камерами Nikon D40, D50, D70, D70s, D80, Canon EOS 300D, 350D, 400D и Pentax *ist D/Ds/Dl/Ds2.
Если камера имеет возможность дистанционного управления, то где-то есть и пульт, которым можно это делать. Действительно, существует фирменный пульт дистанционного управления ML-L3 для камер Nikon, пульты RC-1 или RC-5 для камер Canon, пульты Pentax Remote Control F и E для камер Pentax. Купить готовый пульт не составляет труда, да и стоит он не так уж много. Но все равно, покупать готовые вещи, которые легко можно сделать самому, по крайней мере, неспортивно.

Remotes

Рис.1. Пульты ДУ: Nikon ML-L3, Canon RC-5, Canon RC-1 и Pentax F.


Для того, чтобы сделать пульт самостоятельно, как минимум, нужно знать формат ИК-посылки. Естественно, фирма-производитель его не публикует. Однако поиск в сети Интернет очень скоро привел к желаемому результату: на сайте http://www.bigmike.it/ircontrol/main-old.html нашлось описание кода для камер Nikon, который был снят с помощью цифрового запоминающего осциллографа. Изучение вопроса показало, что это, похоже, единственный источник данной информации в сети Интернет. Было найдено много подобных проектов, но все они ссылаются на этот же источник. Вскоре появилось уточненное описание кода http://www.bigmike.it/ircontrol. Весьма интересен ресурс http://sappa.livejournal.com/12318.html и http://sappa.livejournal.com/13006.html, где находится похожий проект с поддержкой фотокамер разных производителей, в том числе и Canon.

Итак, что нам нужно? Нам нужно получить посылку в ИК-диапазоне, промодулированную определенным образом. Для получения ИК-излучения понадобится ИК-светодиод. Для управления этим светодиодом потребуется некий ключ, которым, в свою очередь, будет управлять некая логическая схема. Последовательность импульсов довольно сложная, проще всего ее получить с помощью микроконтроллера. Микроконтроллер должен иметь всего один вход, куда будет подключаться кнопка, и всего один выход, куда будет подключаться светодиод. Поэтому достаточно иметь самый маленький микроконтроллер. Все это дело нужно как-то питать, понадобится некая батарейка.

Конструирование любого электронного устройства целесообразно начинать с корпуса. Корпус – это именно то, что мы будем потом ощущать, осязать, именно это и есть прибор. А электронная начинка снаружи не видна, поэтому она должна быть полностью под властью дизайна. Если не начать с корпуса, то судьба устройства может оказаться такой же, как у большинства радиолюбительских конструкций: работают они замечательно, но внешне представляют собой картонную коробку из-под ботинок, внутри которой находится клубок из проводов и плат.

Поэтому начинаем именно с корпуса. Поскольку предполагается пульт дистанционного управления всего с одной кнопкой, хотелось бы видеть его очень маленьким, в виде брелка. Здесь хотелось бы сделать лирическое отступление. Многие в этом месте захотят уличить меня в безграмотности. Но я никогда не слышал, чтобы кто-то говорил «в виде брелока», хоть это и грамотно. Все говорят «в виде брелка». Процитирую вот этот ресурс: http://slovari.donpac.ru/lang/ru/rls/arc/qaarc2001m06.html. «Слово брелок не членится в русском языке (т.е. не имеет суффиксов и других частей слова, кроме корня), так как оно целиком заимствовано из французского (breloque). Именно его иноязычным происхождением и объясняется отсутствие беглой гласной при склонении. За последние годы слово "брелок" настолько прочно вошло в русский язык, а формы "брелка, брелку" получили такое широкое распространение, что некоторые словари фиксируют их наряду с формами "брелока, брелоку". Согласно "Орфографическому словарю русского языка", 33-е издание, 1998 г. (РАН, Ин-т русского языка им. Виноградова) слово "брелок" склоняется (брелок, брелка и т.д.). Более консервативные издания не рекомендуют употреблять формы "брелка" (см. Орфоэпический словарь русского языка. М.,1988, с. 52)». Но мы же не консервативны?

Самый стандартный подход – купить готовый корпус для брелка. В серии пластмассовых корпусов “Z” для радиоаппаратуры есть такой корпус – Z-16A. Но дизайн этого корпуса нельзя назвать привлекательным.

Z-16A

Рис.2. Корпус Z-16A.


Существуют другие, более красивые корпуса для брелков, но найти их труднее. Проблема с корпусом довольно серьезная. Изготовить корпус полностью вручную можно, но это довольно трудоемко, хотя в данном случае никто не ограничивает полет фантазии. Как всегда, проблема решилась совершенно случайно. Хмурым воскресным утром я отправился в забытый всеми продуктовый магазинчик, расположенный глубоко во дворах. Сразу на входе в магазине есть отдел со скучающей девушкой, где продаются батарейки и всякая мелочь. Вдруг на витрине я увидел некий предмет, который сразу привлек внимание. Это был светодиодный фонарик, выполненный в виде брелка. И что самое удивительное – красивого брелка! Купив этот фонарик стоимостью чуть больше доллара, я шел обратно уже с совсем другими мыслями и с другим настроением.

ERA B22

Рис.3. Светодиодный фонарь-брелок ERA B22.


Первым делом удивила упаковка фонарика. На ней была очень аккуратно выполненная этикетка, гласящая о том, что моя покупка представляет собой ни много ни мало «Светодиодный фонарь-брелок» фирмы «ERA», «Модель B22», «Произведено для БАРТАЙЛ ПРОДАКТС ЛТД Великобритания W1G9JJ, Лондон, Куин Анн Стрит 48, Сделано в КНР». Продуктовый магазин и улица королевы Анны не совсем соответствовали друг другу, но поиск в сети Интернет подтвердил «породистость» этого изделия, фонарик упоминается, например, здесь: http://www.neograd.ru/catalogue/torch/torchbr/item_15667. Качество изготовления и сборки было на удивление хорошее, да и свои функции фонарь выполнял замечательно. Но мне от него было нужно не это, интересовал исключительно корпус. Свободного места внутри было не так уж много, но по предварительным оценкам нужная схема должна уместиться.

ERA B22 Disassembled

Рис.4. Разобранный корпус брелка.

Печатная плата замечательно разместится в нижней половинке корпуса, если ее доработать. Значит – дорабатываем! Доработка заключается в удалении всех выступов с нижней половинки корпуса, за исключением бортиков вокруг места для светодиода. Удаление можно производить с помощью кусачек и скальпеля, но действовать нужно очень аккуратно, так как материал корпуса брелка хрупкий, могут появится трещины. После удаления выступов нижнюю половинку корпуса нужно прогладить скальпелем для удаления следов доработки, которые могут быть видны через полупрозрачный пластик.

Исходя из размеров корпуса, в качестве источника питания выбираем литиевую батарею диаметром 20 мм. Напряжение 3 В, которое обеспечивает эта батарея, достаточно для работы микроконтроллера и для питания ИК-светодиода, на котором падает примерно 1.5 В. Такие батареи распространены, имеют приличную емкость, очень маленький саморазряд, причем доступен целый ряд типоразмеров по высоте. В выбранный корпус умещается батарея CR2025 высотой 2.5 мм. Основные параметры литиевых батарей можно посмотреть здесь: http://www.panasonic.com/industrial/battery/oem/chem/lith/coin1.htm#data.

В качестве микроконтроллера для таких маленьких задач чаще всего применяют PIC микроконтроллеры фирмы Microchip 12-го семейства, например, PIC12C508. Однако у меня больше симпатий к более современным микроконтроллерам семейства AVR фирмы Atmel. От микроконтроллера требуется следующее: минимальные габариты корпуса, встроенный RC-генератор (чтобы не нужно было устанавливать внешний кварц) и возможность перехода в режим power down с низким потреблением энергии. Последнее нужно пояснить особо. От пульта требуется по нажатию кнопки передать фиксированную ИК-последовательность. Сразу напрашивается очевидное решение – кнопка должна подавать питание на схему, а микроконтроллер после сброса должен сформировать нужную последовательность импульсов, затем выключить светодиод. Однако такой способ управления имеет серьезные недостатки. Известно, что любые механические переключатели, в том числе кнопки, имеют дребезг контактов. Поэтому питание не будет подано сразу, оно будет многократно прерываться в момент нажатия кнопки. Можно, конечно, сделать паузу на время затухания дребезга, но для пользователя будет неудобным удерживать кнопку длительное время для генерации посылки. А если пользователь отпустит кнопку чуть раньше, во время генерации посылки? Намного лучше кнопкой не подавать питание, а просто сообщать микроконтроллеру, что требуется сгенерировать ИК-посылку. В этом случае микроконтроллер должен быть запитан все время, но находиться в режиме power down. Нажатие кнопки будет вызывать «пробуждение» микроконтроллера и выполнение короткой программы, которая и сформирует посылку. После отпускания кнопки микроконтроллер снова должен «засыпать». Самым подходящим кандидатом из семейства AVR является 8-выводной микроконтроллер ATtiny12L. Можно использовать и простой ATtiny12, он тоже нормально работает при напряжении питания 3 В на частоте внутреннего RC-генератора.

В качестве ИК-светодиода подойдет любой светодиод, который используется в пультах дистанционного управления бытовой аппаратурой. Существует множество разных типов ИК-светодиодов, возникает логичный вопрос, какой светодиод лучше? Как эффективность, так и диаграмма направленности может сильно отличаться от модели к модели. Продавцы светодиодов часто не знают конкретного типа светодиода и его производителя. Для них достаточно того, что светодиод подходит для пультов дистанционного управления. Поэтому остается выбирать методом сравнения дальности работы пульта. Можно дать только одну рекомендацию. Если посмотреть описание распространенных интегральных ИК-приемников, то можно видеть, что все они имеют максимум спектральной чувствительности на длине волны примерно 940 нм. Точно не известно, какой именно фотоприемник установлен в фотокамере, но есть предположение, что максимум чувствительности находится на этой длине волны. В то же время большинство распространенных ИК-светодиодов имеют максимум излучения на длине волны примерно 880 нм. Поэтому по возможности нужно выбирать светодиод с максимумом излучения на длине волны 940 нм. Для выбранного корпуса нужен светодиод диаметром 5 мм, хорошо подойдет Kingbright WP7113F3C.

Для управления ИК-светодиодом обычно используется ключ, в качестве которого может служить биполярный или MOSFET-транзистор. Однако в данном случае большая дальность работы пульта не требуется, ток светодиода может быть относительно небольшим, поэтому на ключе можно сэкономить. У микроконтроллера достаточно высокая нагрузочная способность портов вывода – до 40 мА на каждый вывод, хотя есть дополнительное ограничение – не более 100 мА на вывод земли или питания микроконтроллера. Такой ток вполне достаточен для питания ИК-светодиода. Поскольку даже у 8-выводного микроконтроллера есть как минимум 5 свободных портов, то 4 из них можно включить параллельно и использовать для управления светодиодом, а к 5-му подключить кнопку. Для равномерного распределения тока нагрузки для каждого порта нужен отдельный токоограничивающий резистор. Опыт показывает, что при питании устройства от литиевой батарейки с напряжением 3 В при параллельной работе 4-х портов с резисторами по 33 Ома импульсный ток светодиода составляет 80 мА. Это вполне достаточно и в то же время допустимо для микроконтроллера. Очень удобно вместо 4-х отдельных резисторов применить SMD резисторную сборку. Такие сборки можно найти на неисправных материнских платах (они часто используются на линиях LPT-порта) или на неисправных винчестерах (используются на линиях интерфейса IDE).

Ток потребления схемы носит импульсный характер, поэтому чтобы избежать «просадок» напряжения питания, параллельно батарее нужно установить конденсатор. Необходимая емкость может быть рассчитана исходя из величины импульсного тока светодиода, длительности импульсов и величины допустимых «просадок» напряжения. Теоретически, чем больше емкость, тем лучше. Но на практике емкость нельзя увеличивать сверх меры, так как с увеличением емкости габариты конденсатора растут и он просто не поместится в корпус. Еще нужно учитывать тот факт, что конденсатор все время подключен к батарее и его утечки будут ее разряжать. Поэтому нужно выбирать такой тип конденсатора, который обладает минимальными утечками. В данном случае оптимально использование SMD танталового электролитического конденсатора емкостью 100 – 220 мкФ. Рабочее напряжение конденсатора должно быть не ниже напряжения питания. В данном случае подойдет конденсатор с рабочим напряжением 4 В и выше.

Конструкция начинает прорисовываться, теперь можно приступать к разработке принципиальной схемы, а затем печатной платы. Столь простую конструкцию можно было, конечно, спаять навесным монтажом, нарисовав перед этим схему на каком-нибудь клочке бумаги. Но раз мы уже решили потратить на эту конструкцию самое драгоценное, что есть у человека – его личное время, то заниматься такой ерундой не станем. Принципиальную схему и топологию печатной платы будем рисовать в каком-нибудь программном пакете, специально для этого предназначенном. Я выбрал PCAD 2002, так как я им уже пользовался до этого и он уже установлен на моем компьютере. Для начала нужно создать библиотеку компонентов, которые потребуются для осуществления этой маленькой мечты. Можно, конечно, надергать элементов из готовых чужих библиотек, но созданы они по-разному, в основном как попало, и для осуществления мечты подходят слабо. Поэтому сами аккуратно создаем микроконтроллер, батарею, светодиод, кнопку, электролитический танталовый конденсатор, чип резисторы и конденсаторы в корпусе 0805.

Каждый библиотечный элемент в PCAD состоит из двух частей – символа и паттерна. Символ – это то, что мы видим на принципиальной схеме, а паттерн – это то, что на печатной плате. Символы создаются с помощью утилиты Symbol Editor, паттерны – Pattern Editor, а собираются они в компоненты утилитой Library Executive. Отдельно хочется сказать об эстетике: подавляющее большинство принципиальных схем, нарисованных в PCAD, которые попадались мне на глаза, выглядели совершенно не эстетично. Почему-то при создании символов зачастую не соблюдают никаких пропорций. Тогда и рождаются схемы, где малюсенькие конденсаторы соседствуют с огромными диодами, а сами диоды выглядят неуклюже из-за неправильного угла в стрелке. Красивые PCAD-овские схемы попадаются очень редко, и тогда бросается в глаза схожесть изображений элементов ни с чем иным, а с нашими старыми ГОСТами. Что ни говори, но в их создании принимали участие люди, не обделенные чувством прекрасного.

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

Но не будем вдаваться в тонкости создания компонентов в PCAD, это описано на сайтах и в книгах. Предположим, что библиотека dslr_remote.lib уже готова. Следующий шаг – рисование принципиальной схемы устройства. Для этого воспользуемся программой Schematic из состава PCAD. Окончательная принципиальная схема dslr_remote.sch выглядит в PCAD так:

SCH

Рис.5. Принципиальная схема пульта в PCAD.


Хотя намного приятнее та же схема смотрится после некоторых преобразований. Сначала с помощью драйвера какого-нибудь post-script принтера печатаем из PCAD схему в файл. Затем открываем этот файл с помощью Corel Draw и делаем publish to pdf. Получаем файл sch.pdf.

SCH in PDF

Рис.6. Принципиальная схема пульта в PDF.


В схеме использованы некоторые дополнительные компоненты. Вход сброса микроконтроллера соединен с питанием через резистор R2, чтобы это соединение не мешало программированию микроконтроллера прямо на плате. О программировании будет идти речь ниже. Питание микроконтроллера подается через фильтрующую цепочку R1C2. Эта цепочка не является обязательной, но учитывая тот факт, что потребляемый светодиодом ток весьма значителен и носит импульсный характер, не лишним будет отфильтровать импульсные помехи по питанию. Тем более, что эта цепочка занимает на плате совсем мало места.

Когда схема готова, нужно создать так называемый netlist – список связей, по которому будет разводиться печатная плата. Разводка платы делается в программе PCB из состава PCAD и начинается с рисования контура платы. Корпус брелка имеет довольно сложную форму, повторить которую в PCAD весьма затруднительно. Автоматизируем этот процесс! Берем нижнюю половинку корпуса брелка с уже удаленными лишними выступами и кладем ее на планшетный сканер. Полученное изображение отправляем в Corel Draw, где кривыми чертим контур будущей платы.

Contour in Corel Draw

Рис.7. Контур платы в Corel Draw.


Теперь можно удалить растровый рисунок, а векторный контур платы сохранить в формате DXF и затем импортировать в PCAD. Но не все так просто. PCAD понимает лишь старые версии DXF, не новее версии R12. Нарисованный вручную контур платы содержит сплайны, которые представляются в этой версии DXF как набор маленьких отрезочков. Для того, чтобы контур платы перевести в нормальный вид, его нужно перерисовать, но только с помощью дуг и отрезков. В Corel Draw это если и возможно, то очень неудобно. Открываем полученный DXF программой AutoCAD. Вот тут настоящий праздник для души и тела! Все настолько удобно, что диву даешься, почему аналогичные инструменты отсутствуют в том же Corel Draw, не говоря уже о PCAD. Хотя бы полноценный Object Snap. Используя инструменты рисования линий и рисования дуг по трем точкам, наносим новый контур платы поверх старого. Старый удаляем, получаем файл brd.dwg. Сохраняем его в формате DXF R12 как brd_r12.dxf. Теперь этот файл нормально импортируется в PCAD как набор отрезков и дуг. Итак, контур платы у нас есть.

Загружаем netlist, появляется кучка компонентов, связи между которыми показаны прямыми линиями.

Следующий этап – размещение компонентов на печатной плате. Это самая ответственная работа. Размещать элементы нужно с учетом конструкции корпуса, например, микропереключатель должен быть там, где в корпусе находится пластмассовая кнопка, светодиод должен точно попадать на свое место, а батарейка умещаться по высоте между стенками корпуса. К тому же, связи между элементами при размещении не должны запутываться, иначе развести такую плату, особенно в одном слое, будет невозможно. Итак, проявив чуть ли не способности шахматистов, мы разместили элементы.

Теперь достаточно заменить связи печатными проводниками, которые рисуем вручную. И вот рисунок печатной платы dslr_remote.pcb готов.

PCB, Contour and Netlist

Рис.8. Печатная плата в PCAD после импорта контура и загрузки нэтлиста.

PCB, Place    PCB, Final

Рис.9. Печатная плата в PCAD после размещения элементов и после разводки.

Следующий этап – изготовление платы. Можно, конечно, заказать изготовление платы на производстве. Но тогда теряется смысл всего содеянного. Поэтому делаем плату сами. На помощь приходит лазерно-утюжная технология. Сначала вырезаем заготовку из одностороннего фольгированного стеклотекстолита толщиной 1.5 мм. Размеры заготовки должны быть больше размера платы хотя бы на 5 мм с каждой стороны. Плату со стороны фольги необходимо зачистить наждачной бумагой и не касаться поверхности фольги руками. Затем берем какой-нибудь рекламный буклет, отпечатанный на глянцевой бумаге. Ходят слухи, что лучше всего подходят страницы журнала «Stereo & Video». Возможно, именно поэтому у него такой тираж:) Но я использовал страницы какого-то бесплатного рекламного издания. Заряжаем страницу с рекламой в лазерный принтер, в моем случае это был HP LaserJet 1200, и печатаем зеркальное изображение печатных проводников, контактных площадок и контура платы в масштабе 1:1. Хотя так и тянет отпечатать не зеркально, что я по ошибке и сделал в первый раз. Можно печатать прямо из PCAD, а для тех, у кого его нет, имеется готовое изображение платы в файле plt.pdf, которое можно распечатать из Acrobat Reader. Стоит только помнить, что при печати нужно установить масштаб 100%.

Следующее средство производства, которое нам понадобится, это утюг. Весьма универсальное и востребованное средство, надо сказать. Нагреваем его довольно сильно. Прикладываем распечатку платы тонером к фольге и тщательно проглаживаем утюгом. Прогревать нужно сильно. Признаком окончания процесса является проявление рисунка печатных проводников сквозь бумагу. На этом утюжку можно закончить, а плату – остудить. Затем следует очень ответственная операция – отделение бумаги. Отделять нужно очень аккуратно, чтобы тонер остался на плате. Если бумага подобрана правильно, то она довольно легко отрывается, а на тонере остается лишь ее тонкий слой, то, что ранее составляло собственно «глянец». Остатки бумаги с платы необходимо удалить пальцами под струей воды. Иногда полезно некоторое время плату «отмочить». Если тонер на рисунке проводников нигде не отвалился, плату можно травить. Иначе придется повторить процесс сначала, возможно, взяв новый вид бумаги и подобрав температуру утюга. Изображение печатных проводников на заготовке платы можно ретушировать: слившиеся проводники можно разъединить процарапыванием тонера с помощью скальпеля или иголки, а те места, где тонер отвалился, можно закрасить нитролаком. Существует множество вариаций лазерно-утюжной технологии, но это отдельная большая тема. Много информации по этому вопросу можно найти в сети Интернет.

Травление платы проще всего производить в водном растворе хлорного железа. Это недорогой и распространенный реактив. Хотя есть и более эффективные способы, например, травление с помощью соляной кислоты и перекиси водорода. Но это довольно «злая» химия, лучше дома этим не заниматься. Для повышения эффективности травления раствор хлорного железа желательно подогреть, а во время травления плату желательно шевелить.

Итак, плата вытравлена. Теперь тонер можно удалить. Сделать это проще всего с помощью водостойкой наждачной бумаги под струей воды.

Board after etching

Рис.10. Печатная плата после травления.


Затем плату нужно обрезать по контуру, который тоже вытравился в виде тонкой линии из фольги. Вначале заготовку грубо обрезаем ножовкой по металлу. Не следует для резки стеклотекстолита использовать ножницы по металлу, так как они деформируют заготовку и расслаивают материал. Затем производим точную обработку плоским и круглым напильниками. Это совсем не сложная, хотя и неприятная операция, в основном из-за стеклотекстолитовой пыли и шума. Для успеха операции напильники должны быть достаточно острыми. Обработка напильником по точности может сравниться с фрезеровкой контура в заводских условиях, если делать ее любя и аккуратно. При обработке плату нужно периодически примерять к нижней части корпуса. Как только плата начнет входить, обработку можно считать законченной. Далее обычно следует сверление, но данная плата является счастливым исключением – она не содержит ни одного компонента со штыревыми выводами и поэтому не имеет ни одного отверстия.

Следующий этап – лужение платы. Перед лужением фольгу нужно зачистить «нулевкой» и покрыть жидким флюсом – раствором канифоли в этиловом спирту. После лужения можно выполнить монтаж платы по сборочному чертежу view.pdf. Светодиод следует устанавливать на плату, когда она вложена в нижнюю половинку корпуса, чтобы он точно попал на свое место. Держатель батареи – самодельный, так как готовый по габаритам в корпус не входит. Минусовым контактом держателя является круглая площадка на печатной плате, а плюсовый контакт изготавливается из латуни или белой жести в виде П-образной пластинки, которая припаивается к двум контактным площадкам, расположенным по обе стороны батареи. При изготовлении и пайке нужно примерять пластинку так, чтобы батарея входила под нее с некоторым трением. При сборке платы есть одна тонкость – устанавливать резисторную сборку RN1 не нужно. Сделать это следует только после программирования микроконтроллера.

PCB in PDF

Рис.11. Сборочный чертеж платы.


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

Case Middle Part

Рис.12. Доработанная средняя часть корпуса.


Самой сложной доработкой корпуса брелка явилось крепление кнопки. Она должна быть подпружинена и крепиться на верхней или средней части корпуса. Верхняя часть полупрозрачная, поэтому клеить держатель кнопки к ней некрасиво. Было принято решение крепить кнопку на средней части корпуса. Для этого понадобилась пружинящая пластинка из тонкого полистирола. В качестве материала для пластинки был использован корпус от 3.5-дюймовой дискеты. Отрадно, что даже сегодня им можно найти какое-то применение! Из стенки корпуса дискеты вырезается пластинка, затем ее надо срезать по толщине на большом плоском напильнике до получения желаемой упругости. Тонкий листовой полистирол можно «добыть» еще из крышек всяческих баночек для пищевых продуктов. Но тут можно наткнуться на полиэтилен или что-то еще, что склеить практически невозможно.

Кроме упругой пластинки нужны две небольшие подставочки из полистирола, к которым эта пластинка будет приклеена. Для склейки полистирола можно использовать бензол, толуол, дихлорэтан, тетрагидрофуран или готовый клей для пластмассы, например, «Протакрил-М» на основе дихлорэтана. Я использовал тетрагидрофуран как наименее токсичный из всех приведенных растворителей. Пластмассу, которая используется для изготовления деталей, нужно вначале проверить на предмет того, растворяется ли она имеющимся растворителем. Если она не растворяется, то надежно склеить ее не будет никакой возможности.

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

Push Button Holder

Рис.13. Крепление кнопки.


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

Вот и все, hard закончен, теперь начинается чистый soft. Последовательность импульсов, которую надо получить, мы знаем, осталось только реализовать ее в виде программы для микроконтроллера. Для камер Nikon последовательность должна иметь следующий вид:
  • импульс длительностью 2000 мкс
  • пауза 27830 мкс
  • импульс 390 мкс
  • пауза 1580 мкс
  • импульс 410 мкс
  • пауза 3580 мкс
  • импульс 400 мкс
  • пауза 63200 мкс
  • затем вся посылка повторяется еще раз
Каждый импульс модулирован, т.е. представляет собой «пачку» импульсов с частотой повторения 38.4 КГц. Значения временных интервалов у меня вызывают некоторые сомнения из-за их «кривизны», но все работает, ну и ладно. Понятно, что абсолютно точно выдерживать временные интервалы не нужно, всегда есть какой-то допустимый разброс. Но в данном случае он неизвестен, и тратить время на ненужные эксперименты желания нет.

Для камер Canon последовательность проста до безобразия:
  • импульс длительностью 480 мкс
  • пауза 7324 мкс
  • импульс 480 мкс
Частота модуляции – 33 КГц.

Для камер Pentax последовательность выглядит так:
  • импульс длительностью 13000 мкс
  • пауза 3000 мкс
  • импульс 1000 мкс
  • пауза 1000 мкс
  • импульс 1000 мкс
  • пауза 1000 мкс
  • импульс 1000 мкс
  • пауза 1000 мкс
  • импульс 1000 мкс
  • пауза 1000 мкс
  • импульс 1000 мкс
  • пауза 1000 мкс
  • импульс 1000 мкс
  • пауза 1000 мкс
  • импульс 1000 мкс
Частота модуляции – 38 КГц.

Waveforms

Рис.14. ИК-посылки Nikon, Canon и Pentax в одинаковом масштабе.

Чтобы формировать точные значения временных интервалов и частоты заполнения на низкой тактовой частоте, а у ATtiny12 внутренний RC-генератор работает на частоте всего 1.2 МГц, нужен полный контроль над процессором. Поэтому пишем на ассемблере. Тем более, программа очень простая. В качестве среды программирования берем AVR Studio 4, используем транслятор AVR Assembler 2.0 из ее состава. Текст программы довольно короткий, поэтому можно его здесь привести целиком, дополнив комментариями.

Итак, в начале программы включаем файл описания процессора ATtiny12 из стандартного набора AVR Studio:
.include "tn12def.inc"
Переключение между системами сделаем на этапе трансляции программы, так как системы Nikon и Canon одновременно вряд ли понадобятся, учитывая тот факт, что Никонисты и Канонисты представляют два люто враждующих лагеря. Говорят, что эта вражда берет свои истоки в 17-м веке, когда патриарх Никон по инициативе царя провел реформу православной церкви. Эта реформа привела к расколу верующих на последователей Никона (Никонистов) и тех, кто хотел жить по старому канону (Канонистов).

Для выбора конкретной системы нужно просто откомментировать нужную строчку. В данном случае выбрана система Nikon:
#define Nikon			;uncomment to select Nikon
;#define Canon			;uncomment to select Canon
;#define Pentax			;uncomment to select Pentax
Далее потребуются некоторые константы для расчета временных интервалов, сам расчет мы поручим транслятору. Определяем константу тактовой частоты микроконтроллера и константу частоты модуляции ИК-посылок, которая еще и отличается для разных систем:
;Constantes:

.equ FCLK = 1200000		;clock frequency (internal RC) [Hz]

#ifdef Nikon
.equ FMOD = 38400		;modulation frequency [Hz]
#endif

#ifdef Canon
.equ FMOD = 33000		;modulation frequency [Hz]
#endif

#ifdef Pentax
.equ FMOD = 38000		;modulation frequency [Hz]
#endif
Опишем порты микроконтроллера согласно принципиальной схеме. Порт PB1 используется для подключения кнопки, а порты PB0, PB2, PB3, PB4 – для питания ИК-светодиода. Константа DIRB будет использоваться для задания направления портов. В нашем случае PB1 используется на ввод (это вход внешнего прерывания), PB0, PB2, PB3, PB4 – на вывод. Константа PUPB будет использоваться для задания начального состояния портов вывода и для включения/выключения подтягивающих резисторов на портах ввода. В нашем случае светодиод включается логическим нулем, поэтому все порты вывода должны быть установлены после сброса в единицу, на PB1 должен быть включен подтягивающий резистор, так как внешнего резистора на схеме нет. Для одновременного управления всеми выходными линиями удобно использовать маски:
;Ports definition:

.equ LED1 = exp2(PB0)		;IR LED port 1
.equ PBTN = exp2(PB1)		;push button port
.equ LED2 = exp2(PB2)		;IR LED port 2
.equ LED3 = exp2(PB3)		;IR LED port 3
.equ LED4 = exp2(PB4)		;IR LED port 4

.equ LED = LED1 | LED2 | LED3 | LED4

.equ DIRB = LED			;port B direction
.equ PUPB = PBTN | LED		;port B pull-ups/initial values

.equ LED_ON_MASK = PBTN & ~LED	;mask to switsh LED on
.equ LED_OFF_MASK = PBTN | LED	;mask to switsh LED off
Для реализации временных интервалов потребуется функция задержки. Поскольку программа намечается маленькой по объему, можно себе позволить вместо вызова подпрограмм использовать макросы. Каждый раз при использовании макроса его тело будет вставлено в программу, что увеличивает размер кода, зато не тратится время на вызов подпрограммы и на возврат в основную программу. Базовая процедура задержки, написанная в виде макроса, обеспечивает точность задания задержки в один цикл процессора. Величина задержки в циклах задается в виде параметра. Разумеется, есть ограничение снизу: если задано количество циклов меньше 3, задержка выполнится некорректно. Но нам не нужны столь малые задержки.
;Macro: generate delay @0 [Cycles]:

.macro Delay
.if (@0 % 3) > 1
	nop
.endif
.if (@0 % 3) > 0
	nop
.endif
	ldi Cnt,int(@0 / 3)	;1
loop:	dec Cnt			;1
	brne loop		;2(1)
.endm
Передаваемая посылка состоит из модулированных импульсов и пауз между ними. Сначала напишем макрос формирования импульса заданной длительности с модуляцией заданной частотой. Длительность импульса в микросекундах передается в виде параметра. Нужные значения задержек в циклах процессора будут вычислены на этапе трансляции с использованием описанных в начале программы констант. Это позволяет переходить на другую тактовую частоту процессора или другую частоту модуляции просто изменив значение соответствующей константы:
;Macro: generate modulated with FMOD [Hz] IR pulse @0 [uS]:

.equ MCYC = FCLK / FMOD		;modulation period [cycles]
.equ MCYC1 = MCYC / 2		;LED on duration [cycles]
.equ MCYC0 = MCYC - MCYC1	;LED off duration [cycles]

.macro Pulse
	ldi tempL,byte1((@0 * FMOD / 100000 - 5) / 10)
	ldi tempH,byte2((@0 * FMOD / 100000 - 5) / 10)

loop:	ldi temp,LED_ON_MASK	;1
	out PORTB,temp		;1
	Delay(MCYC1 - 2)	;MCYC1 - 2

	ldi temp,LED_OFF_MASK	;1
	out PORTB,temp		;1
	Delay(MCYC0 - 6)	;MCYC0 - 6
	subi tempL,1		;1
	sbci tempH,0		;1
	brcc loop		;2(1)
.endm
Теперь аналогичным образом напишем макрос формирования заданной паузы в микросекундах:
;Macro: generate pause @0 [uS]:

.macro Pause
	ldi tempL,byte1((@0 * FCLK / 20 / 100000 - 5) / 10)
	ldi tempH,byte2((@0 * FCLK / 20 / 100000 - 5) / 10)
loop:	Delay(16)		;16
	subi tempL,1		;1
	sbci tempH,0		;1
	brcc loop		;2(1)
.endm
Все необходимые макросы описаны. В них использовалось несколько регистровых переменных, их тоже нужно описать:
;Global Register Variables:

.def temp	= r16		;temporary register temp
.def tempL	= r17		;temporary register tempL
.def tempH	= r18		;temporary register tempH
.def Cnt	= r19		;temporary register Cnt
Ну вот и все, начинаем саму программу. Общий алгоритм таков: в исходном состоянии процессор должен «спать», т.е. находится в состоянии power down. Это необходимо для минимизации энергопотребления в ждущем режиме. Согласно документации, в режиме power down ATtiny12 потребляет ток меньше 1 мкА, что при емкости батарейки CR2025, равной 165 маЧ, соответствует работе в ждущем режиме около 20 лет! При нажатии кнопки будет происходить внешнее прерывание по низкому уровню, оно «разбудит» процессор, который сформирует нужную ИК-посылку. После этого процессор должен снова «уснуть».

Первым делом расставляем вектора прерываний. У нас будет использоваться вектор сброса, по которому стартует процессор, и вектор внешнего прерывания, которое будет вызываться нажатием кнопки:
.CSEG ;Code segment

;Interrupt vectors:

.org 0
	rjmp Init		;reset vector
.org INT0addr
	reti			;push button interrupt service
Прерывание от кнопки необходимо лишь для того, чтобы «разбудить» процессор. Поэтому обработчик этого прерывания ничего не делает и состоит из одной команды возврата из прерывания.

Далее в памяти программ определяется калибровочная константа для внутреннего RC-генератора. Определить ее можно в любом месте, мы пока опустим описание процесса калибровки и вернемся к нему чуть позже.
OscCV:	.dw 0x21		;internal RC oscillator calibration
				;value. Copy here value from
				;high byte of address 0x0000
				;in the signature address space.
По сбросу процессор переходит на вектор сброса, где стоит команда перехода на метку Init. По этой метке расположен текст начальной инициализации оборудования микроконтроллера. Первым делом калибровочная константа RC-генератора, которую мы бережно сохранили в памяти программ, заносится в специальный регистр OSCCAL, в результате чего частота генератора чуть изменяется и принимает желаемое значение:
;Initialization:

Init:	ldi ZL,byte1(OscCV*2)	;read oscillator calibration value
	ldi ZH,byte2(OscCV*2)
	lpm
	out OSCCAL,r0		;calibrate oscillator
Затем отключаем аналоговый компаратор, чтобы «топливо не жрал»:
	ldi temp,(1<<ACD)	;analog comparator disable
	out ACSR,temp
Затем инициализируем регистры портов ввода-вывода константами, которые подготовили ранее:
	ldi temp,PUPB
	out PORTB,temp		;init PORTB and on/off pullup
	ldi temp,DIRB
	out DDRB,temp		;set PORTB direction
Затем указываем процессору, что по команде sleep нужно переходить в режим power down, настраиваем и разрешаем внешнее прерывание:
	ldi temp,(1<<SE) | (1<<SM) ;sleep - power down, level INT0
	out MCUCR,temp
	ldi temp,(1<<INT0)	;INT0 enable
	out GIMSK,temp
Все, инициализация закончена, дальше идет основная программа в виде бесконечного цикла. Первым делом разрешаем прерывания, чтобы получить возможность пробуждения, и засыпаем:
;Main program:

Main:	sei			;global interupt enable
	sleep			;go to power down
С этого момента процессор находится в режиме power down, кода выключен даже тактовый генератор. Но если нажать кнопку, возникнет внешнее прерывание, которое «разбудит» процессор, и программа начнет выполняться дальше.
Первым делом запрещаем прерывания, чтобы не мешали, и, собственно, делаем ту работу, для которой все это затевалось – формируем ИК-посылку:
	cli			;global interupt disable

#ifdef Nikon
	Pulse(2000)		;generate pattern
	Pause(27830)
	Pulse(390)
	Pause(1580)
	Pulse(410)
	Pause(3580)
	Pulse(400)

	Pause(63200)

	Pulse(2000)
	Pause(27830)
	Pulse(390)
	Pause(1580)
	Pulse(410)
	Pause(3580)
	Pulse(400)
#endif

#ifdef Canon
	Pulse(480)		;generate pattern
	Pause(7324)
	Pulse(480)
#endif

#ifdef Pentax
	Pulse(13000)		;generate pattern
	Pause(3000)
	Pulse(1000)
	Pause(1000)
	Pulse(1000)
	Pause(1000)
	Pulse(1000)
	Pause(1000)
	Pulse(1000)
	Pause(1000)
	Pulse(1000)
	Pause(1000)
	Pulse(1000)
	Pause(1000)
	Pulse(1000)
#endif
Для Nikon, Canon и Pentax посылки выглядят по-разному, поэтому здесь используется условная трансляция. Реально в исполняемый код попадет фрагмент для той системы, которая задана в начале программы с помощью соответствующего #define.

Текст программы, формирующий посылку, выглядит просто и понятно, прямо как на языке высокого уровня, хоть на самом деле это ассемблер. Благодаря готовым макросам очень легко изменять формируемые ИК-последовательности.

После того, как посылка передана, процессор снова должен «уснуть». Однако перед этим нужно дождаться отпускания кнопки. Причем гарантированного отпускания. Иначе дребезг контактов, который обязательно возникнет при отпускании, может снова вызвать прерывание, и посылка будет передана еще раз. Это наблюдалось реально, поэтому пришлось сильно ужесточить контроль отпускания. Для надежного определения отпускания кнопки она опрашивается 100 раз с периодом 1 мс, и если во время опроса будет обнаружено замыкание контактов, опрос начинается сначала:
wait1:	sbis PINB,log2(PBTN)	;wait push button release
	rjmp wait1
	ldi temp,100		;load debounce counter
wait0:	sbis PINB,log2(PBTN)	;check push button state
	rjmp wait1		;restart debounce if changed
	Pause(1000)		;wait 1 mS
	dec temp		;advance counter
	brne wait0
Но вот кнопка окончательно разомкнулась. Теперь можно «засыпать». Для этого просто осуществляем переход на начало основной программы, там уже есть необходимые для этого команды:
	rjmp Main
Вот и вся программа. Теперь ее можно оттранслировать, чтобы получить файл прошивки. Для тех, у кого нечем это сделать, есть готовые файлы прошивки для Nikon, Canon и Pentax. Хотя в готовых прошивках есть одно «но»: там стоит значение калибровочной константы внутреннего RC-генератора для моего экземпляра микроконтроллера. По идее, это значение не сильно отличается от экземпляра к экземпляру микроконтроллера, что я и наблюдал на практике. Пульт, скорее всего, работать будет, но гарантировать ничего не могу. Для желающих сделать калибровку RC-генератора для своего экземпляра микроконтроллера ниже подробно описана эта процедура.

Осталось прошить микроконтроллер. Микроконтроллеры семейства AVR поддерживают внутрисхемное программирование, т.е. программирование прямо в устройстве. Обычно для этого на плате предусматривают специальный разъем. Поскольку наша плата имеет очень маленькие размеры, разъем установить просто негде. С другой стороны, не сильно он и нужен, вряд ли придется часто перешивать микроконтроллер. А чтобы прошить один раз, можно подпаять разъем на проводах. Я использовал 6-контактный разъем. Схема подключения разъема программирования и плата с подпаянным разъемом показана ниже.

ISP Connector Circuit

Рис.15. Схема подключения разъема программирования.

ISP Connector Photo

Рис.16. Плата пульта с разъемом программирования.


Нужно подчеркнуть, что во время программирования резисторная сборка RN1 не должна быть установлена! Она очень низкоомная и будет закорачивать между собой сигналы программирования. Можно порекомендовать на время прошивки и начальных испытаний пульта вместо сборки подпаять проводами один резистор 33 ома со светодиода на вывод PB3 или PB4 микроконтроллера, он не будет мешать программированию, а светодиод работать будет, хоть и на меньшем токе.

Для прошивки микроконтроллера можно воспользоваться любым программатором, который поддерживает ATtiny12, например, AVReAl. Я использовал самодельный программатор, сделанный на основе Atmel Application Note 910, только с моей самодельной версией прошивки avrisp31. Аппаратно он тоже немного отличается от оригинального: вместо AT90S1200 используется AT90S2313 с кварцем 11.0592 МГц, что позволяет получить скорость обмена 115200 бод, еще отличается номинал резистора R101, теперь он 2.2 Ком. Вообще, этот программатор – уникальная вещь с философской точки зрения. Он предназначен для программирования микроконтроллеров семейства AVR, в то же время сам построен на AVR микроконтроллере! Возникает вопрос, а чем запрограммировать этот самый микроконтроллер для программатора? Если у кого-то найдется ответ на этот вопрос, то будет решена одна из важнейших проблем человечества – проблема яйца и курицы. Мне в свое время для решения этой проблемы пришлось спаять знаменитый PonyProg и один раз им воспользоваться.

Во время прошивки микроконтроллера может понадобится запитать его не от батарейки, а от «честных» 5 В. Но это зависит от программатора. Мне пришлось. Первым делом устанавливаем должным образом фуз-биты. В качестве источника тактирования должен быть выбран внутренний RC-генератор, задержку запуска микроконтроллера нужно установить 4.2 мс + 6 циклов генератора. Встроенный монитор питания (BOD) нужно отключить, чтобы снизить потребление. Окно программы AVRProg из состава AVR Studio с нужными установками фуз-битов показано ниже.

Advanced Window

Рис.17. Программирование фуз-битов.


Значение частоты внутреннего RC-генератора может иметь некоторое отклонение от номинального значения 1.2 МГц. Для компенсации этого отклонения служит калибровка RC-генератора. Насколько важна точность тактовой частоты в нашем случае – трудно сказать. Неизвестны допуски на временные интервалы ИК-посылки в декодере камеры. Можно сказать лишь одно – калибровка генератора не помешает, хотя, скорее всего, пульт будет нормально работать и без калибровки.

При производстве микроконтроллера его RC-генератор калибруется. Хотя это слишком громко сказано. На самом деле ATtiny12 имеет RC-генератор версии 1.1, это не очень совершенный генератор. Калибровочная константа хоть и сохраняется при заводской калибровке в адресном пространстве сигнатуры, но она не загружается в регистр OSCCAL автоматически при включении питания. Это нужно делать программно. Действия должны быть такими: считываем программатором значение калибровочного байта, вписываем его в исходный текст программы, транслируем программу, зашиваем ее в микроконтроллер. Само собой, программа должна содержать команду загрузки регистра OSCCAL калибровочным значением. В нашем случае все это имеется. Значение калибровочного байта нужно расположить по метке OscCV в памяти программ, откуда это значение программой будет считано и загружено в регистр OSCCAL.

RC-генератор микроконтроллера на заводе калибруется при напряжении питания 5 В и температуре 25 градусов. Наш пульт питается напряжением 3 В, при этом, если верить типовым зависимостям, частота генератора будет меньше номинальной примерно на 4%. Не знаю, нужно ли, но эту погрешность можно устранить путем изменения калибровочной константы. Сделать это можно с помощью тестовой программы avr_test. Эта программа непрерывно генерирует короткие импульсы на выходах управления светодиодом. Период повторения этих импульсов при тактовой частоте 1.2 МГц равен 1 мс. Вначале в исходный текст тестовой программы нужно вписать заводское значение константы, оттранслировать программу и зашить ее в микроконтроллер. Затем нужно запитать микроконтроллер напряжением 3 В и измерить осциллографом период следования импульсов на выходе. Наверняка он окажется больше 1 мс. Затем следует немного увеличить калибровочную константу, вписать в исходный текст ее новое значение, снова оттранслировать программу и зашить ее в микроконтроллер. Повторять эти манипуляции нужно до тех пор, пока период на выходе не станет равным 1 мс. Добиваться точности лучше 1% нет никакого смысла, на работу это никак не повлияет, а у генератора имеется температурный дрейф, который сведет все усилия на нет. Я подобрал константу со второго раза, изначально она была 0x11, стала 0x21.

Когда калибровочная константа подобрана, ее нужно вписать в исходный текст «рабочей» программы avr_soft, оттранслировать ее и зашить в микроконтроллер. Теперь можно проверить функционирование пульта ДУ. Если все работает, можно отпаять разъем программирования, установить на печатную плату резисторную сборку RN1, отмыть плату от остатков флюса и собрать корпус.

Испытания пульта с камерой Nikon D50 показали, что при работе "прямой наводкой" дальность составляет более 6 м. Этого достаточно практически в любой ситуации. Часто хватает даже отраженного излучения, поэтому не обязательно направлять пульт прямо на фотоприемник камеры.

Board Macro Shot

Рис.18. "Макро" взгляд на монтаж.

Board Photo   

Рис.19. Готовая плата пульта в корпусе.


Remote Controller

Рис.20. А это готовый пульт.


Можно, на всякий случай, измерить потребляемый ток. У меня в ждущем режиме пульт потребляет примерно 0.1 мкА. Измеренный импульсный ток светодиода составляет 80 мА. Во время посылки светодиод включен 2.5% времени (для Nikon), поэтому средний потребляемый ток при передаче посылки составляет 2 мА. Если посылка окончилась, а кнопку продолжают удерживать, то потребление составляет около 700 мкА. Это, конечно, не очень хорошо. Можно было бы сразу после передачи посылки «засыпать», а по отпусканию кнопки «пробуждаться» (используя прерывание по изменению состояния портов), отрабатывать процедуру подавления дребезга и засыпать снова. Но я не стал этого делать, ведь у каждого устройства должна быть возможность дальнейшего усовершенствования.

First Remote Shot

Рис.21. Первый снимок...


Download:
dslr_remote_lib.zip (25 Kb) - архив с библиотекой элементов для PCAD 2002.
dslr_remote_sch.zip (8 Kb) - архив с принципиальной схемой в формате PCAD 2002.
dslr_remote_pcb.zip (8 Kb) - архив с файлом топологии платы в формате PCAD 2002.
sch.pdf (82 Kb) - принципиальная схема в формате pdf.
plt.pdf (15 Kb) - топология платы для LUT в формате pdf.
view.pdf (33 Kb) - сборочный чертеж в формате pdf.
brd_dwg.zip (5 Kb) - контур платы в формате AutoCAD.
brd_r12.zip (2 Kb) - контур платы в формате DXF R12.
avr_soft.zip (10 Kb) - архив с исходным текстом программы микроконтроллера.
avr_test.zip (7 Kb) - архив с исходным текстом тестовой программы для калибровки RC-генератора.
nikon.zip (0.5 Kb) - архив с прошивкой микроконтроллера для Nikon.
canon.zip (0.3 Kb) - архив с прошивкой микроконтроллера для Canon.
pentax.zip (0.5 Kb) - архив с прошивкой микроконтроллера для Pentax.

Ридико Леонид Иванович
e-mail: wubblick@yahoo.com