Оглавление:

Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: 4 шага (с изображениями)
Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: 4 шага (с изображениями)

Видео: Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: 4 шага (с изображениями)

Видео: Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: 4 шага (с изображениями)
Видео: ATEM Mini Tips Marathon — All 16 Tips in One Video! 2024, Июль
Anonim
Image
Image

Многие люди просили меня поделиться некоторыми подробностями о моем беспроводном контроллере для BMPCC4k. Большинство вопросов касалось управления Bluetooth, поэтому я упомяну несколько подробностей об этом. Я предполагаю, что вы знакомы со средой ESP32 Arduino.

Эта версия пульта дистанционного управления может управлять записью, фокусировкой и диафрагмой камеры через Bluetooth. Посмотрите видео. Довольно легко добавить дополнительные функции управления в соответствии с руководством по управлению Bluetooth BMPCC4k. В принципе, насколько я видел, можно управлять чем угодно в камере.

Было бы легко добавить модуль LIDAR для измерения расстояния до объекта, чтобы вы могли получить какую-то систему автофокусировки … Хотя это сомнительно, если вы можете получить достаточно точную фокусировку на определенных областях, таких как глаза и т. Д.

ОБНОВЛЕНИЕ 2020: Я сделал версию 3.0. Он основан на свободно вращающемся колесе с использованием магнитного кодировщика. Он также подключается к моему двигателю слежения за фокусом, который в основном становится вторым устройством Bluetooth (ESP32 поддерживает несколько подключений Bluetooth). Новое видео демонстрирует это.

Если вы хотите заказать версию 3, посетите веб-сайт MagicButton.

Запасы

Любой модуль ESP32 с wifi и bluetooth. Я использовал TTGO micro32, потому что он крошечный:

Колесо фокусировки, подойдет любой потенциометр. Я использовал следующее, потому что он крошечный: https://www.aliexpress.com/item/32963061806.html? S… У этого типа есть жесткие стопы на верхней и нижней границе. В будущей версии я буду использовать поворотный энкодер. Таким образом, фокус или диафрагма не «прыгают» на текущую настройку колеса, когда я вхожу в режим.

Кнопка записи / режима. Я использовал следующее: https://www.aliexpress.com/item/32806223591.html? S…

Другие стандартные компоненты, такие как резисторы, колпачки,… (см. Схему)

Шаг 1: Код

Я использую возможность Wi-Fi ESP32 либо для подключения к известной сети в режиме AP, либо, когда я нахожусь в поле, он становится станцией (STA), к которой я могу подключиться. Таким образом я смогу настроить модуль. Я не буду вдаваться в подробности раздела Wi-Fi / веб-страницы, я могу добавить это на более позднем этапе.

ESP32 подключается к камере и становится клиентом Bluetooth LE. Код bluetooth, включенный в структуру Arduino ESP32, не работает с BMPCC4k. Ваквак-коба исправил это для нас. Спасибо, Ваквак-коба! Я использовал библиотеку BLE отсюда:

github.com/wakwak-koba/arduino-esp32

Тем не менее, эта версия библиотеки BLE все еще находится в стадии разработки, и последняя версия BLEUUID.cpp, похоже, в данный момент не работает, поэтому возьмите более раннюю «проверенную» версию этого файла.

В остальном, большая часть моего кода bluetooth - это много в соответствии с примерами BLE, включенными в структуру Arduino:

Некоторые BLE UUID и переменные определяют:

статический BLEUUID BlackMagic («00001800-0000-1000-8000-00805f9b34fb»);

статический BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); статический BLEUUID DevInfoServiceControlUUID ("180A"); статический BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); статический BLEUUID NotifcharUUID («B864E140-76A0-416A-BF30-5876504537D9»); статический BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); статический BLEUUID CamModelcharUUID («2A24»); статический BLEScan * pBLEScan = BLEDevice:: getScan (); статический BLEAddress * pServerAddress; статический BLEAdvertisedDevice * myDevice; статический BLERemoteCharacteristic * pControlCharacteristic; static BLERemoteCharacteristic * pNotifCharacteristic; статическое логическое значение doConnect = 0; статическое логическое значение connected = 0; volatilebool сканирование = 0; volatileuint32_t pinCode;

Сканирование и основной цикл:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (Рекламируемое устройство BLEAdvertisedDevice) {Serial.print («Обнаружено объявленное устройство BLE:»); Serial.println (рекламируемое устройство.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print («Нашел наше устройство!»); AdvertisedDevice.getScan () -> stop (); myDevice = новый BLEAdvertisedDevice (рекламное устройство); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println («сканирование завершено»); сканирование = ложь; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! сканирование))) {Serial.println ("сканирование…"); сканирование = true; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Таймер = миллис (); } if (doConnect == true) {if (connectToServer ()) {Serial.println («Теперь мы подключены к серверу BLE.»); connected = true; } else {Serial.println ("Нам не удалось подключиться к серверу; больше ничего не будем делать."); } doConnect = false; }}

Подключение к камере:

bool connectToServer () {

Serial.print («Установление связи с»); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (новый MySecurity ()); BLESecurity * pSecurity = новый BLESecurity (); pSecurity-> setKeySize (); pSecurity-> setAuthenticationMode (ESP_LE_AUTH_REQ_SC_MITM_BOND); pSecurity-> setCapability (ESP_IO_CAP_IN); pSecurity-> setRespEncryptionKey (ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); BLEClient * pClient = BLEDevice:: createClient (); pClient-> setClientCallbacks (новый MyClientCallback ()); pClient-> подключить (myDevice); Serial.println ("- Подключено к серверу"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // ПОЛУЧИТЬ МОДЕЛЬ КАМЕРЫ BLERemoteService * pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print ("- Не удалось получить службу информации об устройстве"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); перейти к неудаче; } Serial.println ("- Чтение информации об устройстве"); // Получение ссылки на характеристику в службе удаленного BLE-сервера. BLERemoteCharacteristic * pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("- Не удалось найти модель камеры"); Serial.println (CamModelcharUUID.toString (). C_str ()); перейти к неудаче; } // Считываем значение характеристики. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print («Камера есть»); Serial.println (значение.c_str ()); if (CamModel! = value.c_str ()) {Serial.print ("- Камера не BMPCC4k"); перейти к неудаче; } // ПОЛУЧИТЬ УПРАВЛЕНИЕ pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print ("- Не удалось получить сервис камеры"); Serial.println (ControlserviceUUID.toString (). C_str ()); перейти к неудаче; } BLERemoteCharacteristic * pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); если (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print ("- Не удалось получить контрольную характеристику"); Serial.println (ControlcharUUID.toString (). C_str ()); перейти к неудаче; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println ("- подписка на уведомление"); const uint8_t indicatorOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, ложь); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902)) -> writeValue ((uint8_t *) indicatorOn, 2, true); } вернуть истину; сбой: pClient-> disconnect (); вернуть ложь; }

Подключенный / отключенный обратный вызов:

class MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient * pclient) {Serial.println («Мы подключены»); } void onDisconnect (BLEClient * pclient) {connected = false; pclient-> отключить (); Serial.println («Нас отключили»); }};

Часть пин-кода:

В моей текущей версии я могу ввести пин-код через веб-интерфейс, но это данные Wi-Fi / веб-страницы, которые я могу добавить позже.

класс MySecurity: общедоступные BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- ПОЖАЛУЙСТА, ВВЕДИТЕ 6-значный ПИН-код (завершите нажатием ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {задержка (1); } ch = Serial.read (); если (ch> = '0' && ch <= '9') {pinCode = pinCode * 10 + (ch -'0 '); Серийный принт (ч); }} в то время как ((ch! = '\ n')); return pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, «Номер уведомления ключа доступа:% d», pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Номер ключа доступа YES / NO:% d", pass_key); vTaskDelay (5000); возвращение правды; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, «Запрос безопасности»); возвращение; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("статус пары ="); Serial.println (auth_cmpl.success); }};

Уведомление BLE:

Камера уведомляет своих клиентов BLE о любых изменениях камеры, в том числе о том, когда камера запускает и останавливает запись. Этот код переключает мой светодиод, когда он начинает / останавливает запись.

static void notifyCallback (BLERemoteCharacteristic * pBLERemoteCharacteristic, uint8_t * pData, size_t length, bool isNotify) {// Формат сообщения BMPCC4k BLE: // rec on 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off 255 9 0 0 10 1 1 2 0 0 64 0 2if (length == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } если (pData [8] == 2) {recstatus = 1; }}}

Шаг 2. Кодекс, часть 2

Это та часть, которая фактически отправляет команды на камеру.

Запись:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = ВЫКЛ, 2 = ВКЛ, [8] void Record (логическое RecOn) {if (! RecOn) record [8] = 0; иначе запись [8] = 2; pControlCharacteristic-> writeValue ((uint8_t *) запись, 16, истина); }

Фокусировка:

Камера ожидает 11-битное число в диапазоне от ближнего до дальнего фокуса. Я советую установить фильтр на значение АЦП, иначе фокус может нервно дрожать.

uint8_t focus = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, 11 бит, [8] = LSB, [9] = MSBvoid Focus (uint16_t val) {// переход от 12-битного значения АЦП к 11-битному значению фокуса focus [8] = (uint8_t) (((val> > 1) & 0xFF)); фокус [9] = (uint8_t) (((значение >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t *) focus, 12, true); }

Диафрагма:

Камера ожидает 11-битное число в диапазоне от низкого до высокого значения диафрагмы. Я советую поставить фильтр на значение АЦП, иначе значение диафрагмы может нервно дрожать.

uint8_t aperture = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// переход от 12-битного значения АЦП к 11-битному значению апертуры aperture [8] = (uint8_t) (((val >> 1) & 0xFF)); диафрагма [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t *) апертура, 12, истина); }

Шаг 3: Схема

Схема
Схема

Я приложил PDF-файл своей схемы. Также прилагаются некоторые фотографии печатной платы.

Плата питается от micro USB.

После получения печатной платы я решил, что хочу управлять светодиодом RGB, поэтому я подключил два WS2812B последовательно к выходу «Button Led» (для этого потребовалось несколько участков на печатной плате). Печатные платы стоили 8 долларов США с OSHPark.com.

Вы можете увидеть еще несколько соединений на печатной плате, такие как «adc», которые я не использую и которые были удалены из прилагаемых схем. Раньше планировалось использовать внешнее колесико фокусировки, но в настоящее время я полностью доволен колесиком для большого пальца.

Шаг 4: Заключение

Надеюсь, это помогло.

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

Печатная плата нуждается в обновлении, чтобы правильно передавать сигналы для светодиодов WS2812B RGB.

Я потратил очень много времени на эту работу, особенно на часть BLE. Если это вам помогло, и вы хотите купить мне выпить, я очень признателен:) Это ссылка для пожертвования Paypal:

Рекомендуемые: