Компания SONY, решив показать себя на рынке экшен камер, выпускает линейку устройств HDR. Поманив клиентов привлекательной начинкой — хорошая матрица, быстрый процессор, цейсовская оптика и электронный стабилизатор изображения при маленьком весе, компания показывает свое «истинное лицо капитализма».

Для управления камерой выпускается пульт с просмотром видео по WiFi. Пульт довольно дорогой и дефицитный — сейчас его можно купить только на различных электронных барахолках.


Но ведь есть WiFi, значит можно управлять с телефона? А вы пробовали кататься на горных лыжах или на вейкборде со смартфоном в руках? Но этого неудобства еще мало:

Компания SONY, совершенно не заботясь о своих клиентах, убирает из Google Play приложение PlayMemories Mobile для управления своими экшен камерами по WiFi с любого мобильного телефона, заменив его на приложение для умных часов. Вместо него выпускает Imaging Edge Mobile — жутко неудобное и постоянно отваливающее от камеры. Та же песня и для приложений по iPhone.

Как обманутый вкладчик пользователь камеры HDR AS100 я решил поискать альтернативное решение и наткнулся на довольно интересный архив — Sony Camera Remote API beta SDK

SDK написан для разработки приложений управления камерами SONY по WiFi с устройств под управлением Android и iOS.

Внутри архива два каталога с примерами для разработки приложения на Java под Android и под iOS. Самое интересное, это PDF документ API references for Camera Remote API beta. Решено — буду делать ДУ пульт своими руками

Что в API твоем?


Во первых, там есть таблица поддерживаемых устройств на февраль 2017.

Исходя из таблицы, API с разной степенью функциональности совместим с практически всеми экшен камерами HDR от AS15 до AS300, камерами FDR, фотоаппаратами серий DSC, ILCE и NEX имеющих WiFi интерфейс.

Далее я буду описывать работу с камерой HDR AS100 с последней прошивкой 2.0.0, подразумевая, что с другими устройствами должна быть совместимость.

Во вторых, протокол управления камерами. Каждое устройство SONY из данного списка представляет собой HTTP сервер, который выполняет запросы, а также выдает отдельные кадры в формате JPEG и потоковое видео.

Моя же цель разработать компактный и максимально дешевый пульт дистанционного управления для камер SONY

Для начала, нужно убедиться, что в меню камеры включен WiFi:

[SETUP] -> [CONFG] -> [Wi-Fi] -> [ON]

Идентификатор и пароль должны быть на отдельной наклейке в инструкции по эксплуатации к камере. Если данная наклейка утеряна, то можно подключить камеру по MicoUSB к компьютеру под управлением Microsoft Windows и включить ее. На экране появится [USB], а на компьютере два сетевых диска — с карточкой памяти, вставленной в камеру и внутренней памятью камеры PMHOME. Нас интересует второй диск

В файле: \\INFO\WIFI_INF.TXT содержится идентификатор и пароль доступа к камере по WiFi, а в файле \\INFO\WPS_PIN.TXT ключевой пин для подключения по WPS. Доступ к информации возможен только на чтение, так что изменить идентификатор, пароль или пин не представляется возможным.

Теперь можно с этими данными подключиться к камере. IP-адрес камеры после подключения — 192.168.122.1. Для управления камерой необходимо послать HTTP POST запросы по адресу 192.168.122.1:10000/sony/camera.

Для разных моделей камер могут быть использованы следующие адреса:

10.0.0.1:10000/camera
10.0.0.1:10000/sony/camera
192.168.122.1:8080/sony/camera
192.168.122.1:10000/sony/camera

В третьих, структуру запроса и ответа. Каждый запрос содержит команду в формате JSON и возвращает ответ также в формате JSON. Полный список команд, а также примеры использования содержатся все в том же PDF файле.

Так же по HTTP протоколу возвращаются готовые файлы со снимками и видеопоток для просмотра с камеры.

Наиболее сложным в протоколе является запрос на выдачу информации. В зависимости от версии запроса (1.0 — 1.3) выдает массив от 34 до 62 параметров в формате JSON, которые тоже в свою очередь могут быть массивами, и имеет два режима работы — с немедленным ответом полной информации по состоянию камеры и с ответом по любому событию на камере (например переключению режима или включению записи)

Первый блин … ЛУТом


В качестве сердца устройства будет пламенный мотор — самый дешевый МК с WiFi — китайский ESP8266. Правда глядя на унылую перерисовку картинки на графическом экране 240?320 по SPI я решил отложить изготовлении копии родного соньковского пульта с предпросмотром видео в реальном времени, а остановился на функционале обычной включалки/выключалки с выбором режима. В качестве дисплея взял 0.91? одноцветный OLED с разрешением 32?128, какой обычно применяется в недорогих фитнес браслетах.

Схема прототипа:



Дизайн платы:





Ну и сама жертва ЛУТа:





Прошивка


Ардуиноненавистникам рекомендую пропустить эту часть, так как прошивку я разрабатывал в Arduino IDE с установленным ESP8266 Core. Для удобства я воспользовался дополнительными библиотеками:


С графическими библиотеками все понятно. Они нужны для работы с OLED дисплеем. WiFiManager — очень удобная библиотечка для настройки подключения WiFi в ESP. В случае входа в режим настроек поднимает на ESP точку доступа и свой минималистичный WEB-сервер, на который переадресует при подключении. Можно запускать в автоматическом режиме, но тогда режим настроек будет запускаться каждый раз, когда нету соединения камерой. Я выбрал вход в режим настроек по длинному нажатию кнопки «BOOT/MODE» и выход по таймауту в 120 сек.

Библиотека WiFiManager удобна еще и тем, что можно добавлять свои поля для настройки (в этом проекте мне не пригодилось), а также обрабатывать события — вход в режим настройки и сохранение параметров настройки.

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

По кнопке «BOOT/MODE» циклически переключаем три основных режима камеры — «VIDEO«, «PHOTO» и «LAPSE». Кнопкой «PLAY/STOP» включаем/отключаем запись в режиме «VIDEO» или «LAPSE» и делает запись одиночного фото в режиме «PHOTO«. При режиме включения записи горит красный светодиод. При записи фото однократно моргает.

Также существует дополнительный вход на GPIO14, который по сути дублирует кнопку «PLAY/STOP«. Этот вход нужен для подключения внешнего триггера, которым можно синхронизировать съемку фото для таймлапс снимков с внешним событием. Этот вход я планирую для подключения к 3D принтеру и съемке таймлапс видео печати деталей.

Из дополнительных функций, программа периодически мерит значения входа ADC, куда подключен делитель напрямую от батареи питания, и выдает значком состояние батареи. Программа откалибрована на делители R12=1.6К и R11=10К и литиевую батарею.

К сожалению AS100 не поддерживает выдачу в JSON времени записи и количество снимков в режиме таймлапс. В скетчи эти параметры записываются в переменные, если кто то будет повторять, то на других камерах их также можно выводить на дисплей.

«Промышленный» образец


Последнее время обленился пристрастился заказывать платы на JLCPCB Вот и сейчас, в последнем заказе 100x100 оставалось свободное место.

Дизайн доработал под двухсторонний монтаж, а в схеме добавил зарядку лития на TP4056:







Китаец робко пытался мне сказать, что я заказываю несколько плат в одном заказе. Но мы не привыкли отступать — объединяю все платы обще рамкой на шелкографии, соединяю зеили разных плат (все равно разрезать) и даже пишу по русски, что это одна плата )))



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





Простейший корпус на 3D-принтере:







Как это в работе:



Теперь немного применении


Для чего затевался вход внешнего триггера. Захотелось мне попробовать снимать TimeLaps печати на 3D-принтере при помощи моей камеры SONY HDR AS100. Для этого я в контроллере и сделал вход для внешнего триггера. Подавать сигнал на этот вход можно несколькими способами

Подключить к свободному пину контроллера и зашить в прошивку принтера управление этим входом при помощи дополнительной команды G-кода.

Установить OctoPrint с плагином OptoLapse и подключить вход контроллера ДУ к свободному порту Orange PI/Raspberry PI.

Установить дополнительный концевой выключатель, подключенный к контроллеру и отводить для фотографирования каждого кадра головку принтера, чтобы она нажимала на этот выключатель.

Я попробовал 3-й способ:





Быстро на коленке написал скрипт на PHP, который после печати каждого слоя вставляет код отвода головки в позицию концевого выключателя.

<?php
$file1 = $argv[1];
$file2 = $argv[2];

if (!file_exists($file1)) {
	printf("Can't open %s\n",$file1);
	exit(1);
}
$flag = 0;

$f1 = fopen($file1,"r");
$f2 = fopen($file2,"w");
while( !feof($f1) ){
   $s = fgets($f1, 1024);
   $n = strpos($s,";LAYER:"); 
   if( $n !== false )$flag = 1;
   if( $flag == 1 ){
	 $n1 = strpos($s,"G0 "); 
     if( $n1 !== false ){

	   fprintf($f2, ";TIMELAPSE BEGIN\n");
	   fprintf($f2,"G10\n");
	   fprintf($f2, "G91\n");
	   fprintf($f2, "G0 F1000 Z10\n");
	   fprintf($f2, "G90\n");
	   fprintf($f2, "G0 F5000 Y230\n");
	   fprintf($f2, "G0 F5000 X178 Y230\n");
	   fprintf($f2, "G4 P1000\n");
       fprintf($f2,"%s",$s);
	   fprintf($f2,"G11\n");
	   fprintf($f2, ";TIMELAPSE END\n");
	   $flag = 0;
	 }
	 else {
       fprintf($f2,"%s",$s);
	 }
   }
   else {
      fprintf($f2,"%s",$s);
   }
}
fclose($f1);
fclose($f2);
?>

G-код после каждого слоя выглядит так:

;TIMELAPSE BEGIN
G91
G0 F1000 Z10
G90
G0 F5000 Y230
G0 F5000 X178 Y230
G4 P1000
G0 F6000 X93.168 Y92.836 Z0.3
;TIMELAPSE END

К сожалению, с ходу разобраться с ретраком принтера не получилось, поэтому первое видео получилось с названием «Печатаем сопли» )))


«Но это уже совсем другая история» ©

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

Оригинал статьи в моем блоге

Комментарии (8)


  1. SysCat
    12.11.2019 07:19

    Молодец! Да, пульт не так просто купить, новые пульты конечно отличаются, еще имеют Bluetooth для управления питания и прочими настройками, и вроде говорят по нему тоже картинка передается.


    1. sav13 Автор
      12.11.2019 07:58

      С картинкой вроде не очень сложно
      Там включается режим LiveView и по определенному URL получается видеопоток
      Только это задача не для ESP8266
      В принципе, ESP32 можно попробовать и кадров 10 в секунду. Для просмотра вполне достаточно.
      Или вообще Raspberry/Orange — но тогда цена пульта с экраном будет уже совсем не бюджетной.


  1. volkot
    12.11.2019 13:23

    спасибо за ссылку на API
    Давно хотел заставить свою Х3000 снимать по событию


  1. JPEGEC
    13.11.2019 05:39

    Очень интересно и полезно.
    Правда для экшен камеры вся эта возня с пультом мало нужна. Учитывая опять же прожорливость wi-fi.
    Брал as300R с родным пультом, по факту включал его два раза, один из них при покупке.


  1. madcatdev
    13.11.2019 18:12

    Интересный проект. Однако я бы сделал другой корпус, компактнее и разместил бы кнопку сбоку, так было бы удобнее нажимать, имхо. На дисплей так же можно выводить какую-то информацию, кроме текущего режима работы — например, заряд батареи (как пульта так и камеры), остаток памяти.
    Можно еще добавить конвертер usb-uart для прошивки ESP без открытия корпуса.


    Но мы не привыкли отступать — объединяю все платы обще рамкой на шелкографии

    Можете подробнее про это написать?


  1. sav13 Автор
    13.11.2019 21:35

    Батарея выводится «баром»
    А вот другую информацию не получилось — моя камера не поддерживает все это богатство (((

    Про JLCPCB можно писать и писать. Там с каждым заказом что-то новое. В нюансах.
    Раньше делал несколько платок в одном заказе и фрезеровку между ними. Иди много дырочек. Последний заказ завернули — написали, что там несколько дизайнов.

    На слое маркировке нарисовал общую рамку, да еще и пару контактов у разных плат соединил. Прокатило )))


    1. madcatdev
      13.11.2019 23:18

      А какой софт для объединения использовали?


      1. sav13 Автор
        14.11.2019 05:42

        Я платы в DipTrace проектирую. В нем и объединенную плату потом рисую
        Только исходную плату нужно сгруппировать перед копированием, и галку поставить, чтобы нумерация компонентов на плате не менялось