Բովանդակություն:

Magic Button 4k: 20USD BMPCC 4k (կամ 6k) անլար հեռակառավարիչ ՝ 4 քայլ (նկարներով)
Magic Button 4k: 20USD BMPCC 4k (կամ 6k) անլար հեռակառավարիչ ՝ 4 քայլ (նկարներով)

Video: Magic Button 4k: 20USD BMPCC 4k (կամ 6k) անլար հեռակառավարիչ ՝ 4 քայլ (նկարներով)

Video: Magic Button 4k: 20USD BMPCC 4k (կամ 6k) անլար հեռակառավարիչ ՝ 4 քայլ (նկարներով)
Video: Новинки Blackmagic 2024, Հուլիսի
Anonim
Image
Image

Շատերն են ինձ խնդրել կիսվել BMPCC4k- ի իմ անլար վերահսկիչի որոշ մանրամասներով: Հարցերի մեծամասնությունը bluetooth- ի կառավարման մասին էին, ուստի ես դրա մասին մի քանի մանրամասն նշեմ: Ենթադրում եմ, որ դուք ծանոթ եք ESP32 Arduino միջավայրին:

Հեռակառավարման վահանակի այս տարբերակը կարող է վերահսկել տեսախցիկի ձայնագրությունը, կենտրոնացումը և բացվածքը bluetooth- ի միջոցով: Դիտեք տեսանյութը: Դա բավականին հեշտ է ավելացնել ավելի շատ կառավարման գործառույթներ ՝ ըստ BMPCC4k bluetooth կառավարման ձեռնարկի: Հիմնականում տեսախցիկի ցանկացած բան հնարավոր է վերահսկել, որքանով որ ես տեսել եմ:

Հեշտ քայլ կլիներ ավելացնել LIDAR մոդուլ ՝ առարկայի հեռավորությունը չափելու համար, այնպես որ կարող եք ձեռք բերել մի տեսակ ինքնակենտրոնացման համակարգ… Թեև կասկածելի է, եթե կարողանաք բավականաչափ ճշգրիտ կենտրոնանալ որոշակի ոլորտների վրա, ինչպիսիք են աչքերը և այլն…

ԹԱՐՄԱՈՄ 2020. Ես պատրաստեցի 3.0 տարբերակը: Այն հիմնված է անվճար պտտվող անիվի վրա `օգտագործելով մագնիսական կոդավորիչ: Այն նաև միանում է իմ follow focus շարժիչին, որը հիմնականում դառնում է երկրորդ bluetooth սարքը (ESP32- ն ապահովում է բազմաթիվ bluetooth կապեր): Նոր տեսահոլովակը դա է ցույց տալիս:

Եթե ցանկանում եք պատվիրել 3 -րդ տարբերակը, խնդրում ենք դիտել MagicButton կայքը

Պարագաներ

Eանկացած ESP32 մոդուլ wifi և bluetooth- ով: Ես օգտագործեցի TTGO micro32- ը, քանի որ այն փոքր է. Https: //www.banggood.com/LILYGO-TTGO-Micro-32-V2_0…

Focusանկացած պոտենցիոմետր կկատարեր կենտրոնացման անիվ: Ես օգտագործել եմ հետևյալը, որովհետև այն փոքր է. Հետագա տարբերակում ես կօգտագործեմ պտտվող կոդավորիչ: Այսպիսով, ռեժիմը մտնելիս ֆոկուսը կամ բացվածքը չեն «ցատկում» դեպի անիվի ընթացիկ կարգավորումը:

Rec/ռեժիմի կոճակ: Ես օգտագործել եմ հետևյալը ՝ https://www.aliexpress.com/item/32806223591.html? S…

Այլ ստանդարտ բաղադրիչներ, ինչպիսիք են դիմադրիչները, կափարիչները,… (տե՛ս սխեմատիկ)

Քայլ 1: Կոդ

Ես օգտագործում եմ ESP32- ի wifi հնարավորությունը ՝ AP ռեժիմում միացված ցանցին միանալու համար, կամ, երբ դաշտում եմ, այն դառնում է կայան (STA), որին կարող եմ միանալ: Այդ կերպ ես կարող եմ կարգավորել մոդուլը: Ես չեմ մանրամասնի wifi/վեբ էջի բաժինը, գուցե սա ավելացնեմ ավելի ուշ փուլում:

ESP32- ը միանում է տեսախցիկին և դառնում Bluetooth LE հաճախորդ: Arduino- ի ESP32 շրջանակում ներառված bluetooth կոդը չի աշխատում BMPCC4k- ի հետ: Wakwak-koba- ն դա մեզ համար ուղղել է: Շնորհակալություն Wakwak-koba! Ես օգտագործել եմ BLE գրադարանը այստեղից.

github.com/wakwak-koba/arduino-esp32

Այնուամենայնիվ, BLE lib- ի այդ տարբերակը դեռ մշակման փուլում է, և BLEUUID.cpp- ի վերջին տարբերակը այս պահին չի աշխատում, այնպես որ վերցրեք այս ֆայլի ավելի վաղ «հաստատված» տարբերակը:

Մնացածի համար, իմ bluetooth կոդի մեծ մասը շատ է Arduino շրջանակում ներառված BLE օրինակների համաձայն.

Որոշ 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; ստատիկ BLERemoteCharacteristic *pNotifCharacteristic; ստատիկ բուլյան doConnect = 0; ստատիկ բուլյան միացված = 0; volatilebool սկան = 0; volatileuint32_t pinCode;

Սկանավորում և հիմնական հանգույց

դաս MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print («Գտնվել է BLE գովազդված սարք.»); Serial.println (advertisedDevice.toString (). C_str ()); եթե (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). հավասար է (BlackMagic)) {Serial.print («Գտնվել է մեր սարքը»); advertisedDevice.getScan ()-> stop (); myDevice = նոր BLEAdvertisedDevice (advertisedDevice); doConnect = ճշմարիտ; }}}; ստատիկ դատարկ սկան CompleteCB (BLEScanResults scanResults) {Serial.println («սկանավորումն ավարտված է»); սկան = կեղծ; } void loop (void) {if (! կապված && ((uint32_t) (millis () - erամաչափ)> BLE_RESCAN_TIME || (! սկան))) {Serial.println ("սկանավորում …"); սկան = ճշմարիտ; pBLEScan-> սկսել (BLE_SCAN_TIME, scanCompleteCB); Timամաչափ = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println («Մենք այժմ միացված ենք BLE սերվերին»); կապված = ճշմարիտ; } else {Serial.println ("Չհաջողվեց միանալ սերվերին. այլևս ոչինչ չենք անի"); } doConnect = կեղծ; }}

Տեսախցիկին միանալը

bool connectToServer () {

Serial.print («Կապի ստեղծում»); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (նոր MySecurity ()); 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 ()); 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 (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Տեսախցիկը BMPCC4k չէ"); անհաջողության մատնվել; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Չհաջողվեց ստանալ տեսախցիկի ծառայություն"); Serial.println (ControlserviceUUID.toString (). C_str ()); անհաջողության մատնվել; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (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 ցուցում [On] = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) ցուցում On, 2, true); } վերադառնալ ճշմարիտ; ձախողել. pClient-> անջատել (); վերադարձնել կեղծ; }

Միացված/անջատված հետադարձ զանգ

դաս MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println («Մենք կապված ենք»); } void onDisconnect (BLEClient *pclient) {կապված = կեղծ; pclient-> անջատել (); Serial.println («Մենք անջատվեցինք»); }};

Փին կոդի մաս

Իմ ընթացիկ տարբերակում ես կարող եմ մուտքագրել ծածկագիրը վեբ ինտերֆեյսի միջոցով, բայց դրանք wifi/վեբ էջի մանրամասներ են, որոնք հետագայում կարող եմ ավելացնել:

դաս MySecurity: public BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- Խնդրում ենք մուտքագրել 6 ԹՎԱՅԻՆ PIN (ավարտեք ENTER):"); pinCode = 0; char ch; անել {while (! Serial.available ()) {հետաձգում (1); } ch = Serial.read (); եթե (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} while ((ch! = '\ n')); վերադարձնել pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "The passkey Notify number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Գաղտնաբառը YES/NO number:%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 հաճախորդներին տեղեկացնում է տեսախցիկի ցանկացած փոփոխության մասին, այդ թվում `երբ տեսախցիկը սկսում և դադարում է ձայնագրությունը: Այս կոդը միացնում է իմ LED- ն, երբ այն սկսում/դադարում է ձայնագրությունը:

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE հաղորդագրության ձևաչափ ՝ // rec on is 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off is 255 9 0 0 10 1 1 2 0 0 64 0 2if (երկարություն == 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; }}}

Քայլ 2. Կոդ 2 -րդ մաս

Սա այն մասն է, որն իրականում հրամաններն ուղարկում է տեսախցիկին:

Ձայնագրությունը:

uint8_t գրառում = {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; այլապես արձանագրել [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) գրառում, 16, ճշմարիտ); }

Կենտրոնանալը

Տեսախցիկն ակնկալում է 11 բիթանոց համար ՝ տատանվելով մոտից մինչև հեռու ֆոկուս: Ես խորհուրդ եմ տալիս զտիչ դնել ձեր ADC արժեքի վրա, հակառակ դեպքում ուշադրությունը կարող է նյարդայնորեն ցնցվել:

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) {// 12bit ADC արժեքից մինչև 11bit կենտրոնացման արժեքի կենտրոնացում [8] = (uint8_t) ((((val> > 1) & 0xFF)); կենտրոնացում [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) կենտրոնացում, 12, ճշմարիտ); }

Բացվածք:

Տեսախցիկն ակնկալում է 11 բիթանոց համար ՝ ցածրից մինչև բարձր բացվածքի արժեք: Ես իսկապես խորհուրդ եմ տալիս զտիչ դնել ձեր ADC արժեքի վրա, հակառակ դեպքում բացվածքի արժեքը կարող է նյարդայնորեն ցնցվել:

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) {// 12bit ADC արժեքից անցում դեպի 11bit բացվածքի արժեքի բացվածք [8] = (uint8_t) (((val >> 1) & 0xFF)); բացվածք [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) բացվածք, 12, ճշմարիտ); }

Քայլ 3: Շղթան

The Circuit
The Circuit

Ես կցել եմ իմ շրջանի PDF- ը: Կցված են նաև PCB- ի որոշ լուսանկարներ:

Տախտակը սնուցվում է միկրո USB- ով:

PCB- ն ստանալուց հետո ես որոշեցի, որ ուզում եմ RGB LED վարել, ուստի երկու WS2812B շարքը միացրեցի «Button Led» ելքին (դրան անհրաժեշտ էին PCB- ի մետաղալարեր): PCB- ն 8USD էր OSHPark.com- ի հետ:

PCB- ի վրա կարող եք տեսնել ևս մի քանի կապեր, ինչպիսիք են «adc» - ն, որոնք ես չեմ օգտագործում և որոնք հեռացվել են կցված սխեմաներից: Նախկինում նախատեսվում էր օգտագործել արտաքին ֆոկուս անիվ, բայց ես այժմ լիովին գոհ եմ բութ մատի անիվից:

Քայլ 4: Եզրակացություն

Հուսով եմ, որ սա օգնեց:

Ես մտքում ունեմ որոշ ապագա թարմացումներ, ինչպիսիք են պտտվող կոդավորիչի օգտագործումը առանց կոշտ կանգառների: Դրա համար վերահսկիչը կպահանջի տեսախցիկից ստանալ ֆոկուսի կամ բացվածքի ընթացիկ արժեքը և շարունակել այնտեղից: Հավանաբար դրա համար անհրաժեշտ է թարմացնել «notifyCallback» գործառույթը:

PCB- ին անհրաժեշտ է թարմացում `WS2812B RGB LED- ների ազդանշանները պատշաճ կերպով ապահովելու համար:

Ես շատ ժամանակ անցկացրեցի այս աշխատանքը պատրաստելու համար, հատկապես BLE հատվածը: Եթե սա օգնեց ձեզ և ուզում եք ինձ համար խմիչք գնել, դա շատ գնահատելի է:) Սա Paypal- ի նվիրատվության հղում է.

Խորհուրդ ենք տալիս: