ДУ с внешним триггером для камер SONY HDR на ESP8266

в 3:51, , рубрики: diy или сделай сам, esp8266, json, SONY HDR

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

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

ДУ с внешним триггером для камер SONY HDR на ESP8266 - 2
Но ведь есть 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. Нас интересует второй диск

В файле: \INFOWIFI_INF.TXT содержится идентификатор и пароль доступа к камере по WiFi, а в файле \INFOWPS_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, какой обычно применяется в недорогих фитнес браслетах.

Схема прототипа
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 3
Дизайн платы
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 4
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 5
Ну и сама жертва ЛУТа
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 6
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 7

Прошивка

Ардуиноненавистникам рекомендую пропустить эту часть, так как прошивку я разрабатывал в 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
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 8
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 9
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 10
Китаец робко пытался мне сказать, что я заказываю несколько плат в одном заказе. Но мы не привыкли отступать — объединяю все платы обще рамкой на шелкографии, соединяю зеили разных плат (все равно разрезать) и даже пишу по русски, что это одна плата )))
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 11
Правда разрезать платы приходится вручную, го для этого есть хорошие ножницы по металлу.
В итоге получаем такое изделие
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 12
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 13
Простейший корпус на 3D-принтере
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 14
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 15
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 16

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

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

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

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

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

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

Я попробовал 3-й способ:
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 17
ДУ с внешним триггером для камер SONY HDR на ESP8266 - 18
Быстро на коленке написал скрипт на PHP, который после печати каждого слоя вставляет код отвода головки в позицию концевого выключателя.

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

if (!file_exists($file1)) {
	printf("Can't open %sn",$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 BEGINn");
	   fprintf($f2,"G10n");
	   fprintf($f2, "G91n");
	   fprintf($f2, "G0 F1000 Z10n");
	   fprintf($f2, "G90n");
	   fprintf($f2, "G0 F5000 Y230n");
	   fprintf($f2, "G0 F5000 X178 Y230n");
	   fprintf($f2, "G4 P1000n");
       fprintf($f2,"%s",$s);
	   fprintf($f2,"G11n");
	   fprintf($f2, ";TIMELAPSE ENDn");
	   $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
Оригинал статьи в моем блоге

Автор: sav13

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js