![](https://habrastorage.org/storage/c23329e2/a4b3673a/4c7f5837/c6a61838.png)
А почему бы и нет?
Мне очень нравится конструктор Lego, фотоаппараты и программирование. Я решил совместить три этих своих увлечения и собрать автоматическую плёночную фотокамеру из Lego. Мне хотелось, чтобы камера всё делала сама: от пользователя требовалось лишь вставить плёнку, навести на цель и нажать кнопку.
В этом посте я бы хотел рассказать о том, как я делал автоматическую камеру из Lego, как её программировал и что из этого получилось.
Камера обскура
Я начал с самого начала, с камеры-обскуры. Это основа любого фотоаппарата: через дырочку на плёнку (или сенсор) попадает свет и оставляет там изображение. Я решил сделать дырочку в кусочке фольги. С помощью одного из мини-свёрел я проделал отверстие диаметром где-то 0,3 мм.
![](https://habrastorage.org/storage/28fd9156/e4fe0afe/6fd28809/9cec36b1.png)
Теперь надо было собрать светонепроницаемую камеру, в которой будет находиться плёнка. Мне очень помогли калькуляторы с сайта Mr. Pinhole. Они позволили рассчитать оптимальные размеры камеры. Всё очень просто: при размере дырочки в 0,3 мм, расстояние от дырочки до плёнки должно быть где-то 60мм.
![](https://habrastorage.org/storage/be78e8ea/f190c3f0/99e31f6d/6e903069.png)
Принцип работы очень простой: пользователь вставляет новую кассету с плёнкой, плёнка тут же перематывается на свободную катушку. С каждым новым кадром плёнка наматывается обратно в кассету. Когда все кадры отщёлканы надо лишь достать использованную кассету. Вот пара снимков процесса сборки:
![](https://habrastorage.org/storage/9a896b3a/1dd7987d/c1ac50d0/476bfa1f.png)
![](https://habrastorage.org/storage/af862663/026e1a96/7418f503/22b7fc36.png)
Мне хотелось, чтобы камера-обскура предоставляла три интерфейса: контроль основной катушки (которую пользователь поставил), контроль свободной катушки (куда плёнка отматывается) и управление задвижкой. Это выглядит так:
![](https://habrastorage.org/storage/a8bdf0e4/9394b4b1/bcd70af2/a870bac3.png)
В дальнейшем моторчики модуля автоматизации будут крутить эти три шестерёнки. А пока, мне надо было удостоверится, что камера не пропускает свет. Я потащил свою конструкцию в фотолабораторию. Я решил использовать фотобумагу для поиска световых пробоин. Фотобумага чувствительна к свету: там, где попал свет, появляется чёрное пятно. Я напихал в свою камеру-обскуру фотобумаги, вынес на свет, подождал несколько минут и проявил бумагу. Вся поверхность была покрыта чёрными шрамами. Мне потребовалось несколько часов, чтобы найти все пробоины и замотать их изолентой. Вот что получилось:
![](https://habrastorage.org/storage/6e39b1bb/757c36e9/7fa587a8/0f1cfe78.png)
![](https://habrastorage.org/storage/93855508/874d6c10/a8094e08/4b049573.png)
Камера-обскура была закончена. Честно говоря, очень многие любители сами собирали подобные приспособления. Так что пока я находился на относительно протоптанной тропе. Однако, я не нашел ни одного любительского проекта, который пошел дальше и решил автоматизировать свою камеру.
Автоматизация
Кирпичики Lego были у меня и в детстве. Однако набор Lego Mindstorms я купил лишь недавно. Набор содержит три мотора, пару кнопок, датчик света и программируемый модуль. Всё, что надо для современной камеры.
Модуль автоматизации должен содержать три мотора – два для управления перемоткой и один для контроля задвижки, – кнопку спуска, датчик освещённости и датчик, определяющий, вставлена ли камера-обскура. Последний датчик довольно важен: именно он определяет момент, когда камера только вставлена и надо отматывать плёнку. Должно было получиться что-то такое:
![](https://habrastorage.org/storage/f2ede09d/d3f566aa/1552c344/0d21e951.png)
Постоянно не хватало специфических деталей. На выручку пришел сайт BrickLink. На нём я нашел абсолютно все детали и смог купить их через PayPal. Надо сказать, что цены были очень разумные. Вскоре модуль автоматизации был собран. Камера-обскура аккуратно вставлялась в модуль автоматизации:
![](https://habrastorage.org/storage/dbff37a0/20ff12ea/b447adf4/7d9f1bec.png)
![](https://habrastorage.org/storage/83c888cd/3dccd734/111013ff/b5645730.png)
Железо, точнее, пластмасса была готова. Осталось лишь это дело запрограммировать.
Код
Программируемый модуль (контроллер) управляется операционной системой от Lego. Модуль можно программировать в визуальной среде разработки: таскать кирпичики-операторы, составлять блоки-циклы и т. п. Мне эта гуйня очень не понравилась. Так что, первое, что я сделал – это перепрошил модуль системой Lejos. Программы для неё можно писать на несколько урезанной джаве. То, что надо для нашего приключения.
Я выложил код камеры на http://code.google.com/p/legocamera/.
Программа содержит несколько любопытных фич:
Логика вычисления угла перемотки плёки
Плёнку оказалось перематывать куда сложнее, чем мне казалось сначала. Катушки с плёнкой очень похожи на спираль. То есть, угол на который надо повернуть катушку, чтобы намотать 40мм плёнки зависит от количества уже намотанной плёнки. Чтобы сделать расчёт пришлось использовать уравнение аж второго порядка. Такое не каждый день кодишь. Кому интересно посмотреть – логика в файле FilmTransportUtils.
Вычисление скорости задвижки
И тут ждала западня: сенсор лего возвращает уровень освещённости числом от 0 до 1023. Мне не удалось узнать, как это число соотносится с какими-либо физическими величинами. Так что пришлось строить соответствие методом научного тыка. Я арендовал экспонометр и пошел гулять. Делал замер лего-сенсором, записывал показание, потом делал замер прибором. В результате получилась довольно сносная таблица соответствий. Мне кажется, что её можно уточнить, однако для беты сойдёт. Кому интересно посмотреть – добро пожаловать в ExposureUtils.
Интерфейс пользователя
Мне очень хотелось динамически обновлять информацию о камере: вставлена ли камера-обскура, значение экспонометра, количество кадров, текущую задачу и т. п. Дополнительная нить, немного магии, и, мне кажется, получилось почти как у взрослых:
![]() |
![]() |
![]() |
Результат
Всё было готово. Вот видео с демонстрацией работы камеры:
А вот получившиеся фотографии. Гидрант:
![](https://habrastorage.org/storage/1f49909d/77293087/551899d7/71388770.png)
Сосед переезжает:
![](https://habrastorage.org/storage/5fbf37b7/00faa72a/9a5c88f4/91becc00.png)
Буду снимать на свою камеру и дальше: ведь это так просто, нажал кнопку – и готово!