Пульт для фотосъемки с геометками на базе 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 программа при отключении от ПК не запускается. Это значит, что необходимо переключать и этот переключатель, когда надо скачать данные с пульта.

    Все это проще один раз увидеть:



    Пульт парсит NMEA-сообщения, которые присылает приемник и сохраняет их в формате kml. Записанный файл можно скачать, подключив пульт к компьютеру, а посмотреть содержимое можно в Google Earth:



    А теперь немного подробней о сердце пульта.

    Что такое LinkIt One?


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



    Подробно с техническими характеристиками можно ознакомиться в вики и в Developer's Guide. Я лишь перечислю отличительные особенности:
    1. ARM-процессор, работающий на частоте 260МГц с 16Мб флэша и 4Мб оперативной памяти
    2. Слот для установки SD-карты памяти объемом до 32Гб
    3. Встроенные модули с внешними антеннами: WiFi, Bluetooth, GPS/GLONASS, GSM (на плате есть слот для SIM-карты)
    4. Питание от аккумулятора емкостью 1Ач. Это сделано хорошо: он заряжается от USB, а API позволяет узнать оставшийся заряд
    5. Аудио разъем. Для наушников и микрофона
    6. 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. Для этого потребуется:
    1. Установить Arduino IDE
    2. Скачать SDK для LinkIt One (хоть и написано, что он только для Windows) и установить его с помощью wine. В папке установщик проверяет наличие arduino.exe, ему подойдет пустой файл с таким названием
    3. Написать свою программу и нажать «Проверить»
    4. После этого компилятор выдаст некоторое кол-во ошибок связанных с тем что в некоторых исходниках библиотек из SDK включаются заголовочные файлы в неправильном регистре(под Windows-то регистр не имеет значения)
    5. Подключить LinkIt One в режиме карты памяти к компьютеру
    6. Найти папку MRE на съемном диске и закинуть туда файл прошивки *.vxp. В файле autostart.txt в корне указан путь до прошивки которая будет выполнена.
    7. Перевести плату в режим UART и перезагрузить кнопкой
    8. Смотреть, как выполняется прошивка

    Это все очень не удобно и всерьез разрабатывать что-то в таком режиме не получится. Но для одного проекта на вечер это решение.

    Заключение


    В целом, опыт работы с LinkIt One позитивный. Есть, кончено, шероховатости. Ощущение такое, что работаешь с чем-то слегка недоделанным, как всегда при освоении чего-то нового. Но с другой стороны она действительно может помочь быстро запустить даже относительно сложный проект.

    Файлы для скачивания:

    Шилд для LinkIt One
    3D-модель корпуса
    Пример kml-файла
    Исходный код программы пульта

    Это единственный хаброадаптированный репост статей с моего сайта (1 и 2).
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 3

      0
      Не проще ли было написать приложение для смартфона, где есть уже gpsы всякие, а коннект по ик светодиоду/ проводу наушников/ wifi...?
        0
        Так и делаем.
        0
        Классный пример реализации проекта — от идеи, до воплощения. Спасибо за подробный рассказ

        Only users with full accounts can post comments. Log in, please.