Timelapse таймер на Arduino

Одним из моих хобби является, как ни банально, фотография. Недавно задумался над созданием таймлапсов. Для создания таймлапсов требуется таймер, на котором можно будет выставлять частоту срабатывания затвора фотоаппарата. В поисках готового и дешевого решения были попытки заказать устройство на ebay, но так как Почта России дважды теряла мой долгожданный таймер, я решил сделать его сам.

Разработка принципиальной схемы

Идея устройства проста: сигнал с потенциометра поступает на АЦП контроллера, тем самым задает интервал выходного сигнала на камеру. Этот интервал будет отображаться на 2 индикаторах, 3-й индикатор будет обозначать нам единицу измерения интервала (секунды или минуты), а также зажигать точку в случае, если значение потенциометра не менялось дольше 1 секунды. Данная индикация нужна была для решения одной проблемы, о которой будет сказано ниже, в конце концов она не оказалось лишней. Так же на устройстве я предусмотрел пару кнопок для ручной подачи сигнала на затвор и фокус.

Управление 7 сегментными индикаторами довольно простое.

Принципиальная схема устройства

Развел плату в Eagle-Cad. Естественно старался все делать на SMD элементах и настолько компактно насколько это позволяет печать на фольге и травление в хлорном железе. В результате вышла плата размером 5х5 см.

В живую.

После этого перевел рисунок на текстолит, вытравил и залудил. Результат:

Попытался впервые нанести маску, но первый блин комом.

Прошивка

После напайки большей части компонентов настала очередь поработать с прошивкой. Во-первых, залить на ATmega8L бутлоадер Arduino NG. Во-вторых, написать код программы. И уже на первом этапе я понял, что задача не так проста, потому что Arduino NG производится на базе ATmega8 и работает с кварцем на 16 МГц, в отличие от ATmega8L, которая работает с кварцем на 8 МГц. Но благо в интернете много информации по этой теме, например бутлоадер, который помогает сделать Аrduino с кварцем на 8 МГц на 8L. Его я и залил через Arduino IDE. Увы загрузчик постоянно слетал после прошивки первого скетча. Эту проблему я так и не смог устранить, поэтому так и приходилось заново его заливать

После этого принялся писать код скетча, но так как мои знания в программировании ограничиваются Паскалем первокурсника и простыми примерами для STM8, то обратился за помощью к коллеге ftp27, который с ярым энтузиазмом решил мне помочь.

Основная проблема состояла в поддержании цикла динамической индикации с одновременным отсчетом таймера для произведения снимка. Благо, в Arduino предусмотрена славная функция mills(), возвращающая кол-во миллисекунд с момента включения устройства. Так как не предусматривалось использование устройства в течении более 1 суток, то эта функция идеально подходила для тайминга.

Данная программа считывает значение с АЦП, проверяет, не изменился ли выбор времени, и если уж он изменился, то производит снимок с новым таймером. Так как значение АЦП довольно таки ощутимо бегает даже если не трогать потенциометр, то было решено брать не более 16 значений времени.

Для пущей экономии было решено выключать индикацию через 10 секунд после последней смены значения потенциометра. Сэкономили 30 мА — мелочь, а приятно.

Все файлы прошивки и схемотехники можно найти здесь.

Сборка устройства

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

До

После

В итоге вышло неплохое устройство себестоимостью 200 р., которое, мать его, работает.

Конечно, можно было пойти по протоптанной тропинке и сделать все на NE 555, но очень уж хотелось индикацию и более удобный выбор времени таймера.

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

А потом я нашел проект Magic Lantern и необходимость внешнего таймера совсем отпала :)