Daftar Isi:

Tombol Ajaib 4k: Remote Control Nirkabel BMPCC 4k (atau 6k) 20USD: 4 Langkah (dengan Gambar)
Tombol Ajaib 4k: Remote Control Nirkabel BMPCC 4k (atau 6k) 20USD: 4 Langkah (dengan Gambar)

Video: Tombol Ajaib 4k: Remote Control Nirkabel BMPCC 4k (atau 6k) 20USD: 4 Langkah (dengan Gambar)

Video: Tombol Ajaib 4k: Remote Control Nirkabel BMPCC 4k (atau 6k) 20USD: 4 Langkah (dengan Gambar)
Video: Новый и доступный стабилизатор Feiyutech Scorp-C — подробный обзор! 2024, Juli
Anonim
Image
Image

Banyak orang telah meminta saya untuk membagikan beberapa detail tentang pengontrol nirkabel saya untuk BMPCC4k. Sebagian besar pertanyaan adalah tentang kontrol bluetooth, jadi saya akan menyebutkan beberapa detail tentang itu. Saya berasumsi Anda sudah familiar dengan lingkungan Arduino ESP32.

Versi remote ini dapat mengontrol perekaman, fokus, dan bukaan kamera melalui bluetooth. Lihat videonya. Cukup mudah untuk menambahkan lebih banyak fungsi kontrol sesuai manual kontrol bluetooth dari BMPCC4k. Pada dasarnya apa pun di kamera dapat dikontrol, sejauh yang saya lihat.

Ini akan menjadi langkah mudah untuk menambahkan modul LIDAR untuk mengukur jarak subjek, sehingga Anda bisa mendapatkan semacam sistem fokus otomatis… Meskipun dipertanyakan apakah Anda bisa mendapatkan fokus yang cukup akurat ke area tertentu seperti mata dll…

PEMBARUAN 2020: Saya membuat versi 3.0. Ini didasarkan pada roda berputar bebas menggunakan encoder magnetik. Ini juga terhubung ke motor fokus saya, yang pada dasarnya menjadi perangkat bluetooth kedua (ESP32 mendukung beberapa koneksi bluetooth). Video baru menunjukkan ini.

Jika Anda ingin memesan versi 3, silakan lihat di situs web MagicButton

Perlengkapan

Setiap modul ESP32 dengan wifi dan bluetooth. Saya menggunakan TTGO micro32 karena kecil:

Roda fokus, potensiometer apa pun bisa digunakan. Saya menggunakan yang berikut ini karena kecil:https://www.aliexpress.com/item/32963061806.html?s…Jenis ini memiliki pemberhentian yang sulit di batas atas dan bawah. Di versi mendatang saya akan menggunakan rotary encoder. Dengan cara ini fokus atau bukaan tidak "melompat" ke pengaturan roda saat ini saat saya memasuki mode.

Sebuah tombol rec/mode. Saya menggunakan yang berikut ini:

Komponen standar lainnya seperti resistor, tutup, … (lihat skema)

Langkah 1: Kode

Saya menggunakan kemampuan wifi ESP32 untuk terhubung ke jaringan yang dikenal dalam mode AP, atau, ketika saya di lapangan, itu menjadi stasiun (STA) yang dapat saya sambungkan. Dengan begitu saya dapat mengkonfigurasi modul. Saya tidak akan membahas detail bagian wifi/halaman web, saya mungkin menambahkan ini di tahap selanjutnya.

ESP32 terhubung ke kamera dan menjadi klien Bluetooth LE. Kode bluetooth yang disertakan dalam kerangka ESP32 Arduino tidak berfungsi dengan BMPCC4k. Wakwak-koba telah memperbaikinya untuk kami. Terima kasih Wakwak-koba! Saya menggunakan perpustakaan BLE dari sini:

github.com/wakwak-koba/arduino-esp32

Namun demikian versi lib BLE masih dalam pengembangan dan versi terbaru BLEUUID.cpp tampaknya tidak berfungsi saat ini, jadi gunakan versi "terverifikasi" sebelumnya dari file ini.

Selebihnya, sebagian besar kode bluetooth saya sesuai dengan contoh BLE yang disertakan dalam kerangka Arduino:

Beberapa UUID dan variabel BLE mendefinisikan:

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

static BLEUUID ControlserviceUUID("291D567A-6D75-11E6-8B77-86F30CA893D3"); static BLEUUID DevInfoServiceControlUUID("180A"); static BLEUUID ControlcharUUID("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); static BLEUUID NotifcharUUID("B864E140-76A0-416A-BF30-5876504537D9"); static BLEUUID ClientNamecharUUID("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); static BLEUUID CamModelcharUUID("2A24"); static BLEScan *pBLEScan = BLEDevice::getScan(); BLAddress statis *pServerAddress; static BLAdvertisedDevice* myDevice; static BLERemoteKarakteristik *pKontrolKarakteristik; static BLERemoteKarakteristik *pNotifKarakteristik; doConnect boolean statis =0; boolean statis terhubung =0; pemindaian volatilebool =0; volatileuint32_t kode pin;

Pemindaian dan loop utama:

class MyAdvertisedDeviceCallbacks: BLAdvertisedDeviceCallbacks publik{

void onResult(BLEadvertisedDevice advertisedDevice) { Serial.print("Perangkat yang Diiklankan BLE ditemukan: "); Serial.println(AdvertisedDevice.toString().c_str()); if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(BlackMagic)) { Serial.print("Menemukan perangkat kami!"); advertisedDevice.getScan()->stop(); myDevice = new BLAdvertisedDevice(advertisedDevice); doConnect = benar; } } }; static void scanCompleteCB(BLEScanResults scanResults) { Serial.println("scanning done"); pemindaian = salah; } void loop(void) { if (!terhubung && ((uint32_t)(millis() - Timer) > BLE_RESCAN_TIME || (!scanning))) { Serial.println("scanning…"); pemindaian = benar; pBLEScan->start(BLE_SCAN_TIME, scanCompleteCB); Timer = milis(); } if (doConnect ==true) { if (connectToServer()) { Serial.println("Kita sekarang terhubung ke Server BLE."); terhubung = benar; } else { Serial.println("Kami gagal terhubung ke server; tidak ada lagi yang akan kami lakukan."); } doConnect = salah; } }

Menghubungkan ke kamera:

bool connectToServer(){

Serial.print("Membentuk koneksi ke "); Serial.println(myDevice->getAddress().toString().c_str()); BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT); BLEDevice::setSecurityCallbacks(MySecurity baru()); BLESecurity *pSecurity = baru BLESecurity(); pKeamanan->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 baru()); pClient->koneksi(myDevice); Serial.println(" - Tersambung ke server"); Perangkat BLED::setMTU(Perangkat BLED::getMTU()); // MENDAPATKAN MODEL KAMERA BLERemoteService *pRemoteService = pClient->getService(DevInfoServiceControlUUID); if (pRemoteService == nullptr) { Serial.print(" - Gagal mendapatkan layanan info perangkat"); Serial.println(DevInfoServiceControlUUID.toString().c_str()); harus gagal; } Serial.println(" - Membaca info perangkat"); // Dapatkan referensi ke karakteristik dalam layanan server BLE jarak jauh. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService->getCharacteristic(CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) { Serial.print(" - Gagal menemukan model kamera"); Serial.println(CamModelcharUUID.toString().c_str()); harus gagal; } // Baca nilai karakteristiknya. std::nilai string = pRemoteCamModelCharacteristic->readValue(); Serial.print("Kamera adalah "); Serial.println(nilai.c_str()); if (CamModel != value.c_str()) { Serial.print(" - Kamera bukan BMPCC4k"); harus gagal; } // MENDAPATKAN KONTROL pRemoteService = pClient->getService(ControlserviceUUID); if (pRemoteService == nullptr) { Serial.print(" - Gagal mendapatkan layanan kamera"); Serial.println(ControlserviceUUID.toString().c_str()); harus gagal; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService->getCharacteristic(ClientNamecharUUID); if (pRemoteClientNameCharacteristic != nullptr) { pRemoteClientNameCharacteristic->writeValue(NamaSaya.c_str(), NamaSaya.panjang()); } pControlCharacteristic = pRemoteService->getCharacteristic(ControlcharUUID); if (pControlCharacteristic == nullptr) { Serial.print(" - Gagal mendapatkan karakteristik kontrol"); Serial.println(ControlcharUUID.toString().c_str()); harus gagal; } pNotifCharacteristic = pRemoteService->getCharacteristic(NotifcharUUID); if (pNotifCharacteristic != nullptr) // && pNotifCharacteristic->canIndicate()) { Serial.println(" - berlangganan notifikasi"); const uint8_t indikasiOn = {0x2, 0x0}; pNotifCharacteristic->registerForNotify(notifyCallback, false); pNotifCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)indicationOn, 2, true); } kembali benar; gagal: pClient->disconnect(); kembali salah; }

Panggilan balik yang terhubung/terputus:

kelas MyClientCallback: BLEClientCallbacks publik{

void onConnect(BLEClient *pclient) { Serial.println("Kita terhubung."); } void onDisconnect(BLEClient *pclient) { terhubung =false; pclient->disconnect(); Serial.println("Kami terputus."); } };

Bagian kode pin:

Dalam versi saya saat ini, saya dapat memasukkan kode pin melalui antarmuka web tetapi ini adalah detail wifi/halaman web yang mungkin saya tambahkan nanti.

kelas MySecurity: BLESecurityCallbacks publik

{ uint32_t onPassKeyRequest() { Serial.println("- HARAP MASUKKAN 6 DIGIT PIN (diakhiri dengan ENTER): "); kode pin =0; karakter ch; lakukan { while (!Serial.available()) { delay(1); } ch = Serial.read(); if (ch >='0'&& ch <='9') { pinCode = pinCode *10+ (ch -'0'); Serial.print(ch); } } while ((ch !='\n')); mengembalikan kode pin; } void onPassKeyNotify(uint32_t pass_key) { ESP_LOGE(LOG_TAG, "Kunci sandi Beri tahu nomor:%d", kunci sandi); } bool onConfirmPIN(uint32_t pass_key) { ESP_LOGI(LOG_TAG, "Kunci sandi YA/TIDAK nomor:%d", pass_key); vTaskDelay(5000); kembali benar; } bool onSecurityRequest() { ESP_LOGI(LOG_TAG, "Permintaan Keamanan"); kembali benar; } void onAuthenticationComplete(esp_ble_auth_cmpl_t auth_cmpl) { Serial.print("status pasangan = "); Serial.println(auth_cmpl.success); } };

Pemberitahuan BLE:

Kamera memberi tahu klien BLE tentang perubahan kamera apa pun, termasuk saat kamera mulai dan berhenti merekam. Kode ini mengaktifkan LED saya ketika mulai/berhenti merekam.

static void notifyCallback(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) { // BMPCC4k BLE format pesan:// rec on adalah 255 9 0 0 10 1 1 2 2 0 64 0 2// rec off adalah 255 9 0 0 10 1 1 2 0 0 64 0 2if (panjang ==13&& pData[0] ==255&& pData[1] ==9&& pData[4] ==10&& pData[5] ==1) { if (pData[8] ==0) { status ulang =0; } if (pData[8] ==2) { recstatus =1; } } }

Langkah 2: Kode Bagian 2

Ini adalah bagian yang sebenarnya mengirimkan perintah ke kamera.

Rekaman:

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; catatan lain[8] =2; pControlCharacteristic->writeValue((uint8_t*)record, 16, true); }

Memfokuskan:

Kamera mengharapkan angka 11 bit, mulai dari fokus dekat hingga jauh. Saya menyarankan untuk memasang filter pada nilai ADC Anda, jika tidak, fokusnya mungkin gugup.

uint8_t fokus = {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) { //beralih dari nilai ADC 12bit ke nilai fokus 11bit fokus[8] = (uint8_t)(((val > >1) &0xFF)); fokus[9] = (uint8_t)(((val >>1) &0xFF00) >>8); pControlCharacteristic->writeValue((uint8_t*)fokus, 12, benar); }

Bukaan:

Kamera mengharapkan angka 11 bit, mulai dari nilai aperture rendah hingga tinggi. Saya menyarankan untuk memasang filter pada nilai ADC Anda, jika tidak, nilai aperture mungkin akan membuat Anda gugup.

bukaan uint8_t = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0 … 1.0, [8]=LSB, [9]=MSBvoid Aperture(uint16_t val) { //beralih dari nilai ADC 12bit ke aperture nilai 11bit[8] = (uint8_t)(((val >>1) &0xFF)); bukaan[9] = (uint8_t)(((val >>1) &0xFF00) >>8); pControlCharacteristic->writeValue((uint8_t*)aperture, 12, true); }

Langkah 3: Sirkuit

Sirkuit
Sirkuit

Saya telah melampirkan PDF sirkuit saya. Beberapa pics dari PCB juga terlampir.

Papan ini didukung dengan micro USB.

Setelah menerima PCB, saya memutuskan bahwa saya ingin menggerakkan LED RGB, jadi saya menghubungkan dua WS2812B secara seri ke output "Button Led" (yang membutuhkan beberapa tambalan kawat pada PCB). PCB adalah 8USD dengan OSHPark.com.

Anda dapat melihat beberapa koneksi lagi pada PCB seperti "adc" yang tidak saya gunakan dan yang telah dihapus dari skema terlampir. Rencananya adalah menggunakan roda fokus eksternal di masa lalu, tetapi saat ini saya sangat senang dengan roda jempol kecil.

Langkah 4: Kesimpulan

Saya harap ini membantu.

Saya telah memikirkan beberapa pembaruan di masa mendatang, seperti menggunakan encoder putar tanpa henti. Ini akan membutuhkan pengontrol untuk mendapatkan nilai fokus atau bukaan saat ini dari kamera, dan melanjutkan dari sana. Fungsi "notifyCallback" perlu diperbarui untuk itu mungkin.

PCB membutuhkan pembaruan untuk memberikan sinyal untuk LED RGB WS2812B dengan benar.

Saya menghabiskan banyak (banyak) waktu dalam membuat karya ini, terutama bagian BLE. Jika ini membantu Anda dan Anda ingin membelikan saya minuman, itu sangat dihargai:) Ini adalah tautan donasi Paypal:

Direkomendasikan: