Talaan ng mga Nilalaman:

Magic Button 4k: ang 20USD BMPCC 4k (o 6k) Wireless Remote Control: 4 Mga Hakbang (na may Mga Larawan)
Magic Button 4k: ang 20USD BMPCC 4k (o 6k) Wireless Remote Control: 4 Mga Hakbang (na may Mga Larawan)

Video: Magic Button 4k: ang 20USD BMPCC 4k (o 6k) Wireless Remote Control: 4 Mga Hakbang (na may Mga Larawan)

Video: Magic Button 4k: ang 20USD BMPCC 4k (o 6k) Wireless Remote Control: 4 Mga Hakbang (na may Mga Larawan)
Video: GoPro 11 vs iPhone Gimbal! 2024, Hulyo
Anonim
Image
Image

Maraming tao ang humiling sa akin na magbahagi ng ilang mga detalye tungkol sa aking wireless controller para sa BMPCC4k. Karamihan sa mga katanungan ay tungkol sa kontrol ng bluetooth, kaya't babanggitin ko ang ilang mga detalye tungkol doon. Ipinapalagay kong pamilyar ka sa kapaligiran ng ESP32 Arduino.

Ang bersyon na ito ng remote ay maaaring makontrol ang pag-record, pagtuon at siwang ng camera sa pamamagitan ng bluetooth. Tingnan ang video. Napakadali upang magdagdag ng higit pang mga pag-andar ng kontrol ayon sa manu-manong kontrol ng bluetooth ng BMPCC4k. Talaga ang anumang bagay sa camera ay maaaring makontrol, ayon sa nakita ko.

Ito ay magiging isang madaling hakbang upang magdagdag ng isang module na LIDAR upang masukat ang distansya ng isang paksa, kaya maaari kang makakuha ng isang uri ng isang autofocus system … Bagaman kaduda-duda kung makakakuha ka ng isang tumpak na sapat na pagtuon sa mga tukoy na lugar tulad ng mga mata atbp…

UPDATE 2020: Gumawa ako ng bersyon 3.0. Ito ay batay sa isang libreng umiikot na gulong gamit ang isang magnetic encoder. Kumokonekta din ito sa aking follow focus motor, na karaniwang nagiging isang pangalawang aparato ng Bluetooth (sinusuportahan ng ESP32 ang maramihang mga koneksyon sa Bluetooth). Ipinapakita ito ng bagong video.

Kung nais mong mag-order ng bersyon 3, mangyaring tumingin sa website ng Magicbutton

Mga gamit

Anumang module ng ESP32 na may wifi at bluetooth. Ginamit ko ang TTGO micro32 sapagkat maliit ito:

Isang pokus ng gulong, anumang potensyomiter ay gagawin. Ginamit ko ang sumusunod dahil maliit ito: https://www.aliexpress.com/item/32963061806.html? S… Ang ganitong uri ay may matigas na paghinto sa itaas at mas mababang hangganan. Sa isang hinaharap na bersyon gagamitin ko ang isang rotary encoder. Sa ganitong paraan ang pagtuon o siwang ay hindi "tumatalon" sa kasalukuyang setting ng gulong kapag nagpasok ako ng isang mode.

Isang pindutan ng rec / mode. Ginamit ko ang sumusunod: https://www.aliexpress.com/item/32806223591.html? S…

Iba pang mga karaniwang bahagi tulad ng resistors, cap,… (tingnan ang eskematiko)

Hakbang 1: Ang Code

Ginagamit ko ang kakayahang wifi ng ESP32 upang kumonekta sa isang kilalang network sa mode na AP, o, kapag nasa larangan ako, nagiging isang istasyon (STA) kung saan ako makakonekta. Sa ganoong paraan mai-configure ko ang module. Hindi ko idetalye ang seksyon ng wifi / webpage, maaari kong idagdag ito sa susunod na yugto.

Ang ESP32 ay kumokonekta sa camera at nagiging isang Bluetooth LE client. Ang Bluetooth code na kasama sa balangkas ng ESP32 ng Arduino ay hindi gagana sa BMPCC4k. Ang Wakwak-koba ay naayos na para sa amin. Salamat Wakwak-koba! Ginamit ko ang BLE library mula rito:

github.com/wakwak-koba/arduino-esp32

Gayunpaman ang bersyon na iyon ng BLE lib ay nasa ilalim pa rin ng pag-unlad at ang pinakabagong bersyon ng BLEUUID.cpp ay tila hindi gagana sa ngayon, kaya kunin ang naunang "na-verify" na bersyon ng file na ito.

Para sa natitirang bahagi, ang karamihan sa aking code ng Bluetooth ay marami ayon sa mga halimbawa ng BLE na kasama sa balangkas ng Arduino:

Ang ilang BLE UUID at variable ay tumutukoy sa:

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

static BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); static na 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 na BLEUUID CamModelcharUUID ("2A24"); static BLEScan * pBLEScan = BLEDevice:: getScan (); static na BLEAddress * pServerAddress; static na BLEAdvertisedDevice * myDevice; static BLERemoteCharacteristic * pControlCharacteristic; static BLERemoteCharacteristic * pNotifCharacteristic; static boolean doConnect = 0; konektado ang static boolean = 0; volatilebool scanning = 0; pabagu-bago ng isip32_t pinCode;

Ang pag-scan at pangunahing loop:

klase MyAdvertisedDeviceCallbacks: publiko BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("Natagpuan ang Nai-advertise na Device:"); Serial.println (advertisedDevice.toString (). C_str ()); kung (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). katumbas (BlackMagic)) {Serial.print ("Natagpuan ang aming aparato!"); advertisedDevice.getScan () -> ihinto (); myDevice = bagong BLEAdvertisedDevice (advertisedDevice); doConnect = totoo; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("tapos na ang pag-scan"); pag-scan = false; } void loop (void) {if (! konektado && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! pag-scan))) {Serial.println ("pag-scan …"); pag-scan = totoo; pBLEScan-> simula (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Nakakonekta na kami ngayon sa BLE Server."); konektado = totoo; } iba pa {Serial.println ("Nabigo kaming kumonekta sa server; wala pang ibang gagawin namin."); } doConnect = false; }}

Kumokonekta sa camera:

bool connectToServer () {

Serial.print ("Bumubuo ng isang koneksyon sa"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (bagong MySecurity ()); BLESecurity * pSecurity = bagong 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 (bagong MyClientCallback ()); pClient-> kumonekta (myDevice); Serial.println ("- Nakakonekta sa server"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN CAMERA MODEL BLERemoteService * pRemoteService = pClient-> getService (DevInfoServiceControlUUID); kung (pRemoteService == nullptr) {Serial.print ("- Nabigong makakuha ng serbisyo sa impormasyon ng aparato"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); bigo ang goto; } Serial.println ("- Pagbasa ng impormasyon sa aparato"); // Kumuha ng isang sanggunian sa katangian sa serbisyo ng remote BLE server. BLERemoteCharacteristic * pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); kung (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("- Nabigong maghanap ng modelo ng camera"); Serial.println (CamModelcharUUID.toString (). C_str ()); bigo ang goto; } // Basahin ang halaga ng katangian. std:: halaga ng string = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Ang Camera ay"); Serial.println (value.c_str ()); kung (CamModel! = value.c_str ()) {Serial.print ("- Ang Camera ay hindi BMPCC4k"); bigo ang goto; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); kung (pRemoteService == nullptr) {Serial.print ("- Nabigong makakuha ng serbisyo sa camera"); Serial.println (ControlserviceUUID.toString (). C_str ()); bigo ang goto; } BLERemoteCharacteristic * pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); kung (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); kung (pControlCharacteristic == nullptr) {Serial.print ("- Nabigong makakuha ng kontrol na katangian"); Serial.println (ControlcharUUID.toString (). C_str ()); bigo ang goto; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); kung (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println ("- pag-subscribe sa abiso"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (abisuhan angCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902)) -> writeValue ((uint8_t *) indicationOn, 2, true); } bumalik totoo; mabibigo: pClient-> idiskonekta (); bumalik ng hindi totoo; }

Ang nakakonekta / naka-disconnect na callback:

klase MyClientCallback: publiko BLEClientCallbacks {

void onConnect (BLEClient * pclient) {Serial.println ("Kami ay konektado."); } void onDisconnect (BLEClient * pclient) {konektado = false; pclient-> idiskonekta (); Serial.println ("Nakakonekta kami."); }};

Ang bahagi ng code ng pin:

Sa aking kasalukuyang bersyon maaari kong ipasok ang pincode sa pamamagitan ng web interface ngunit ito ang mga detalye sa wifi / webpage na maaari kong idagdag sa paglaon.

klase MySecurity: pampublikong BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (end with ENTER):"); pinCode = 0; char ch; gawin {habang (! Serial.available ()) {pagkaantala (1); } ch = Serial.read (); kung (ch> = '0' && ch <= '9') {pinCode = pinCode * 10 + (ch -'0 '); Serial.print (ch); }} habang ((ch! = '\ n')); ibalik ang pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Ang passkey Notify number:% d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "The passkey YES / NO number:% d", pass_key); vTaskDelay (5000); returntrue; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Security Request"); returntrue; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pares status ="); Serial.println (auth_cmpl.success); }};

BLE abiso:

Inaabisuhan ng camera ang mga kliyente nitong BLE tungkol sa anumang mga pagbabago sa camera, kabilang ang kapag nagsimula ang camera at huminto sa pagrekord. Inilipat ng code na ito ang aking LED kapag nagsimula ito / tumitigil sa pag-record.

static void abisuhanCallback (BLERemoteCharacteristic * pBLERemoteCharacteristic, uint8_t * pData, size_t haba, bool ayNotify) {// BMPCC4k BLE format ng mensahe: // rec on ay 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off ay 255 9 0 0 10 1 1 2 0 0 64 0 2if (haba == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {kung (pData [8] == 0) { recstatus = 0; } kung (pData [8] == 2) {recstatus = 1; }}}

Hakbang 2: Ang Bahagi ng Code 2

Ito ang bahagi na talagang nagpapadala ng mga utos sa camera.

Pagrekord:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] walang bisa ang Record (boolean RecOn) {kung (! RecOn) record [8] = 0; iba pang talaan [8] = 2; pControlCharacteristic-> recordValue ((uint8_t *) record, 16, true); }

Nakatuon:

Inaasahan ng camera ang isang 11 bit na numero, mula sa malapit sa malayong pokus. Pinapayuhan ko na maglagay ng isang filter sa iyong halaga ng ADC, kung hindi man ang pokus ay maaaring kinakabahan sa pag-jitter.

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) {// going from a 12bit ADC value to 11bit focus value focus [8] = (uint8_t) (((val> > 1) & 0xFF)); focus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t *) pokus, 12, totoo); }

Aperture:

Inaasahan ng camera ang isang 11 bit na numero, mula sa isang mababa hanggang sa isang mataas na halaga ng siwang. Pinapayuhan ko na maglagay ng isang filter sa iyong halaga ng ADC, kung hindi man ang halaga ng aperture ay maaaring kinakabahan sa pag-jitter.

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) {// pagpunta sa isang 12bit na halaga ng ADC hanggang sa 11bit na aperture na halaga ng siwang [8] = (uint8_t) (((val >> 1) & 0xFF)); siwang [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t *) siwang, 12, totoo); }

Hakbang 3: Ang Circuit

Ang Circuit
Ang Circuit

Ikinabit ko ang PDF ng aking circuit. Ang ilang mga larawan ng PCB ay nakakabit din.

Ang board ay pinalakas ng micro USB.

Matapos matanggap ang PCB nagpasya ako na nais kong magmaneho ng isang RGB LED, kaya nakakonekta ako sa dalawang WS2812B sa serye sa output na "Button Led" (na kailangan ng ilang mga patch ng wire sa PCB). Ang PCB ay 8USD kasama ang OSHPark.com.

Maaari kang makakita ng ilang higit pang mga koneksyon sa PCB tulad ng "adc" na hindi ko ginagamit at kung saan tinanggal mula sa mga nakakabit na iskema. Ang plano ay ang paggamit ng isang panlabas na gulong nakatuon sa nakaraan ngunit kasalukuyan akong perpektong masaya sa maliit na gulong hinlalaki.

Hakbang 4: Konklusyon

Sana nakatulong ito.

Mayroon akong ilang mga pag-update sa hinaharap, tulad ng paggamit ng isang rotary encoder nang walang mga hard stop. Kakailanganin nito ang tagakontrol upang makuha ang kasalukuyang halaga ng pokus o siwang mula sa camera, at magpatuloy mula doon. Ang function na "notifyCallback" ay kailangang i-update para sa na marahil.

Ang PCB ay nangangailangan ng isang pag-update upang maibigay ang mga signal para sa WS2812B RGB LEDs nang maayos.

Gumugol ako ng maraming (isang loooot) ng oras sa paggawa ng trabahong ito, lalo na ang bahagi ng BLE. Kung nakatulong ito sa iyo at nais mong bilhan ako ng inumin, labis na pinahahalagahan:) Ito ay isang link ng donasyon na Paypal:

Inirerekumendang: