Բովանդակություն:
Video: Magic Button 4k: 20USD BMPCC 4k (կամ 6k) անլար հեռակառավարիչ ՝ 4 քայլ (նկարներով)
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:45
Շատերն են ինձ խնդրել կիսվել 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: Շղթան
Ես կցել եմ իմ շրջանի PDF- ը: Կցված են նաև PCB- ի որոշ լուսանկարներ:
Տախտակը սնուցվում է միկրո USB- ով:
PCB- ն ստանալուց հետո ես որոշեցի, որ ուզում եմ RGB LED վարել, ուստի երկու WS2812B շարքը միացրեցի «Button Led» ելքին (դրան անհրաժեշտ էին PCB- ի մետաղալարեր): PCB- ն 8USD էր OSHPark.com- ի հետ:
PCB- ի վրա կարող եք տեսնել ևս մի քանի կապեր, ինչպիսիք են «adc» - ն, որոնք ես չեմ օգտագործում և որոնք հեռացվել են կցված սխեմաներից: Նախկինում նախատեսվում էր օգտագործել արտաքին ֆոկուս անիվ, բայց ես այժմ լիովին գոհ եմ բութ մատի անիվից:
Քայլ 4: Եզրակացություն
Հուսով եմ, որ սա օգնեց:
Ես մտքում ունեմ որոշ ապագա թարմացումներ, ինչպիսիք են պտտվող կոդավորիչի օգտագործումը առանց կոշտ կանգառների: Դրա համար վերահսկիչը կպահանջի տեսախցիկից ստանալ ֆոկուսի կամ բացվածքի ընթացիկ արժեքը և շարունակել այնտեղից: Հավանաբար դրա համար անհրաժեշտ է թարմացնել «notifyCallback» գործառույթը:
PCB- ին անհրաժեշտ է թարմացում `WS2812B RGB LED- ների ազդանշանները պատշաճ կերպով ապահովելու համար:
Ես շատ ժամանակ անցկացրեցի այս աշխատանքը պատրաստելու համար, հատկապես BLE հատվածը: Եթե սա օգնեց ձեզ և ուզում եք ինձ համար խմիչք գնել, դա շատ գնահատելի է:) Սա Paypal- ի նվիրատվության հղում է.
Խորհուրդ ենք տալիս:
Անլար Arduino ռոբոտ ՝ օգտագործելով HC12 անլար մոդուլը ՝ 7 քայլ
Անլար Arduino ռոբոտ, որն օգտագործում է HC12 անլար մոդուլը. Բարև ձեզ, բարի գալուստ: Իմ նախորդ գրառման մեջ ես բացատրեցի, թե ինչ է H Bridge Circuit- ը, L293D շարժիչի վարորդը IC, խոզուկ L293D Motor վարորդի IC- ն ՝ բարձր ընթացիկ շարժիչով վարորդներ վարելու համար, և ինչպես կարող եք նախագծել և պատրաստել ձեր սեփական L293D շարժիչային վարորդների խորհուրդը
Անլար հեռակառավարիչ ՝ օգտագործելով 2.4 ԳՀց NRF24L01 մոդուլ Arduino- ով - Nrf24l01 4 ալիք / 6 ալիք հաղորդիչ ընդունիչ քառանկյունի համար - Rc ուղղաթիռ - Rc ինքնաթիռ Arduino- ի միջոցով. 5 քայլ (նկարներով)
Անլար հեռակառավարիչ ՝ օգտագործելով 2.4 ԳՀց NRF24L01 մոդուլ Arduino- ով | Nrf24l01 4 ալիք / 6 ալիք հաղորդիչ ընդունիչ քառանկյունի համար | Rc ուղղաթիռ | Rc ինքնաթիռ Arduino- ի միջոցով. RC մեքենա շահագործելու համար | Quadcopter | Անօդաչու թռչող սարք | RC ինքնաթիռ | RC նավակ, մեզ միշտ պետք է ընդունիչ և հաղորդիչ, ենթադրենք, որ RC QUADCOPTER- ի համար մեզ անհրաժեշտ է 6 ալիքով հաղորդիչ և ընդունիչ, և այդ տիպի TX և RX- ը չափազանց թանկ են, ուստի մենք դա պատրաստելու ենք մեր
Հիսուն մետրանոց անլար մուտքի կետ TP Link WN7200ND USB անլար ադապտերով Raspbian Stretch- ում. 6 քայլ
Հիսուն մետրանոց անլար մուտքի կետ TP Link WN7200ND USB անլար ադապտերով Raspbian Stretch- ում. Raspberry Pi- ն հիանալի է ապահով անլար մուտքի կետեր ստեղծելու համար, բայց այն լավ տիրույթ չունի, ես այն երկարացնելու համար օգտագործել եմ TP Link WN7200ND USB անլար ադապտեր: Ուզում եմ կիսվել, թե ինչպես դա անել
Xfinity HTPC անլար հեռակառավարիչ ՝ 5 քայլ
Xfinity HTPC Wireless Remote: Այս ձեռնարկը ցույց կտա ձեզ, թե ինչպես ստանալ ազդանշանը Xfinity հեռակառավարման վահանակից, այնուհետև օգտագործել դրա ազդանշանը որպես անլար ստեղնաշար: Ես չունեի Arduino նանո, ուստի ստիպված էի գրել պիթոնի սցենար ՝ սերիական տվյալները ստեղնաշարի վերածելու համար: Ես նաև օգտագործեցի Արդ
Կոտրեք անլար դռան զանգը անլար ազդանշանային անջատիչի կամ միացման/անջատման անջատիչի մեջ. 4 քայլ
Hack a Wireless Doorbell into a Wireless Alarm Switch կամ On/Off Switch. Ես վերջերս կառուցեցի ահազանգման համակարգ և տեղադրեցի այն իմ տանը: Ես դռների վրա օգտագործեցի մագնիսական անջատիչներ և դրանք կապեցի ձեղնահարկի միջով: Պատուհանները այլ պատմություն էին, և դրանց լարված լարերը տարբերակ չէին: Ինձ անլար լուծում էր պետք, և սա