В статьях «Универсальный ИК-пульт для камеры Canon. Часть первая: приемник для дешифровки ИК-сигнала» и «Часть вторая: сигналы и пульты» было описано, как с помощью простейших электронных компонентов и доступных программ расшифровать сигналы ИК-пульта управления фотокамерой и изготовить самодельные пульты из звуковоспроизводящих устройств. Для реализации ИК-управления необходим генератор несущей частоты 32—38 кГц и его модулятор. В качестве излучателя сигнала используется ИК-светодиод.
Диапазон воспроизводимых бытовыми аудиоустройствами частот ограничен сверху значением, меньшим необходимых 32—38 кГц, и только трюк с использованием наложения дорожек стереосигнала в противофазе позволяет обойти это ограничение. А вот микрокомпьютеру Freeduino с тактовой частотой в 16 МГц генерировать сигнал 32 кГц вполне под силу. Микрокомпьютер использовался для управления позиционированием камеры в процессе съемки (Установка для съемки панорам на базе контроллера Freeduino, часть 2: контроллер и программирование в среде Arduino.exe), и функциональность этой установки можно расширить, добавив ей возможность беспроводного управления камерой.
Задача состоит в том, чтобы запрограммировать микрокомпьютер на базе микроконтроллера Freeduino Through-Hole для имитации сигналов пульта управления камерами Canon — Canon RC-1. В статьях, ссылки на которые приведены в самом начале, описаны управляющие сигналы пульта. При обычной съемке без предварительной паузы камера запускается последовательностью импульсов и пауз: «пакет 0,7 мс — пауза 7/7,7 мс — пакет 0,7 мс». Второй режим пульта — съемка с двухсекундной задержкой на стабилизацию камеры. Его структура: «пакет 0,7 мс — пауза 5,1/5,7 мс — пакет 0,7 мс». Несущая частота импульсов в пакете — 32—38 кГц.
Реализовать на Freeduino ИК-управление просто — подключаем к соответствующим сигнальным выходам ИК-светодиод, который программно включаем-выключаем в соответствии со структурой сигнала. Для пакета управляющего импульса длительностью ≈0,7 мc на частоте ≈33 кГц нужно 23 раза включить-выключить светодиод на 15 мкс (период несущей будет 2×15 = 30 мкс). Далее добавить паузу 7,3 мс. И снова повторить 0,7-миллисекундный пакет.
Управляющая программа в Arduino Sketchbook выглядит так:
Программа проста и похожа на «учебную» программу для Arduino — «Blink». Главные отличия — в замене функции миллисекундных пауз delay() на микросекундные delayMicroseconds() и добавление цикла. ИК-светодиод подключается к 12-му порту и массе, для ограничения тока в цепь последовательно диоду добавлен резистор (≈50 Ом). Вид установки приведен на фотографии в начале статьи. Так как цикл генерации сигнала помещен в функцию loop(), он будет выполняться с периодичностью около 3 секунд (задается функцией delay(3000)), пока на Freeduino подается питание. Такое функционирование программы позволит легко отследить запуск камеры, если установка работает. Но при указанных в скетче параметрах ИК-пульт на Freeduino не запускает камеру.
Чтобы разобраться, в чем причина неудачи, воспользуемся описанной в статье «Универсальный ИК-пульт для камеры Canon. Часть первая: приемник для дешифровки ИК-сигнала» установкой для регистрации ИК-сигнала. Вот что покажет Audacity:
Длительность импульса огибающей управляющего пакета — 45 семплов на частоте оцифровки сигнала 44100 Гц, или ≈1 мс вместо требуемых 0,7 мс. Вероятно, ошибка возникает из-за некорректной работы выполняемых подряд функций delayMicroseconds() при небольших значениях аргумента. Для коррекции ошибки можно попробовать поднять частоту или уменьшить период примерно в пропорции ошибки 1/0,7 раза. Внесем изменения. Но прежде, чтобы дважды не исправлять код, проверим, что пауза между пакетами отрабатывается корректно:
Попробуем изменить программу, и для аргумента frec (полупериод несущей) зададим величину 15/(1/0,7) = ≈10 (мкс), а прочие параметры программы оставим без изменений. Формально, при этом частота несущей будет 50 кГц. Но теперь пульт работает и запускает камеру, однако иногда камера «пропускает» сигнал. На следующем этапе отладки я уменьшил число импульсов в управляющем пакете до 19 (параметр puls=20), и ИК-пульт заработал без сбоев. Проверим, что покажет установка, регистрирующая огибающую ИК-сигнала:
Корректный скетч для простого ИК-пульта в ZIP-архиве приложен здесь. Разобравшись с тем, как генерировать сигнал, сделаем настоящий пульт управления с интерфейсом для настройки длительности пауз и с возможностью запускать процесс съемки в любой момент. Конструкция и код будут описаны в следующей статье.