Mục lục:

Magic Button 4k: Điều khiển từ xa không dây BMPCC 4k (hoặc 6k) 20USD: 4 bước (có hình ảnh)
Magic Button 4k: Điều khiển từ xa không dây BMPCC 4k (hoặc 6k) 20USD: 4 bước (có hình ảnh)

Video: Magic Button 4k: Điều khiển từ xa không dây BMPCC 4k (hoặc 6k) 20USD: 4 bước (có hình ảnh)

Video: Magic Button 4k: Điều khiển từ xa không dây BMPCC 4k (hoặc 6k) 20USD: 4 bước (có hình ảnh)
Video: Điều khiển máy ảnh với Máy ảnh rạp chiếu phim bỏ túi ATEM Mini và Blackmagic (BMPCC) 2024, Tháng mười một
Anonim
Image
Image

Nhiều người đã yêu cầu tôi chia sẻ một số thông tin chi tiết về bộ điều khiển không dây của tôi cho BMPCC4k. Hầu hết các câu hỏi là về điều khiển bluetooth, vì vậy tôi sẽ đề cập một vài chi tiết về điều đó. Tôi giả sử bạn đã quen thuộc với môi trường Arduino ESP32.

Phiên bản này của điều khiển từ xa có thể điều khiển ghi, lấy nét và khẩu độ của máy ảnh thông qua bluetooth. Hãy xem video. Thật dễ dàng để thêm nhiều chức năng điều khiển hơn theo hướng dẫn điều khiển bluetooth của BMPCC4k. Về cơ bản, mọi thứ trong máy ảnh đều có thể được kiểm soát, theo như tôi đã thấy.

Sẽ là một bước dễ dàng nếu bạn thêm một mô-đun LIDAR để đo khoảng cách của một đối tượng, vì vậy bạn có thể có được một số loại hệ thống lấy nét tự động… Mặc dù vẫn còn nghi vấn nếu bạn có thể lấy nét đủ chính xác vào các khu vực cụ thể như mắt, v.v.

CẬP NHẬT 2020: Tôi đã tạo phiên bản 3.0. Nó dựa trên một bánh xe quay tự do sử dụng bộ mã hóa từ tính. Nó cũng kết nối với động cơ lấy nét theo dõi của tôi, về cơ bản trở thành thiết bị bluetooth thứ hai (ESP32 hỗ trợ nhiều kết nối bluetooth). Video mới minh chứng điều này.

Nếu bạn muốn đặt hàng phiên bản 3, vui lòng xem trên trang web MagicButton

Quân nhu

Bất kỳ mô-đun ESP32 nào có wifi và bluetooth. Tôi đã sử dụng TTGO micro32 vì nó nhỏ:

Một bánh xe lấy nét, bất kỳ chiết áp nào cũng vậy. Tôi đã sử dụng cái sau vì nó nhỏ: https://www.aliexpress.com/item/32963061806.html? S … Loại này có điểm dừng cứng ở ranh giới trên và dưới. Trong phiên bản tương lai, tôi sẽ sử dụng bộ mã hóa quay. Bằng cách này, tiêu điểm hoặc khẩu độ không "nhảy" đến cài đặt bánh xe hiện tại khi tôi vào một chế độ.

Một nút rec / mode. Tôi đã sử dụng như sau: https://www.aliexpress.com/item/32806223591.html? S…

Các thành phần tiêu chuẩn khác như điện trở, nắp,… (xem sơ đồ)

Bước 1: Mã

Tôi sử dụng khả năng wifi của ESP32 để kết nối với một mạng đã biết ở chế độ AP hoặc khi tôi ở hiện trường, nó sẽ trở thành một trạm (STA) mà tôi có thể kết nối. Bằng cách đó tôi có thể cấu hình mô-đun. Tôi sẽ không đi vào chi tiết của phần wifi / trang web, tôi có thể thêm phần này vào giai đoạn sau.

ESP32 kết nối với máy ảnh và trở thành một ứng dụng khách Bluetooth LE. Mã bluetooth có trong khung ESP32 của Arduino không hoạt động với BMPCC4k. Wakwak-koba đã sửa nó cho chúng tôi. Cảm ơn bạn Wakwak-koba! Tôi đã sử dụng thư viện BLE từ đây:

github.com/wakwak-koba/arduino-esp32

Tuy nhiên, phiên bản BLE lib đó vẫn đang được phát triển và phiên bản mới nhất của BLEUUID.cpp dường như không hoạt động tại thời điểm này, vì vậy hãy sử dụng phiên bản "đã được xác minh" trước đó của tệp này.

Đối với phần còn lại, hầu hết mã bluetooth của tôi là rất nhiều theo các ví dụ BLE có trong khung Arduino:

Một số BLE UUID và biến xác định:

static BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");

static BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); static BLEUUID DevInfoServiceControlUUID ("180A"); static BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); tĩnh BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); static BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); static BLEUUID CamModelcharUUID ("2A24"); static BLEScan * pBLEScan = BLEDevice:: getScan (); static BLEAddress * pServerAddress; static BLEAdvertisedDevice * myDevice; tĩnh BLERemoteCharacteristic * pControlCharacteristic; BLERemoteCharacteristic tĩnh * pNotifCharacteristic; static boolean doConnect = 0; boolean tĩnh được kết nối = 0; quét dễ bay hơi = 0; Biến thể mã pinCode_t;

Vòng quét và vòng lặp chính:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice AdvertisingDevice) {Serial.print ("Tìm thấy Thiết bị được Quảng cáo BLE:"); Serial.println (AdvertisingDevice.toString (). C_str ()); if (AdvertisingDevice.haveServiceUUID () && AdvertisingDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Đã tìm thấy thiết bị của chúng tôi!"); AdvertisingDevice.getScan () -> stop (); myDevice = new BLEAdvertisedDevice (AdvertisingDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("quét xong"); quét = sai; } void loop (void) {if (! connect && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scan))) {Serial.println ("scan…"); quét = true; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Chúng tôi hiện đã kết nối với Máy chủ BLE."); kết nối = true; } else {Serial.println ("Chúng tôi không kết nối được với máy chủ; chúng tôi sẽ không làm gì nữa."); } doConnect = false; }}

Kết nối với máy ảnh:

bool connectToServer () {

Serial.print ("Đang tạo kết nối tới"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (MySecurity mới ()); BLESecurity * pSecurity = new 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 mới ()); pClient-> kết nối (myDevice); Serial.println ("- Đã kết nối với máy chủ"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // ĐƯA RA MÔ HÌNH MÁY ẢNH BLERemoteService * pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print ("- Không tải được dịch vụ thông tin thiết bị"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); goto fail; } Serial.println ("- Đọc thông tin thiết bị"); // Lấy tham chiếu đến đặc tính trong dịch vụ của máy chủ BLE từ xa. BLERemoteCharacteristic * pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("- Không tìm thấy kiểu máy ảnh"); Serial.println (CamModelcharUUID.toString (). C_str ()); goto fail; } // Đọc giá trị của đặc trưng. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Máy ảnh là"); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print ("- Camera không phải là BMPCC4k"); goto fail; } // KIỂM SOÁT HỖ TRỢ pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print ("- Không tải được dịch vụ camera"); Serial.println (ControlserviceUUID.toString (). C_str ()); goto fail; } BLERemoteCharacteristic * pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print ("- Không lấy được đặc tính điều khiển"); Serial.println (ControlcharUUID.toString (). C_str ()); goto fail; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println ("- đăng ký nhận thông báo"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (thông báoCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902)) -> writeValue ((uint8_t *) indicationOn, 2, true); } trả về true; fail: pClient-> ngắt kết nối (); trả về sai; }

Cuộc gọi lại đã kết nối / ngắt kết nối:

lớp MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient * pclient) {Serial.println ("Chúng tôi đã kết nối."); } void onDisconnect (BLEClient * pclient) {connect = false; pclient-> ngắt kết nối (); Serial.println ("Chúng tôi đã ngắt kết nối."); }};

Phần mã pin:

Trong phiên bản hiện tại của tôi, tôi có thể nhập mã pin qua giao diện web nhưng đây là chi tiết wifi / trang web mà tôi có thể thêm sau.

lớp MySecurity: công khai BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- VUI LÒNG NHẬP 6 mã PIN DIGIT (kết thúc bằng ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode * 10 + (ch -'0 '); Serial.print (ch); }} while ((ch! = '\ n')); trả về mã pin; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Số thông báo của passkey:% d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Số mật mã CÓ / KHÔNG:% d", pass_key); vTaskDelay (5000); người trả lại; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Yêu cầu bảo mật"); người trả lại; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

Thông báo BLE:

Máy ảnh thông báo cho khách hàng BLE của mình về bất kỳ thay đổi nào của máy ảnh, bao gồm cả thời điểm máy ảnh khởi động và dừng quay. Mã này bật tắt đèn LED của tôi khi nó bắt đầu / dừng ghi.

static void InformCallback (BLERemoteCharacteristic * pBLERemoteCharacteristic, uint8_t * pData, size_t length, bool isNotify) {// BMPCC4k Định dạng thông báo BLE: // rec on là 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off là 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; } if (pData [8] == 2) {recstatus = 1; }}}

Bước 2: Mã Phần 2

Đây là phần thực sự gửi các lệnh đến máy ảnh.

Ghi âm:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] void Record (boolean RecOn) {if (! RecOn) record [8] = 0; bản ghi khác [8] = 2; pControlCharacteristic-> writeValue ((uint8_t *) record, 16, true); }

Tập trung:

Máy ảnh mong đợi một con số 11 bit, từ tiêu cự gần đến tiêu cự xa. Tôi khuyên bạn nên đặt một bộ lọc trên giá trị ADC của bạn, nếu không tiêu điểm có thể nhấp nháy một cách lo lắng.

uint8_t focus = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, 11bit, [8] = LSB, [9] = MSBvoid Focus (uint16_t val) {// chuyển từ giá trị ADC 12bit sang tiêu điểm giá trị tiêu điểm 11bit [8] = (uint8_t) (((val> > 1) & 0xFF)); tiêu điểm [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t *) focus, 12, true); }

Miệng vỏ:

Máy ảnh mong đợi một con số 11 bit, nằm trong khoảng từ giá trị khẩu độ thấp đến cao. Tôi khuyên bạn nên đặt một bộ lọc trên giá trị ADC của bạn, nếu không giá trị khẩu độ có thể bị chập chờn một cách lo lắng.

uint8_t khẩu độ = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// đi từ giá trị ADC 12 bit sang giá trị khẩu độ 11 bit khẩu độ [8] = (uint8_t) (((val >> 1) & 0xFF)); khẩu độ [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t *) khẩu độ, 12, true); }

Bước 3: Mạch

Mạch
Mạch

Tôi đã đính kèm bản PDF của mạch của tôi. Một số bức ảnh của PCB cũng được đính kèm.

Bo mạch được cấp nguồn bằng micro USB.

Sau khi nhận được PCB, tôi quyết định rằng tôi muốn lái một đèn LED RGB, vì vậy tôi đã kết nối hai WS2812B nối tiếp với đầu ra "Đèn LED nút" (cần một số bản vá dây trên PCB). PCB là 8 USD với OSHPark.com.

Bạn có thể thấy thêm một số kết nối trên PCB chẳng hạn như "adc" mà tôi không sử dụng và đã bị xóa khỏi sơ đồ đính kèm. Trước đây, kế hoạch là sử dụng bánh xe lấy nét bên ngoài nhưng hiện tại tôi hoàn toàn hài lòng với bánh xe ngón tay cái nhỏ.

Bước 4: Kết luận

Tôi hy vọng điều này đã giúp.

Tôi đã lưu ý đến một số cập nhật trong tương lai, chẳng hạn như sử dụng bộ mã hóa quay không có điểm dừng. Điều này sẽ yêu cầu bộ điều khiển lấy giá trị hiện tại của tiêu điểm hoặc khẩu độ từ máy ảnh và tiếp tục từ đó. Có lẽ cần phải cập nhật chức năng "InformCallback".

PCB cần cập nhật để cung cấp tín hiệu cho đèn LED RGB WS2812B đúng cách.

Tôi đã dành rất nhiều (rất nhiều) thời gian để thực hiện tác phẩm này, đặc biệt là phần BLE. Nếu điều này giúp bạn ra ngoài và bạn muốn mua đồ uống cho tôi, điều đó rất được đánh giá cao:) Đây là liên kết quyên góp Paypal:

Đề xuất: