Модуль беспроводного управления камерой Xiaomi Yi

Запись перенесена из темы про Xiaomi Yi для более детального и удобного обсуждения

Провел успешные предварительные испытания радиоспуска (шуттера) для камеры сяоми, работающего по WiFi. Вход шуттера подключается к обычному выходу PWM приемника на один из свободных каналов. В зависимости от сигнала, камера включает/выключает видеозапись, делает одиночный снимок или находится в режиме ожидания команды. Теперь не нужно разбирать камеру и колхозить проводки к выводам кнопок.

Шуттер построен на основе знаменитой микросхемы ESP8266. Она содержит в себе довольно мощный проц, который можно программировать при помощи Arduino IDE. Это позволяет отказаться от внешней атмелины и всю работу выполнять одиночным WiFi модулем, подавая PPM сигнал прямо на его вход. На выходе получаются команды для сяоми по WiFi. Макет построен на основе модуля ESP-03:

Окончательный вариант хочу построить на основе модуля ESP-09:

Алгоритм работы такой:

  • при включении модуля он соединяется с камерой по WiFi, при успешном соединении камера издает короткий звуковой сигнал
  • для управления камерой используется трехпозиционный переключатель пульта р/у или “крутилка”. В среднем положении камера ждет команду. Одиночное фото делается переключением из центра в минимум. Переключение в максимум включает видеозапись, возврат в центр выключает.
  • предусмотрена возможность подключения модуля к компьютеру через адаптер FTDI для программирования и отладки. В терминал можно выводить информацию о текущей работе, включая обмен с камерой. Уникальное имя камеры и пароль прописываются в коде прошивки. Можно в дальнейшем организовать ввод настроек при помощи АТ-команд через последовательный порт.

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

Отвечу сразу на очевидные вопросы тех, кто не читал исходную тему.
Q: WiFi на борту - это источник помехи 2.4ГГц для радиоуправления и посему есть зло.
A: Не всё так однозначно. Множество коптеров летают со включенным модулем Bluetooth, а это тоже 2,4ГГц и проблем нет. Мои два коптера тоже частенько так летают.
К сожалению, управлять камерой без проводов кроме как по WiFi или bluetooth не получится.
Более того, GoPro народ давно уже управляет через бортовой вайфай, при желании можете погуглить.
С сяоми проблемка лишь в более вычурном протоколе управления, но на зарубежных форумах, типа дэшбоардкам, активно обсуждается хак протокола и удаленное управление. Поэтому используется миниатюрный модуль WiFi вообще без антенны. На расстоянии метра с камерой он и так свяжется, а управлению, как показали испытания, не мешает. Разумеется, при условии нормально работающего приемника и исправных антенн передатчика и приемника радиоуправления.

Q: Можно ли программно снизить выходную мощность модуля, чтобы он работал на очень малом расстоянии и не мешал приемнику?
A: Да, можно. На данный момент модуль WiFi работает на минимально возможной мощности, с дальностью связи меньше 1 метра, если использовать модуль ESP-09 без антенны. Мощность можно менять через константу в прошивке.

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

После установки расширения выберите плату Generic ESP8266 Module и этого достаточно. Прочие параметры, типа объема памяти и тактовой частоты, не трогайте.

ФАЙЛЫ СО СХЕМАМИ, ПЛАТОЙ, ПРОШИВКАМИ

Все файлы для скачивания переехали на мой личный сайт/блог по адресу reedpaper.com/projects/wifi_xiaomi_yi

  • 11264
Comments
fidller

а им можно сразу 6 -8 камер включить?

Rover

Сразу одной командой нельзя. Камера Xiaomi Yi это обычная точка доступа, которая после подключения дает клиенту IP, у всех камер одинаковый. Различаются только имена точек доступа. Они содержат в себе серийный номер камеры. Для передачи команды нескольким камерам нужно последовательно соединиться с камерой, получить от нее токен авторизации, передать команду, получить ответ, передать команду окончания сеанса и отключиться, и так для всех камер по очереди. Если бы камера умела быть клиентом, тогда можно было бы включить ESP8266 в режим сервера, зацепиться за него камерами и кидать команды всем клиентам, тоже по очереди но с очень малым разрывом. Кстати, смотря что вы имеете в виду под словом “включить”. Управлять питанием камеры по WiFi не получится. Нет питания - нет вайфая)

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

seashaman

Очень интересно! А как Вы команды на камеру даете? У нее открыт АПИ , или парсером команды взяли?

fidller

имел ввиду когда запись можно одновременно включить сразу на 6 камерах на пример. у гоупро пуль поддерживает до 12 камер на 1 пульт вроде и настройки можно одновременно на всех камерах менять.

SovGVD
Rover;bt142147

Если бы камера умела быть клиентом

А она умеет github.com/PJanisio/…/wifi_client_mode

Rover
seashaman;bt142150

Очень интересно! А как Вы команды на камеру даете? У нее открыт АПИ , или парсером команды взяли?

API открытого нет, но весь трафик между камерой и смартфоном читается снифером, там всё видно) В сети народ полным ходом обменивается данными, кто-то утилиту на комп уже написал.

SovGVD
Rover;bt142154

API открытого нет, но весь трафик между камерой и смартфоном читается снифером, там всё видно) В сети народ полным ходом обменивается данными, кто-то утилиту на комп уже написал.

Ага dashcamtalk.com/…/xiaomi-yi-camera-gui-control-con…
на основе того что я наснифал и хотел расковырять все команды, но потом навалилось работы и осталась только ссылка на блог, где описано получение токена, пару команд и лог трафика

Rover
SovGVD;bt142152

О, спасибо за подсказку. Пожалуй множественное управление камерами будет следующей задачкой 😃 но вывод статуса камеры на minimOSD тоже охота сделать. Увы, впереди насыщенная трудовая неделя((

Rover
SovGVD;bt142155

Ага dashcamtalk.com/…/xiaomi-yi-camera-gui-control-con…
на основе того что я наснифал и хотел расковырять все команды, но потом навалилось работы и осталась только ссылка на блог, где описано получение токена, пару команд и лог трафика

Кстати! Где-то мелькала инфа, что якобы можно залезть в камеру по SSH и ковырять ее конфиг изнутри. Но я эту ссылку закрыл и потерял(
А звучит логично, линукс на борту, почему бы и не ssh. Но я все известные мне порты сяоми перебрал, нигде SSH не торчит.
Пока не знаю, зачем это мне, но вдруг пригодится.

SovGVD
Rover;bt142162

Кстати! Где-то мелькала инфа, что якобы можно залезть в камеру по SSH и ковырять ее конфиг изнутри. Но я эту ссылку закрыл и потерял(

Не по SSH, а через telnet (хотя в данном случае не суть) github.com/PJanisio/…/telnet_open

Еще какой то замут с bluetooth есть …blogspot.ru/…/bluetooth-is-running-on-my-xiaomi-y…

Rover

Разобрался, как управлять мощностью вайфая в антенне и программно уменьшить ее до минимума (0.25dBm). Теперь даже при наличии антенны модуль ESP-03 устанавливает связь с камерой на расстоянии порядка метра-полутора. Можно предположить, что с модулем ESP-09 вообще без антенны это расстояние уменьшится до десятка сантиметров.

schs

Код было бы интересно посмотреть.

Rover

Промежуточный вариант прошивки можно забрать в дропбоксе.
Ссылки на актуальные прошивки перенесены в первое сообщение.
В этом варианте прошивки пока еще не обрабатываются команды с пульта. При подключении приемника к GPIO14 в последовательный порт выводится отладочное числовое значение 1 - минимальное значение PPM, 2 - среднее значение, 3 - максимальное. Это чтобы проверить правильность реакции на трехпозиционный переключатель.
Также пока не реализован ввод имени камеры и пароля через терминал, поэтому имя вашей камеры и пароль (если он не дефолтный) надо прописать в коде.

Напоминаю, что для компиляции кода нужен специальный мод Arduino IDE, ссылка в коде.

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

Подставляя в код, в раздел инициализации после фрагмента

  buzzer_on();
  delay(400);
  buzzer_off();

вызовы подпрограмм фотографирования take_photo() или запуска и останова видеозаписи video_on() и video_off() можно посмотреть, как это работает.

Rover

Полнофункциональный исходник прошивки самые нетерпеливые)) могут забрать здесь.
Ссылки на актуальные прошивки перенесены в первое сообщение.
Всё работает, фотографирует, видео пишет.
**Не забывайте, что камера срабатывает не мгновенно. Например, на то, чтобы сделать фото и сохранить его на карточку, камере нужно до 3-х секунд. Аналогично, при остановке видеозаписи порядка секунды уходит на выгрузку буфера в файл и его закрытие. Поэтому не дергайте переключатель пульта слишком быстро туда-сюда!!! **

Мощность передатчика WiFi у модуля задавлена до минимально возможной. Кто бы еще поковырял конфиги линукса внутри камеры, дабы уменьшить мощность и её вайфая тоже?

В ближайшие дни займусь изготовлением финальной платы на основе модуля ESP-09. После этого соберусь с силами и сделаю окончательное описание конструкции. Вообще радиомодуль можно сделать на основе любого модуля ESP, главное, чтобы были выведены наружу линии GPIO14 (вход PPM), GPIO0 (режим программирования) и желательно GPIO2 (индикаторный светодиод).

В дальнейших планах подключение модуля к minimOSD для наложения на картинку режима работы и заряда батареи.

Rover

Итак, сделал вчера окончательный вариант беспроводного модуля для Xiaomi Yi на основе ESP-09. Можно, разумеется, использовать любой модуль ESP, у которого наружу разведены выводы Rx, Tx, GPIO0 и GPIO14. Это минимальный набор. К выводу GPIO2 подключается светодиод, это стандартный порт для светодиода, если на вашем модуле ESP светодиод есть, то он уже подключен к GPIO2. Просто я люблю делать миниатюрные и легкие конструкции, но это уже дело вкуса.

Три вывода справа предназначены для подключения к свободному каналу приемника, читается обычный сигнал PWM. (На картинке опечатка. PPM конечно тоже можно принимать, изменив прошивку. Готовых решений для ардуино описано много.) Выводы слева - это тоже обычный UART, используется для записи прошивки в модуль, через него же вываливаются логи при нормальной работе модуля, их при желании можно смотреть в терминале, дабы убедиться, что все работает как надо и камера отвечает.

К выводам Rx, Tx можно подключать стандартный модуль minimOSD, для наложения на картинку с видеовыхода текущего статуса камеры и состояния батареи камеры. Прошивку OSD можно скачать по ссылке в первом сообщении.

Для перевода модуля в состояние записи прошивки надо замкнуть перемычку “Prog.mode” (посадить GPIO0 на землю) и затем подать питание. Светодиод мигнет на мгновение и погаснет. Можно запускать запись прошивки.

В обычном режиме после подачи питания светодиод зажигается на 0,5 сек, гаснет, и начинает мигать раз в секунду во время поиска камеры. После успешного соединения с камерой светодиод зажигается постоянно. Камера в момент соединения издает короткий писк. Для этого используется функция “поиск камеры” из её новой прошивки. Звук издается на максимальной громкости и всегда, независимо от того, выключен ли звук в настройках камеры. Кстати, вы можете использовать эту опцию камеры и для её поиска после краша. Если камера не найдена через 40 секунд после включения модуля, светодиод гаснет.

Модуль работает в режиме минимально возможной мощности вайфая, дабы не создавать помехи на борту. Внешняя антенна модуля отсутствует, в данном случае это еще один аргумент в пользу именно ESP-09. По этой же причине использован миниатюрный, дешевый и вездесущий стабилизатор питания LP2981-3.3 на ток до 100 мА, потребляемый ток модуля 70 мА. При увеличении мощности и использовании антенны этого стабилизатора может быть недостаточно, имейте это в виду. Модуль припаян к базовой плате на сплав Розе. Контактные площадки предварительно залужены обычным припоем.

Скачать архивы с прошивками, схемой и рисунком платы в формате DipTrace можно в первой записи темы.

Kirkun

скажите, может я не правильно понял, а нельзя ли управлять через какую либо схемку просто пультом от сяоми? у него же BT, я думаю не так сильно будет мешать приемнику.

Rover

Пульт БТ от сяоми по описанию работает на расстоянии 10м. У моего модуля до предела задавлен в настройках выходной сигнал, нет антенны и он работает на расстоянии менее 1м. Выводы относительно мощности мешающего сигнала делайте сами. Кроме того BT и WiFi оба работают на частоте 2.4ГГц. Поэтому совершенно непонятно, на чем основано предположение, что БТ будет мешать меньше, если диапазон тот же, а мощность у БТ пульта очевидно больше.

Еще один важный нюанс: брелок от сяоми работает только на управление камерой. Мой модуль может полноценно общаться с камерой, получать от нее информацию о текущем состоянии и отправлять эту информацию на OSD или по каналу телеметрии. Сейчас я неспешно ковыряюсь с этой частью прошивки. Неоднократно было высказано пожелание, чтобы можно было на экране видеть, каков заряд батареи, в каком режиме находится камера, пишет она видео или нет. И эта функция зачастую даже важнее, чем просто пуск/стоп камеры. Пульт БТ касаемо OSD ничем не поможет.

Модуль это законченное и самостоятельное устройство. К брелку надо делать дополнительное устройство, например на ардуино.
И, наконец, ESP-09 стоит около 130 рублей, плюс рублей 50 на детальки. Пульт БТ около 500-600, к нему добавим ардуинку примерно за 150-180. Вот такие аргументы)))

Rover

Набросал несложный скетч для сяомишного OSD и немного доработал под него прошивку беспроводного модуля. Ссылки для скачивания в первой записи темы.

Утилита для записи шрифта в OSD и его редактирования

Первым делом загрузим нужный шрифт в микросхему MAX7456. Я выбрал из имеющихся у меня готовых шрифтов наиболее, на мой взгляд, подходящий. При желании можете отредактировать его при помощи визуального редактора или записать другой. Имейте в виду, что при этом наверняка придется соответственно подредактировать коды символов в исходном коде прошивки, чтобы эти коды указывали на нужный символ в таблице знакогенератора.

Из папки “Max7456_Font_Update_v1” возьмите скетч с таким же названием и залейте его в minimOSD. Запустите утилиту, откройте в ней шрифт OSD_Charset.mcm
Залейте этот шрифт в OSD через меню OSD -> Write All…
Теперь закройте утилиту и залейте в OSD рабочую прошивку. Беспроводной модуль прошивается уже известным вам способом через Arduino IDE, ссылки. как это делать, в первой записи. Соедините линии данных ESP и OSD перекрестно: Rx - Tx, Tx - Rx. Не забываем: модуль ESP питается от 3.3V если нет встроенного источника. Можно включать. Линии Rx,Tx беспроводного модуля ESP можно соединить с радиомодемом, а выход наземного модема подать на OSD.

Так это выглядит на экране:

В левом нижнем углу напоминалка положения трехпозиционного переключателя пульта. В среднем положении ожидание (idle). Кстати, в этом режиме при наличии подключения WiFi картинка разворачивается на весь экран. Это такой забавный баг камеры, о котором я уже говорил в теме форума. Чтобы сделать одиночный снимок, переведите движок в минимум, дождитесь, пока изображение мигнет и появится слово CAPTURED. Верните движок в среднее положение. Запись включается движком в максимум. Останов - обратно в среднее положение. Картинка при смене режимов всегда мигает, это такое свойство камеры.

При разряде аккумулятора ниже 10% значок батареи с восклицательным знаком начинает мигать. Если модуль не смог соединиться с камерой, появится надпись “Camera not found”. Помните, что мощность зажата в ноль и связь с камерой работает на очень малом расстоянии. Если надо большую дистанцию, поправьте нужный дефайн в прошивке модуля.

SovGVD

А можно вытащить данные об iso и выдержке? Вроде нигде не видел описания такого

Rover

Я тоже ничего такого не нашел. Наверное не получится.

Можаефф

Валерий, а можно ли сделать это на таком модуле?
banggood.com/2_4G-Wireless-Wifi-Telemetry-Module-W…

Если нет, то возможно есть уже готовая плата, под которую не нужно делать еще одну, среди этих?
www.banggood.com/search/esp8266.html

Можаефф

Валерий, еще было бы здорово все ссылки поместить в основную запись, и ссылка на разводку платы битая.

Rover

Александр, да, модуль для Pixhawk подойдет идеально, потому что у него на проводе в термоусадке уже спрятан источник +3,3V (напрямую +5 не подавать - сгорит!) и уже выведена гребенка для последовательного порта. Но имейте в виду, что для перепрошивки вам придется разрезать термоусадку, чтобы вывод GPIO0 сажать на землю. Возможно он выведен на гребенку, это вы уже после получения увидите, по фото и описанию товара это не видно.

По второй вашей ссылке смотреть готовые модули, уже имеющие стабилизатор +3,3 и разъемы, не имеет смысла, поскольку это отладочные платы, которые весят, как кирпич и размером почти как половина камеры. Единственное, что нам подходит, это ESP-11 banggood.com/ESP8266-Remote-Serial-Port-WIFI-Trans…
если к нему приделать внешний стабилизатор 3,3V. И кстати, не берите модуль ESP-05, у него не разведен наружу вывод GPIO0, замучаетесь припаиваться к нему для перепрошивки, еще и дорожку придется резать скальпелем под сильной лупой.

Прошивка и плата модуля: drive.google.com/open?id=0B6fd8HhaRRWTQkY1alB6RnB6…
Прошивка для MinimOSD: drive.google.com/open?id=0B6fd8HhaRRWTcEdDY2pnaTdK…

Можаефф

Валерий, спасибо большое за ответы, и за прошивку! Возможно, нашел еще удобные решения:
www.ebay.com/itm/…/111819907565

dx.com/…/esp8266-serial-wi-fi-wireless-esp-01-adap…

Но есть загвоздка, у ESP-01 некуда подключить ППМ. ГПИО14 не разведен.
Видимо из готовых, только такой можно брать
www.ebay.com/itm/…/181854783969

И хотел еще уточнить, можно ли сделать поддержку ПВМ? У меня на ППМ нету свободных каналов.

Rover

Хм, какие прикольные штучки)))
Ничего страшного, что GPIO14 не разведен, номер ноги в прошивке можно поменять на нужный.
Только сперва разобраться, а какой же все-таки разведен.

К сожалению, у меня нет ни оборудования под рукой, ни времени, чтобы заняться поддержкой сигналов по последовательному каналу. Еще бы и S.BUS не помешал. Теоретически-то конечно можно, только вот когда… Не могу даже обещать, что вообще вернусь к доработке этого проекта. Ну разве что следующей осенью/зимой…

Можаефф

ГПИО2 можно задействовать?

Можаефф

ПВМ для Ардуины хорошо задокументирован, возможно использование этих же принципов?
firetailuav.com/…/reading-pwm-signals-from-an-rc-r…

Hyperion

ams1117 3.3 я думаю тоже подойдет? Просто только крупнее все получится?
Блин так сделать бы еще так чтобы модуль отдавал данные основному ОСД чтобы не делать кучу ОСДшек 😃

Rover

Конечно подойдет, там будет огромный запас по току.
У основного OSD только один порт Rx-Tx. хотя можно замутить в основной OSD эмуляцию второго порта по какому-нибудь протоколу. Но это уже вопрос к серьезным программистам, кто пишет прошивки типа MWOSD и прочие))

Hyperion

ХМ, тут подумалось, имея storm32 можно наверное вообще обойтись без 3.3 стаба, там же есть выходы 3.3в выходы на потенциометр. Оттуда наверное и можно запитать? Потребление вроде копеечное у этого модуля?

Rover

Ну не совсем копеечное, на минимальной мощности около 70 mA по китайскому мультиметру. Надо аккуратненько подключать.

KoriSkull

Здорово! Элегантно и красиво! Интересно, а с GoPro можно подобную схему провернуть?

Rover

Да, можно. Прямо здесь на форуме можете посмотреть. Только в той разработке задействованы отдельно ардуинка и модуль на ESP8266, хотя, на самом деле, нужды в отдельной ардуине нет. Весь функционал можно затолкать прямо в ESP. Но у меня нет GoPro, поэтому портировать и проверять нечем. Можете смело брать мой проверенный модулёк за аппаратную основу и модифицировать прошивку под GoPro на основе указанных выше по ссылке команд.

Rover

Выложил прошивку, которая понимает сигнал PPM. Архив содержит библиотеку декодера PPM, которую необходимо установить в Arduino IDE перед компиляцией прошивки.

SKIF-D

Если не трудно, подскажите что не так. Решил подключить OSD. Прошил для заливки шрифтов, залил шрифты, пытаюсь загрузить рабочую прошивку (OSD_YI), а у меня выскакивает ошибка.
MAX7456 OSD( osdChipSelect );

Rover

Скорее всего, у вас в Arduino IDE не установлена библиотека для MAX7456. Я выложил ссылку в первой записи, скачайте и установите. Для установки библиотеки запустите Arduino IDE, выберите в меню пункты Эскиз -> Include Library -> Add .ZIP Library и укажите на скачанный zip архив, затем перезапустите IDE. Или разверните архив и скопируйте папку MAX7456 в папку Libraries вашего Arduino IDE.

SKIF-D

Так и было. Спасибо.Все получилось.

Hyperion

Валерий, подскажите плз, данные о том что фото сделано или видео пишется берутся из самой камеры или просто от состояния переключателя?

Rover

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

Например, когда вы даете команду на запись видео, камера отвечает, что она перешла в режим записи видео. Когда вы даете команду остановить видео, камера подтверждает останов. Эти подтверждения отслеживаются прошивкой. Но в промежутке между командами статус камеры непрерывно не проверяется. По умолчанию мы считаем, что если камера получила команду начать запись и выдала подтверждение, то значит процесс идет штатно. Если после подтверждения записи через какое-то время глюканет флешка и камера зависнет, мы об этом не узнаем.

Rover

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

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

Заказал также в Китае десяток модулей ESP-09 для установки на эту платку, т.к. люди мучаются с их покупкой в России, а из Китая снова стало долго. Но пока они затерялись где-то в дороге.

Кстати! Курьерская служба СПСР повергла меня в шок. Сегодня утром, часов в 11, они забрали готовые платы в Новосибирске, а в 17-00 вручили их мне в Красноярске. Телепортация))

romeo84

Отличная вещь для управления камерой!! Огромный респект за проделанную работу.
Можно краткую инструкцию, как залить туда прошивку? Модключаем чезер USB-uart 3.3v к ноуту, открываем прошивку (ino-файл) в ардуине, компилим и заливаем через неё? Если да, то какую плату в настройках ардуины выбрать? Нигде такого описания не нашел ((

Rover

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

После установки расширения выбирайте плату Generic ESP8266 Module и этого достаточно. Прочие параметры, типа объема памяти и тактовой частоты, не трогайте.

Rover

Ура, дождался модули ESP-09 из Китая, а то раздал все заначки)) Вот так выглядит собранная платка (спаяна вручную)

Dogmatecs

Сколько стоит, где купить ?

Rover

У меня остались несколько штук, написал в личку.

pinco

Валерий, Вы случаем не решали такую задачу как cвязать два модуля ЕSP8266 для передачи через них PPM-сигнала? Практическое применение такого решения - это связь выхода хэдтрекера с тренерским портом аппы. Хочу поставить хэдтрекер на шлем без гемора с проводами подключения к тренерскому разъёму аппы.

Rover

Интересная задача. По правде сказать, мне такое применение даже в голову не приходило. Обязательно возьму на заметку. К сожалению, в ближайшие полгода у меня однозначно не будет возможности начать работать над этой новой задачкой…

Rover

Модуль управления разрабатывался и тестировался для версии камеры Z22L. Когда появились новые версии камеры, некоторые пользователи стали жаловаться, что модуль не может установить связь с камерой. Путем многочисленных тестов и совещаний удалось установить, что одна из причин (возможно даже единственная) состоит в том, что изменилась длина строки ответа камеры, из которой модуль извлекает номер токена (подпрограмма ask_for_token()). Недавно один из энтузиастов прислал мне исправленную подпрограмму для Xiaomi Yui 4K:

void ask_for_token(void) {

 INcamera = "";
 client.flush();
 client.print("{\"msg_id\":257,\"token\":0,\"param\":0}");
 while (!client.available()) { }
 while (client.available()) {
 char k = client.read();
 INcamera += k;
 }
 INcamera.trim();
 token = INcamera.substring(31,(32));

 INcamera = "";
 }

Строго говоря, изменению подлежит только одна строка, выделенная жирным шрифтом.

Также есть подозрения по поводу зависимости от версии Arduino IDE, потому что встречалась ситуация, когда в случае камеры версии Z23L у одного пользователя модуль работает с прошивкой, выложенной на форуме, а у другого не может соединиться с точно такой же камерой. Посовещавшись, мы предположили, что причина может крыться в разных версиях компилятора. При работе над проектом я использовал Arduino IDE 1.6.5 и 1.6.8.

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

Rover

Предупреждаю, что на сегодня у меня осталось в наличии только два субмодуля ESP-09. Имейте это в виду, если вам нужен модуль управления в сборе. Заказал в Китае еще, но они приедут как обычно, в течение месяца или дольше.

AlexeyStn

Добрый вечер! Пришёл ваш модуль. Большое спасибо!
Соединяю с камерой и смотрю сообщения в терминале:


Start connection
...........
Connected to camera
token:  }
1;2;0;0
1;2;0;0
1;2;0;0
1;2;0;0
Take the photo

Видимо, он соединяется, но сама камера при этом молчит, не пищит.
Канал PWM при подключении в середине диапазона.
Затем подаю минимальный сигнал PWM на вход, появляется надпись “Take the photo”.
После этого сообщения перестают идти в терминал. Камера молчит и не делает кадр.
Даже когда PWM возвращаю в середину, всё равно больше ничего не происходит.

P.S. У меня камера версии Z25L, видимо китайцы снова что-то поменяли.

Rover

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

(INcamera); 

чтобы в терминал выводился текст ответа камеры.
Токен это цифра от 0 до 9 в конце строки ответа. Подсчитайте ее позицию и поправьте строку,

token = INcamera.substring(37, (INcamera.length() - 2));

в соответствии с фактической позицией токена.
Про метод substring() можно подробно прочитать здесь.
Там все просто: первый параметр - начальная позиция фрагмента строки, второй параметр - конечная позиция фрагмента.
Путем их подбора добейтесь, чтобы в переменную token извлекалось именно нужное число из ответа камеры.
Надеюсь, китайцы ничего не поменяли слишком глобально.

Если всё получится, не забудьте написать здесь правильную строку кода для обмена опытом.

AlexeyStn

Раскомментировал. Теперь камера выдаёт такой ответ, в котором, как я вижу, нет токена:

Connected to camera
{ "msg_id": 7, "type": "vf_stop" }
token:  }
1;0;0;0
1;0;0;0

Прошивка камеры 1.4.8, версия Z25L

AlexeyStn

Решил. Камера передаёт две строки, а не одну. Но программа почему-то принимает только одну строку.
Я немного переписал “ask_for_token”. После “Serial.println(INcamera);” добавил чтение ещё одной строки:

  delay(200);
  INcamera = "";
  while (client.available()) {
    char k = client.read();
    INcamera += k;
  }
  Serial.println(INcamera);

Вторая строка оказалась той, что нужно, токен получен на нужной позиции и дальше всё заработало!

Connected to camera
{ "msg_id": 7, "type": "vf_stop" }
{ "rval": 0, "msg_id": 257, "param": 1 }
token: 1
1;0;1;80
1;0;1;80

Возможно, есть какое-то более изящное решение. Но главное, что всё завелось! Можно запускать Yi в небо)

Rover

Здорово, я рад, что проблема решена) Конечно, программа читала одну строку, потому что раньше камера и отвечала одной строкой.
Причем, судя по всему, теперь камера выдает вторую строку с некоторой задержкой, вторым блоком данных. Поэтому прошивка модуля воспринимала это как окончание передачи ответа. Можно было бы конечно тупо ждать и читать в буфер INcamera обе строки, а потом выкусывать токен.
Но ваше решение абсолютно равноценное и на мой взгляд даже более правильное. Удачных полетов)

Rover

В запасе остался один собранный модуль. Новую партию субмодулей ESP-09 китайский продавец из алиэкспресса отправил 25 марта.

AlexeyStn

Была идея использовать Xiaomi и для съёмки, и как курсовую.
Обнаружил такую особенность: если смотреть аналоговый выход и делать фото на механическую кнопку камеры, то изображение пропадает меньше, чем на секунду. В принципе, с этим можно жить. 😃
Если же подавать команду фото через WiFi модуль, то изображение пропадает, затем появляется в узком формате, затем снова пропадает и опять возвращается. То есть процесс фотографирования занимает секунды две или больше.
То же самое происходит, когда фото делается из андроидовского приложения.
Интересно, есть ли возможность избежать этого?
Хотя, наверное, всё равно лучше ставить отдельную курсовую.

KirS

Ещё раз хочу поблагодарить за отличный модуль, его очень не хватало для автоматической съёмки панорам.
Была замечена одна неприятная особенность камеры Xiaomi Yi - если подать новый сигнал, в то время, пока она ещё не отработа предыдущий - зависает. Проще говоря, если включить “сделать кадр” и не дождавшись, пока она его действительно сделает (3-5сек) и перевести переключатель в среднее положение - камера виснет. Во всяком случае у меня. После общения с Валерием выяснил, что можно дописать код, который будет получать ответ от камеры о завершении записи кадра и уж было решил тряхнуть стариной и засеть за программирование. Но тут меня посетила Мысль - Taranis подобную функцию может сымитировать. Попутно сделал, как мне видится гораздо более удобное переключение режимов камеры.
Итак, есть “моментальный переключатель” SH, который имеет всего 2 позиции.

  1. Краткое нажатие на него отправит команду “сделать кадр” и будет продолжаться 5сек, после чего от перейдёт в “центральное положение”.
  2. Если же держать переключатель нажатым более 3 сек, то включиться режим “старт видео”. Если ещё раз нажать и удерживать 3 сек - команда “стоп видео”.
    Сделана проверка, запрещающая выполнение новой команды, если не завершена предыдущая.

Logical Switches:

Special Functions:

Длительность нажатия для старта/стопа видео - переменная V2 в L11
Задержка для записи в режиме “фото” - Duration в L10
В SF1 и SF2 указываете канал, которому подключен модуль

QuadroSky

Здравствуйте! Заказал данный модуль и в ожидании доставки появились некоторые вопросы. Ревизия камеры у меня z25l и прошивка 1.5.6 и ясно что модуль просто так не сконнектится с камерой. Не могли бы вы помочь с изменением прошивки под мою камеру? Возможно даже ваша прошивка мне подойдет. Камеры, как я понял отличаются у нас только прошивками. Буду очень благодарен за помощь))

QuadroSky
AlexeyStn;bt154466

Решил. Камера передаёт две строки, а не одну. Но программа почему-то принимает только одну строку.
Я немного переписал “ask_for_token”. После “Serial.println(INcamera);” добавил чтение ещё одной строки:

  delay(200);
  INcamera = "";
  while (client.available()) {
    char k = client.read();
    INcamera += k;
  }
  Serial.println(INcamera);

Вторая строка оказалась той, что нужно, токен получен на нужной позиции и дальше всё заработало!

Connected to camera
{ "msg_id": 7, "type": "vf_stop" }
{ "rval": 0, "msg_id": 257, "param": 1 }
token: 1
1;0;1;80
1;0;1;80

Возможно, есть какое-то более изящное решение. Но главное, что всё завелось! Можно запускать Yi в небо)

Здравствуйте! Заказал данный модуль и в ожидании доставки появились некоторые вопросы. Ревизия камеры у меня z25l и прошивка 1.5.6 и ясно что модуль просто так не сконнектится с камерой. Не могли бы вы помочь с изменением прошивки под мою камеру? Возможно даже ваша прошивка мне подойдет. Камеры, как я понял отличаются у нас только прошивками. Буду очень благодарен за помощь))