Isi kandungan:

Magic Button 4k: Alat Kawalan Jauh Tanpa Wayar 20USD BMPCC 4k (atau 6k): 4 Langkah (dengan Gambar)
Magic Button 4k: Alat Kawalan Jauh Tanpa Wayar 20USD BMPCC 4k (atau 6k): 4 Langkah (dengan Gambar)

Video: Magic Button 4k: Alat Kawalan Jauh Tanpa Wayar 20USD BMPCC 4k (atau 6k): 4 Langkah (dengan Gambar)

Video: Magic Button 4k: Alat Kawalan Jauh Tanpa Wayar 20USD BMPCC 4k (atau 6k): 4 Langkah (dengan Gambar)
Video: New Rc Drone//Remote Control Drone #shorts 2024, November
Anonim
Image
Image

Ramai orang meminta saya berkongsi beberapa butiran mengenai alat kawalan wayarles saya untuk BMPCC4k. Sebilangan besar soalan adalah mengenai kawalan bluetooth, jadi saya akan menyebutkan beberapa butiran mengenai perkara itu. Saya menganggap anda sudah biasa dengan persekitaran ESP32 Arduino.

Alat kawalan jauh versi ini dapat mengawal rakaman, fokus dan bukaan kamera melalui bluetooth. Lihat video. Cukup mudah untuk menambahkan lebih banyak fungsi kawalan mengikut manual kawalan bluetooth BMPCC4k. Pada dasarnya apa sahaja yang ada di dalam kamera dapat dikendalikan, sejauh yang saya lihat.

Ini adalah langkah mudah untuk menambahkan modul LIDAR untuk mengukur jarak subjek, jadi anda boleh mendapatkan semacam sistem autofokus … Walaupun boleh dipersoalkan jika anda dapat memperoleh fokus yang cukup tepat ke bidang tertentu seperti mata dll …

UPDATE 2020: Saya membuat versi 3.0. Ia berdasarkan roda berputar bebas menggunakan pengekod magnetik. Ia juga menghubungkan ke motor fokus ikuti saya, yang pada dasarnya menjadi peranti bluetooth kedua (ESP32 menyokong pelbagai sambungan bluetooth). Video baru menunjukkan ini.

Sekiranya anda ingin memesan versi 3, sila lihat di laman web MagicButton

Bekalan

Mana-mana modul ESP32 dengan wifi dan bluetooth. Saya menggunakan TTGO micro32 kerana ia kecil:

Roda fokus, potensiometer akan dilakukan. Saya menggunakan yang berikut kerana ia kecil: https://www.aliexpress.com/item/32963061806.html? S … Jenis ini mempunyai hentian keras di sempadan atas dan bawah. Pada versi yang akan datang saya akan menggunakan pengekod putar. Dengan cara ini fokus atau aperture tidak "melompat" ke tetapan roda semasa ketika saya memasuki mod.

Butang rec / mode. Saya menggunakan yang berikut: https://www.aliexpress.com/item/32806223591.html? S…

Komponen standard lain seperti perintang, penutup, … (lihat skema)

Langkah 1: Kodnya

Saya menggunakan keupayaan wifi ESP32 untuk menyambung ke rangkaian yang dikenali dalam mod AP, atau, ketika saya berada di lapangan, ia menjadi stesen (STA) yang boleh saya sambungkan. Dengan cara itu saya dapat mengkonfigurasi modul. Saya tidak akan memperincikan bahagian wifi / laman web, saya mungkin menambahkannya pada peringkat kemudian.

ESP32 menyambung ke kamera dan menjadi pelanggan Bluetooth LE. Kod bluetooth yang termasuk dalam kerangka ESP32 Arduino tidak berfungsi dengan BMPCC4k. Wakwak-koba telah memperbaikinya untuk kita. Terima kasih Wakwak-koba! Saya menggunakan perpustakaan BLE dari sini:

github.com/wakwak-koba/arduino-esp32

Walaupun begitu, versi BLE lib masih dalam pengembangan dan versi terbaru BLEUUID.cpp nampaknya tidak berfungsi pada masa ini, jadi ambil versi "disahkan" sebelumnya dari fail ini.

Selebihnya, kebanyakan kod bluetooth saya banyak mengikut contoh BLE yang termasuk dalam kerangka Arduino:

Beberapa BLE UUID dan pemboleh ubah mentakrifkan:

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

BLEUUID ControlserviceUUID statik ("291D567A-6D75-11E6-8B77-86F30CA893D3"); BLEUUID DevInfoServiceControlUUID statik ("180A"); BLEUUID ControlcharUUID statik ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); NotifcharUUID BLEUUID statik ("B864E140-76A0-416A-BF30-5876504537D9"); ClientNamecharUUID BLEUUID statik ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); BLEUUID CamModelcharUUID statik ("2A24"); BLEScan statik * pBLEScan = BLEDevice:: getScan (); BLEAddress statik * pServerAddress; BLEAdvertisedDevice statik * myDevice; BLERemoteCharacteristic statik * pControlCharacteristic; BLERemoteCharacteristic statik * pNotifCharacteristic; doConnect boolean statik = 0; boolean statik bersambung = 0; pengimbasan volatilebool = 0; volatileuint32_t pinCode;

Pengimbasan dan gelung utama:

kelas MyAdvertisedDeviceCallbacks: awam BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice diiklankanDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (advertisedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). sama dengan (BlackMagic)) {Serial.print ("Found your device!"); advertisedDevice.getScan () -> berhenti (); myDevice = BLEAdvertisedDevice baru (advertisedDevice); doConnect = benar; }}}; imbasan kosong statikCompleteCB (BLEScanResults scanResults) {Serial.println ("pengimbasan selesai"); mengimbas = salah; } gelung void (kekosongan) {if (! connect && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning…"); mengimbas = benar; pBLEScan-> mula (BLE_SCAN_TIME, scanCompleteCB); Pemasa = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Kami sekarang disambungkan ke Pelayan BLE."); bersambung = benar; } lain {Serial.println ("Kami gagal menyambung ke pelayan; tidak ada lagi yang akan kami lakukan."); } doConnect = salah; }}

Menyambung ke kamera:

bool connectToServer () {

Serial.print ("Membentuk sambungan ke"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (MySecurity baru ()); BLESecurity * pSecurity = BLESecurity baru (); 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 baru ()); pClient-> sambung (myDevice); Serial.println ("- Disambungkan ke pelayan"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // MENDAPATKAN MODEL KAMERA BLERemoteService * pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print ("- Gagal mendapatkan perkhidmatan maklumat peranti"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); goto gagal; } Serial.println ("- Membaca maklumat peranti"); // Dapatkan rujukan mengenai ciri dalam perkhidmatan pelayan BLE yang jauh. BLERemoteCharacteristic * pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("- Gagal mencari model kamera"); Serial.println (CamModelcharUUID.toString (). C_str ()); goto gagal; } // Baca nilai ciri. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera adalah"); Serial.println (nilai.c_str ()); if (CamModel! = value.c_str ()) {Serial.print ("- Kamera tidak BMPCC4k"); goto gagal; } // MENDAPATKAN KAWALAN pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print ("- Gagal mendapatkan perkhidmatan kamera"); Serial.println (ControlserviceUUID.toString (). C_str ()); goto gagal; } BLERemoteCharacteristic * pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print ("- Gagal mendapatkan ciri kawalan"); Serial.println (ControlcharUUID.toString (). C_str ()); goto gagal; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println ("- melanggan pemberitahuan"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902)) -> writeValue ((uint8_t *) petunjukOn, 2, true); } kembali benar; gagal: pClient-> putuskan sambungan (); kembali palsu; }

Panggilan balik yang bersambung / terputus:

kelas MyClientCallback: awam BLEClientCallbacks {

void onConnect (BLEClient * pclient) {Serial.println ("Kami disambungkan."); } batal onDisconnect (BLEClient * pclient) {connect = false; pclient-> putuskan sambungan (); Serial.println ("Kami terputus."); }};

Bahagian kod pin:

Dalam versi semasa saya boleh memasukkan kode PIN melalui antara muka web tetapi ini adalah perincian wifi / halaman web yang mungkin saya tambahkan kemudian.

kelas MySecurity: BLESecurityCallbacks awam

{uint32_t onPassKeyRequest () {Serial.println ("- SILA Masukkan 6 PIN DIGIT (diakhiri dengan ENTER):"); pinCode = 0; char ch; lakukan {sementara (! Serial.available ()) {kelewatan (1); } ch = Serial.read (); jika (ch> = '0' && ch <= '9') {pinCode = pinCode * 10 + (ch -'0 '); Cetakan bersiri (ch); }} semasa ((ch! = '\ n')); kembalikan pinCode; } batal onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Nombor notifikasi kata laluan:% d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Nombor laluan YA / TIDAK nombor:% d", pass_key); vTaskDelay (5000); jalan balik; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Permintaan Keselamatan"); jalan balik; } batal onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("status pasangan ="); Serial.println (auth_cmpl.success); }};

Pemberitahuan BLE:

Kamera memberitahu klien BLE tentang perubahan kamera, termasuk ketika kamera memulakan dan berhenti merakam. Kod ini menukar LED saya semasa memulakan / berhenti merakam.

statik kekosongan notifyCallback (BLERemoteCharacteristic * pBLERemoteCharacteristic, uint8_t * pData, size_t length, bool isNotify) {// Format mesej BLE BMPCC4k: // rec on is 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) { recstatus = 0; } jika (pData [8] == 2) {recstatus = 1; }}}

Langkah 2: Kod Bahagian 2

Ini adalah bahagian yang sebenarnya menghantar arahan ke kamera.

Rakaman:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] batal Record (boolean RecOn) {if (! RecOn) rekod [8] = 0; rekod lain [8] = 2; pControlCharacteristic-> writeValue ((uint8_t *) rekod, 16, benar); }

Berfokus:

Kamera menjangkakan nombor 11 bit, dari fokus dekat hingga jauh. Saya sarankan untuk meletakkan penapis pada nilai ADC anda, jika tidak, tumpuan mungkin gugup.

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

Bukaan:

Kamera menjangkakan nombor 11 bit, mulai dari nilai apertur rendah hingga tinggi. Saya sarankan untuk meletakkan penapis pada nilai ADC anda, jika tidak, nilai aperture mungkin gugup.

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

Langkah 3: Litar

Litar
Litar

Saya telah melampirkan PDF litar saya. Beberapa gambar PCB juga dilampirkan.

Papan ini dikuasakan dengan USB mikro.

Setelah menerima PCB, saya memutuskan untuk menggerakkan LED RGB, jadi saya menghubungkan dua siri WS2812B ke output "Button Led" (yang memerlukan beberapa tambalan wayar pada PCB). PCB mempunyai 8USD dengan OSHPark.com.

Anda dapat melihat beberapa lagi sambungan pada PCB seperti "adc" yang tidak saya gunakan dan yang dikeluarkan dari skema yang dilampirkan. Rancangannya adalah untuk menggunakan roda fokus luaran pada masa lalu tetapi pada masa ini saya sangat gembira dengan roda ibu jari kecil.

Langkah 4: Kesimpulannya

Saya harap ini dapat membantu.

Saya ingat beberapa kemas kini masa depan, seperti menggunakan encoder berputar tanpa berhenti keras. Ini memerlukan pengawal untuk mendapatkan nilai fokus atau bukaan semasa dari kamera, dan terus dari situ. Fungsi "notifyCallback" perlu dikemas kini untuk itu.

PCB memerlukan kemas kini untuk memberikan isyarat untuk WS2812B RGB LED dengan betul.

Saya menghabiskan banyak masa untuk membuat karya ini, terutamanya bahagian BLE. Sekiranya ini membantu anda dan anda ingin membeli saya minuman, itu sangat dihargai:) Ini adalah pautan derma Paypal:

Disyorkan: