Оглавление:
Видео: Magic Button 4k: беспроводной пульт дистанционного управления BMPCC 4k (или 6k) за 20 долларов США: 4 шага (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Многие люди просили меня поделиться некоторыми подробностями о моем беспроводном контроллере для 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:
Рекомендуемые:
Беспроводной пульт дистанционного управления ITunes - в стиле Packrat !: 4 шага
Беспроводной пульт дистанционного управления ITunes - в стиле Packrat !: < BackStory > Я купил эти беспроводные наушники, потому что устал быть привязанным к ноутбуку с обычными наушниками. О какая свобода! Мне нравится слушать свою медиатеку iTunes в случайном порядке, и иногда я возвращаю
IRduino: Пульт дистанционного управления Arduino - имитация утерянного пульта дистанционного управления: 6 шагов
IRduino: Пульт дистанционного управления Arduino - имитируйте потерянный пульт: если вы когда-либо теряли пульт дистанционного управления для своего телевизора или DVD-плеера, вы знаете, как неприятно ходить, находить и использовать кнопки на самом устройстве. Иногда эти кнопки даже не обладают той же функциональностью, что и пульт. Rece
Беспроводной пульт дистанционного управления с использованием модуля 2,4 ГГц NRF24L01 с Arduino - Nrf24l01 4-канальный / 6-канальный передатчик-приемник для квадрокоптера - Радиоуправляемый вертолет - Самолет на радиоуправлении с использованием Arduino: 5 шагов (с изображениями)
Беспроводной пульт дистанционного управления с использованием модуля 2,4 ГГц NRF24L01 с Arduino | Nrf24l01 4-канальный / 6-канальный передатчик-приемник для квадрокоптера | Радиоуправляемый вертолет | Самолет на радиоуправлении с использованием Arduino: для управления автомобилем на радиоуправлении | Квадрокоптер | Дрон | Самолет RC | Лодка с дистанционным управлением, нам всегда нужны приемник и передатчик, предположим, для RC QUADCOPTER нам нужен 6-канальный передатчик и приемник, а такие типы TX и RX слишком дороги, поэтому мы сделаем один на нашем
Обычный комплект дистанционного управления, преобразованный в четырехканальный игрушечный пульт дистанционного управления с дистанционным управлением: 4 шага
Обычный комплект дистанционного управления, преобразованный в четырехканальный игрушечный пульт дистанционного управления с дистанционным управлением:改造 方法 非常 简单。 只需 准备 一些 视频 教程 完成 这个 电子 项目 并 您 服务。 玩具 控制。
Пульт дистанционного управления Magic Button: 3 шага (с изображениями)
Дистанционный переключатель «Волшебная кнопка»: ПРОБЛЕМА: Светодиодная панель («сделай сам», конечно же!), Установленная на потолке моей мастерской / гаража, подключена к розетке на потолке. Мне нужен был способ удаленно включать и выключать его от того места, где расположены основные выключатели света. РЕШЕНИЕ: