Пульт для фотосъемки с геометками на базе LinkIt One
Волей судьбы мне в руки попался образец достаточно интересной платы LinkIt One от Mediatek. Это одноплатный компьютер с впечатляющим набором периферии подготовленный для использования в проектах, связанных с носимыми устройствами и IoT.Для того, чтобы получить «боевой» опыт работы с этим контроллером мы разработали несложный пульт, который подключается к зеркальной фотокамере, делает снимки и записывает координаты точки съемки.
В этой статье я расскажу о получившемся устройстве и поделюсь нашими впечатлениями от работы с LinkIt One.
Идея создания пультаВсе знают, что в EXIF фотографии можно добавить геометку с координатами места снимка. Этим сейчас никого не удивишь. Любой смартфон легко справляется с этой задачей. С другой стороны не у каждой (даже профессиональной) камеры есть эта опция. Понятно, что смартфон располагает всем, что нужно для определения геолокации, а фотоаппарату для этого необходим как минимум дополнительный GPS-модуль. Да и у профессиональных фотографов редко возникает нужда в этом. Но что делать, если все-таки надо снимать много и знать где сделаны снимки? Для этого мы и сделали наш пульт. Он подключается к стандартному разъему фотокамеры, который специально предусмотрен для этих целей. Пользователь нажимает на кнопку, пульт замыкает оптопару для съемки и записывает время и координаты. Если время на камере выставлено правильно, то никакого труда не составит сопоставить снимки с координатами.
Но на практике гораздо проще установить на смартфон приложение, записывающее GPS-трэк непрерывно во время съемки, а затем сделать все то же самое, что и с пультом. Зачем тогда делать отдельное устройство?
На самом деле, главная цель проекта даже не сам пульт, а получение реального опыта работы с платой LinkIt One, к которой мы вернемся чуть позже.
Аппаратная часть пульта для фотосъемки Основой пульта является плата LinkIt One, для которой я сделал специальный шилд для фотосъемки.С аппаратной точки зрения, пульты для фотографирования устроены предельно просто. Они подключаются к камере разъемом типа jack, диаметром 2,5 мм. В нем три контакта — земля, половинное нажатие и полное нажатие. В самом пульте стоит простая кнопка которая замыкает сигнальные контакты с землей. Поэтому на нашем шилде для фотосъемки в первую очередь стоит двухканальная оптопара PVT322. Она и замыкает эти контакты.Во-вторых, я установил трехцветный светодиод, который позволяет понять, в каком состоянии приемник. То есть при старте ему нужно время, пока он не найдет спутники и в это время съемка невозможна. По тому же светодиоду определяется уровень заряда.
Также на шилде установлены две кнопки для управления пультом (съемка и контроль батареи), разъем для подключения фотоаппарата и GPS-антенна из комплекта LinkIt One.
Схема получается предельно простая. Скажу только, что все нагрузки (RGB-светодиод и оптопару) я подключал через логические транзисторы BCR108E6327. Плату щилда прикрепил в конце статьи, на случай, если кто-то захочет повторить устройство.
Корпус для пульта Еще нам незапланированно удалось сделать для него нормальный корпус. Когда я работал над проектом, я познакомился с одним начинающим дизайнером-полиграфистом, который проявлял интерес к 3D-печати и промышленному дизайну. Вот его профиль на складе SketchUp’а. Не долго думая он согласился помочь.Он, как и я обычно, использовал для этого SketchUp, но на своем, гораздо более высоком уровне. Эта программа достаточно простая, но вооруженная плагинами, в руках профессионала она может творить чудеса. Посмотреть на корпус получившегося пульта можно в онлайн-просмотрщике здесь.
Мы, конечно, его распечатали, зачистили, покрасили, cобрали и получили следующее:
С корпусом, кончено, есть проблемы. Дело в том, что дизайнер пришел на помощь позже чем я сделал электронику. Разъем для фотосъемки утоплен в глубь пульта, а тумблеры на самой плате LinkIt One не доступны, когда пульт закрыт. В общем, корпус получился не идеальным, но вполне симпатичным и пригодным к использованию.
Работа пульта Сразу после включения, пульт определяет свое местоположение. В это время индикаторный светодиод мигает красным цветом и съемка невозможна. После того, как позиция становится известна, светодиод начинает мигать зеленым цветом. При нажатии на правую кнопку происходит снимок, в память записываются координаты, а светодиод на это время загорается синим цветом.Вторая кнопка отвечает за аккумулятор. После нажатия на нее на одну секунду зажигается зеленый или красный светодиод. Если зеленый, значит заряд больше 20%, если красный — то меньше.
Есть две проблемы из-за корпуса. Во-первых: к тумблеру включения питания можно подобраться только открыв крышку. Быть может его проще не выключать, но мы не проверяли насколько при этом хватит аккумулятора. Во-вторых: у платы есть переключатель отвечающий за режим работы с компьютером: либо UART, либо Mass Storage. Причем в режиме Mass Storage программа при отключении от ПК не запускается. Это значит, что необходимо переключать и этот переключатель, когда надо скачать данные с пульта.
Все это проще один раз увидеть:
[embedded content]
Пульт парсит NMEA-сообщения, которые присылает приемник и сохраняет их в формате kml. Записанный файл можно скачать, подключив пульт к компьютеру, а посмотреть содержимое можно в Google Earth:
А теперь немного подробней о сердце пульта.
Что такое LinkIt One? На первый взгляд это просто еще один клон Arduino, но когда начинаешь разбираться, то все оказывается намного менее прозаично.
Подробно с техническими характеристиками можно ознакомиться в вики и в Developer’s Guide. Я лишь перечислю отличительные особенности:
ARM-процессор, работающий на частоте 260МГц с 16Мб флэша и 4Мб оперативной памяти Слот для установки SD-карты памяти объемом до 32Гб Встроенные модули с внешними антеннами: WiFi, Bluetooth, GPS/GLONASS, GSM (на плате есть слот для SIM-карты) Питание от аккумулятора емкостью 1Ач. Это сделано хорошо: он заряжается от USB, а API позволяет узнать оставшийся заряд Аудио разъем. Для наушников и микрофона Arduino-совместимость. Об этом чуть подробней ниже На самом деле на плате масса очень приятных мелочей, которые уже реализованы в API. Работа с GSM, GPS, Bluetooth, I2C, SPI, 3xUART, работа MP3 файлами, аккумулятором и т.д. Сама идея платы в том, что на ней уже есть все, что может понадобиться. Но из-за этого LinkIt One не очень удобна в контексте управления каким-либо внешним железом в реальном времени. На ней крутится специализированная RTOS, но тайминги все-равно плавают. Логические уровни GPIO — 3,3В. Три аналоговых входа, два выхода ШИМ (и только к ним можно подключить сервоприводы). То есть по железу есть риск, что она не совместима с некоторыми готовыми решениями.Работа с ней предполагается в Arduino IDE. К ней вам необходимо будет установить дополнительную SDK в которой реализована часть функций языка Processing/Wiring и много специальных функций для LinkIt One. Фактически, все ПО для этой платы разрабатывается на C++. Прямо в среде можно посмотреть много готовых примеров кода. Документации, кончено, пока относительно мало. Я, к примеру, не смог найти ни описания схемы электропитания платы, ни ее габаритных размеров. А еще гугл постоянно выдает при поиске ссылки на LinkedIn.
Купить плату можно на Seeedstudio.com за 79 долларов. Продается плата в симпатичной коробочке с инструкцией, тремя антеннами и аккумулятором.
Фотографии с коробочкой
Еще я проделал небольшой бэнчмарк.Частота мигания светодиодом Я понимаю, что нельзя сделать какие-то выводы ни о железе, ни о софте, по результатам такого теста, но решил проверить с какой частотой будет дергаться нога, если переключать ее функцией digitalWrite без задержки.Автор этого поста проверял, что МК с ардуиновской прошивкой делает это с частотой 210кГц, а запрограммированный нормальными средствами — 1,6МГц. LinkIt One при тех же условиях показал мне 312кГц. Далее я приведу инструкции по быстрому старту под Windows и Linux. Это может показаться интересными только для тех, кто с ней действительно будет работать или планирует этим заняться.Hello World для LinkIt One под Windows Прежде всего необходимо прокачать Arduino IDE для работы с LinkIt One. Производители рекомендуют скачать SDK и последнюю версию Arduino IDE, а затем запустить SDK и указать папку со средой. Но с ходу у меня этого сделать не получилось. Вместо этого я скачал уже развернутую среду для программирования LinkIt One.В верхней части платы есть три переключателя, отвечающие за режим работы платы. Первый переключатель задает способ инициализации в системе (как COM-порт или как USB Mass Storage). Второй задает режим питания: от USB или от аккумулятора. Третий задает подключение к SPI SD-карты или разъема. Прежде чем подключать плату к компьютеру, необходимо установить эти переключатели так, как показано на фотографии:
Затем можно подключать плату к компьютеру. Сразу после подключения в диспетчере устройств появится два неизвестных устройства:
Теперь необходимо установить драйвер. Установщик лежит в папке…\Arduino-LinkIt-ONE-IDE-master\drivers\mtk. Просто запустите InstallDriver.exe и подождите. В диспетчере устройств появится сразу два COM-порта:
На этом вся установка закончена. Я на всякий случай обновили прошивку платы до последней версии. Как это сделать — описано в вики (если коротко, надо просто запустить FirmwareUpdate.exe).
Можно приступить к загрузке примера с миганием светодиода. Запускаем Arduino IDE и выбераем плату LinkIt One:
Теперь выберем COM-порт. Необходимо обязательно указать тот порт, который в диспетчере устройств отображается как Debug Port!
Затем открываем готовый пример Blink и нажимаем кнопку «Загрузить». Если все сделано правильно, то среда выдаст об этом соответствующее сообщение (обратите внимание на процент занятой памяти):
После того, как загрузка закончится, на плате начнет мигать пользовательский светодиод:
Работа с LinkIt One под Linux Mediatek поддерживает работу только под Windows, но при желании можно работать и под Linux. Для этого потребуется: Установить Arduino IDE Скачать SDK для LinkIt One (хоть и написано, что он только для Windows) и установить его с помощью wine. В папке установщик проверяет наличие arduino.exe, ему подойдет пустой файл с таким названием Написать свою программу и нажать «Проверить» После этого компилятор выдаст некоторое кол-во ошибок связанных с тем что в некоторых исходниках библиотек из SDK включаются заголовочные файлы в неправильном регистре (под Windows-то регистр не имеет значения) Подключить LinkIt One в режиме карты памяти к компьютеру Найти папку MRE на съемном диске и закинуть туда файл прошивки *.vxp. В файле autostart.txt в корне указан путь до прошивки которая будет выполнена. Перевести плату в режим UART и перезагрузить кнопкой Смотреть, как выполняется прошивка Это все очень не удобно и всерьез разрабатывать что-то в таком режиме не получится. Но для одного проекта на вечер этот решение.Заключение В целом, опыт работы с LinkIt One позитивный. Есть, кончено, шероховатости. Ощущение такое, что работаешь с чем-то слегка недоделанным, как всегда при освоении чего-то нового. Но с другой стороны она действительно может помочь быстро запустить даже относительно сложный проект.Файлы для скачивания:
Шилд для LinkIt One3D-модель корпусаПример kml-файлаИсходный код программы пульта
Это единственный хаброадаптированный репост статей с моего сайта (1 и 2).