विषयसूची:

मैजिक बटन 4k: 20USD BMPCC 4k (या 6k) वायरलेस रिमोट कंट्रोल: 4 चरण (चित्रों के साथ)
मैजिक बटन 4k: 20USD BMPCC 4k (या 6k) वायरलेस रिमोट कंट्रोल: 4 चरण (चित्रों के साथ)

वीडियो: मैजिक बटन 4k: 20USD BMPCC 4k (या 6k) वायरलेस रिमोट कंट्रोल: 4 चरण (चित्रों के साथ)

वीडियो: मैजिक बटन 4k: 20USD BMPCC 4k (या 6k) वायरलेस रिमोट कंट्रोल: 4 चरण (चित्रों के साथ)
वीडियो: ATEM Mini Tips Marathon — All 16 Tips in One Video! 2024, नवंबर
Anonim
Image
Image

बहुत से लोगों ने मुझसे BMPCC4k के लिए मेरे वायरलेस नियंत्रक के बारे में कुछ विवरण साझा करने के लिए कहा है। अधिकांश प्रश्न ब्लूटूथ नियंत्रण के बारे में थे, इसलिए मैं इसके बारे में कुछ विवरणों का उल्लेख करूंगा। मैं मान रहा हूं कि आप ESP32 Arduino वातावरण से परिचित हैं।

रिमोट का यह वर्जन ब्लूटूथ के जरिए कैमरे की रिकॉर्डिंग, फोकस और अपर्चर को कंट्रोल कर सकता है। वीडियो पर एक नजर डालें। BMPCC4k के ब्लूटूथ नियंत्रण मैनुअल के अनुसार अधिक नियंत्रण कार्यों को जोड़ना काफी आसान है। मूल रूप से कैमरे में कुछ भी नियंत्रित किया जा सकता है, जहाँ तक मैंने देखा है।

किसी विषय की दूरी को मापने के लिए LIDAR मॉड्यूल को जोड़ना एक आसान कदम होगा, ताकि आप किसी प्रकार का ऑटोफोकस सिस्टम प्राप्त कर सकें …

अद्यतन २०२०: मैंने संस्करण ३.० बनाया। यह एक चुंबकीय एन्कोडर का उपयोग करके एक मुक्त घूमने वाले पहिये पर आधारित है। यह मेरे फॉलो फोकस मोटर से भी जुड़ता है, जो मूल रूप से दूसरा ब्लूटूथ डिवाइस बन जाता है (ESP32 कई ब्लूटूथ कनेक्शन का समर्थन करता है)। नया वीडियो इसे प्रदर्शित करता है।

यदि आप संस्करण ३ का आदेश देना चाहते हैं, तो कृपया मैजिकबटन वेबसाइट पर एक नज़र डालें

आपूर्ति

वाईफाई और ब्लूटूथ के साथ कोई भी ESP32 मॉड्यूल। मैंने TTGO micro32 का उपयोग किया क्योंकि यह छोटा है:https://www.banggood.com/LILYGO-TTGO-Micro-32-V2_0…

एक फोकस व्हील, कोई भी पोटेंशियोमीटर करेगा। मैंने निम्नलिखित का उपयोग किया क्योंकि यह छोटा है:https://www.aliexpress.com/item/32963061806.html?s…इस प्रकार की ऊपरी और निचली सीमा पर कठोर स्टॉप हैं। भविष्य के संस्करण में मैं एक रोटरी एन्कोडर का उपयोग करूंगा। इस तरह जब मैं मोड में प्रवेश करता हूं तो फोकस या एपर्चर वर्तमान व्हील सेटिंग पर "कूद" नहीं जाता है।

एक रिक/मोड बटन। मैंने निम्नलिखित का उपयोग किया:https://www.aliexpress.com/item/32806223591.html?s…

अन्य मानक घटक जैसे प्रतिरोधक, कैप, … (योजनाबद्ध देखें)

चरण 1: कोड

मैं ईएसपी 32 की वाईफाई क्षमता का उपयोग एपी मोड में किसी ज्ञात नेटवर्क से कनेक्ट करने के लिए करता हूं, या, जब मैं क्षेत्र में होता हूं, तो यह एक स्टेशन (एसटीए) बन जाता है जिससे मैं जुड़ सकता हूं। इस तरह मैं मॉड्यूल को कॉन्फ़िगर कर सकता हूं। मैं वाईफाई/वेबपेज अनुभाग के विवरण में नहीं जाऊंगा, मैं इसे बाद के चरण में जोड़ सकता हूं।

ESP32 कैमरे से जुड़ता है और ब्लूटूथ LE क्लाइंट बन जाता है। Arduino के ESP32 ढांचे में शामिल ब्लूटूथ कोड BMPCC4k के साथ काम नहीं करता है। वाकवाक-कोबा ने इसे हमारे लिए तय किया है। धन्यवाद वाकवाक-कोबा! मैंने यहाँ से BLE लाइब्रेरी का उपयोग किया है:

github.com/wakwak-koba/arduino-esp32

फिर भी BLE lib का वह संस्करण अभी भी विकास के अधीन है और BLEUUID.cpp का नवीनतम संस्करण इस समय काम नहीं कर रहा है, इसलिए इस फ़ाइल के पहले के "सत्यापित" संस्करण को लें।

बाकी के लिए, मेरा अधिकांश ब्लूटूथ कोड 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(); स्थिर BLEIAddress *pServerAddress; स्थिर BLEविज्ञापितडिवाइस* myDevice; स्थिर BLERremoteविशेषता *pControlCharacteristic; स्थिर BLERremoteविशेषता *pNotifविशेषता; स्थिर बूलियन doConnect = 0; स्थिर बूलियन जुड़ा = 0; वाष्पशील स्कैनिंग = 0; volatileuint32_t पिनकोड;

स्कैनिंग और मुख्य लूप:

कक्षा MyAdvertedDeviceCallbacks: सार्वजनिक BLEविज्ञापितDeviceCallbacks{

परिणाम पर शून्य (बीएलईविज्ञापितडिवाइस विज्ञापित डिवाइस) { सीरियल.प्रिंट ("बीएलई विज्ञापित डिवाइस मिला:"); Serial.println(advertisedDevice.toString().c_str()); अगर (advertisedDevice.haveServiceUUID () && विज्ञापितDevice.getServiceUUID ()। बराबर (ब्लैकमैजिक)) {Serial.print ("हमारी डिवाइस मिली!"); विज्ञापितDevice.getScan () -> रोकें (); myDevice = नया BLEविज्ञापितडिवाइस (विज्ञापितडिवाइस); डूकनेक्ट = सच; } } }; स्थैतिक शून्य स्कैन पूर्ण सीबी (BLEScanResults scanResults) { Serial.println ("स्कैनिंग किया गया"); स्कैनिंग = झूठा; } शून्य लूप (शून्य) { अगर (! जुड़ा हुआ && ((uint32_t) (मिली () - टाइमर)> BLE_RESCAN_TIME || (! स्कैनिंग))) { Serial.println ("स्कैनिंग…"); स्कैनिंग = सच; pBLEScan-> start(BLE_SCAN_TIME, scanCompleteCB); टाइमर = मिली (); } अगर (doConnect == true) {if (connectToServer ()) {Serial.println ("अब हम BLE सर्वर से जुड़े हैं।"); जुड़ा = सच; } और { Serial.println ("हम सर्वर से कनेक्ट करने में विफल रहे हैं; हम और कुछ नहीं करेंगे।"); } डूकनेक्ट = झूठा; } }

कैमरे से कनेक्ट करना:

बूल कनेक्ट टूसेवर () {

Serial.print ("से कनेक्शन बनाना"); Serial.println(myDevice->getAddress().toString().c_str()); BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT); BLEDevice::setSecurityCallbacks (नई MySecurity ()); BLES सुरक्षा * pSecurity = नई BLES सुरक्षा (); पी सुरक्षा-> सेटकीसाइज (); 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); अगर (pRemoteService == nullptr) {Serial.print("- डिवाइस जानकारी सेवा प्राप्त करने में विफल"); Serial.println (DevInfoServiceControlUUID.toString ()। c_str ()); गोटो फेल; } Serial.println ("- डिवाइस की जानकारी पढ़ना"); // दूरस्थ BLE सर्वर की सेवा में विशेषता का संदर्भ प्राप्त करें। BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService->getCharacteristic(CamModelcharUUID); अगर (pRemoteCamModelCharacteristic == nullptr) {Serial.print("- कैमरा मॉडल खोजने में विफल"); Serial.println (CamModelcharUUID.toString ()। c_str ()); गोटो फेल; } // विशेषता का मूल्य पढ़ें। एसटीडी:: स्ट्रिंग मान = pRemoteCamModelCharacteristic->readValue (); सीरियल.प्रिंट ("कैमरा है"); Serial.println (value.c_str ()); if (CamModel != value.c_str ()) { Serial.print("- कैमरा BMPCC4k नहीं है"); गोटो फेल; } // नियंत्रण प्राप्त करें pRemoteService = pClient->getService(ControlserviceUUID); अगर (pRemoteService == nullptr) {Serial.print("- कैमरा सेवा प्राप्त करने में विफल"); Serial.println (ControlserviceUUID.toString ()। c_str ()); गोटो फेल; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService->getCharacteristic(ClientNamecharUUID); अगर (pRemoteClientNameCharacteristic != nullptr) {pRemoteClientNameCharacteristic->writeValue(MyName.c_str(), MyName.length()); } pControlCharacteristic = pRemoteService->getCharacteristic(ControlcharUUID); अगर (pControlCharacteristic == nullptr) {Serial.print("- नियंत्रण विशेषता प्राप्त करने में विफल"); Serial.println (ControlcharUUID.toString ()। c_str ()); गोटो फेल; } pNotifCharacteristic = pRemoteService->getCharacteristic(NotifcharUUID); if (pNotifCharacteristic != nullptr) // && pNotifCharacteristic->canIndicate ()) { Serial.println ("- अधिसूचना की सदस्यता"); कॉन्स्ट uint8_t इंडिकेशनऑन = {0x2, 0x0}; pNotifCharacteristic->registerForNotify (सूचित कॉलबैक, गलत); pNotifCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)indicationOn, 2, true); } सच लौटें; विफल: pClient-> डिस्कनेक्ट (); विवरण झूठा है; }

कनेक्टेड/डिस्कनेक्टेड कॉलबैक:

क्लास MyClientCallback: सार्वजनिक BLEClientCallbacks{

कनेक्ट पर शून्य (बीएलई क्लाइंट * क्लाइंट) {Serial.println ("हम जुड़े हुए हैं।"); } डिसकनेक्ट पर शून्य (बीएलई क्लाइंट * क्लाइंट) {जुड़ा हुआ = झूठा; pclient-> डिस्कनेक्ट (); Serial.println ("हम डिस्कनेक्ट हो गए।"); } };

पिन कोड भाग:

अपने वर्तमान संस्करण में मैं वेब इंटरफेस के माध्यम से पिनकोड दर्ज कर सकता हूं लेकिन ये वाईफाई/वेबपेज विवरण हैं जिन्हें मैं बाद में जोड़ सकता हूं।

कक्षा MySecurity: सार्वजनिक BLES सुरक्षा कॉलबैक

{ uint32_t onPassKeyRequest () { Serial.println ("- कृपया 6 अंकों का पिन दर्ज करें (ENTER के साथ समाप्त करें):"); पिनकोड = 0; चार च; करो { जबकि (! सीरियल.उपलब्ध ()) {देरी (1); } सीएच = सीरियल.रीड (); अगर (ch >='0'&& ch <='9') {पिनकोड = पिनकोड *10+ (ch -'0'); सीरियल.प्रिंट (सीएच); } } जबकि ((ch !='\n')); वापसी पिनकोड; } शून्य onPassKeyNotify(uint32_t pass_key) { ESP_LOGE(LOG_TAG, "पासकी सूचना संख्या:%d", पास_की); } बूल ऑन कन्फर्मपिन (uint32_t पास_की) {ESP_LOGI(LOG_TAG, "पासकी हाँ/नहीं नंबर:%d", पास_की); vTaskDelay(5000); वापिस सच; } सुरक्षा अनुरोध पर बूल () { ESP_LOGI (LOG_TAG, "सुरक्षा अनुरोध"); वापसी सच; } प्रमाणीकरण पूर्ण (esp_ble_auth_cmpl_t auth_cmpl) पर शून्य {Serial.print ("जोड़ी स्थिति ="); Serial.println (auth_cmpl.success); } };

बीएलई अधिसूचना:

कैमरा अपने बीएलई क्लाइंट को किसी भी कैमरा परिवर्तन के बारे में सूचित करता है, जिसमें कैमरा कब शुरू होता है और रिकॉर्डिंग बंद हो जाता है। जब यह रिकॉर्डिंग शुरू/बंद करता है तो यह कोड मेरे एलईडी को टॉगल करता है।

स्थैतिक शून्य सूचित कॉलबैक(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t लंबाई, bool isNotify) {// BMPCC4k BLE संदेश प्रारूप: // rec on 255 9 0 0 10 1 1 2 2 0 64 0 2// rec off है 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) { रेक्टस्टैटस = 0; } अगर (पीडाटा [8] ==2) {रेक्टस्टैटस = 1; } } }

चरण 2: कोड भाग 2

यह वह हिस्सा है जो वास्तव में कैमरे को कमांड भेजता है।

रिकॉर्डिंग:

uint8_t रिकॉर्ड = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = बंद, 2 = चालू, [8] शून्य रिकॉर्ड (बूलियन रेकॉन) { अगर (! रेकोन) रिकॉर्ड [8] = 0; अन्य रिकॉर्ड [8] = 2; pControlCharacteristic->writeValue((uint8_t*)record, 16, true); }

ध्यान केंद्रित करना:

कैमरा एक ११ बिट संख्या की अपेक्षा करता है, जो निकट से लेकर दूर तक के फोकस के बीच है। मैं आपके एडीसी मूल्य पर एक फिल्टर लगाने की सलाह देता हूं, अन्यथा फोकस घबराहट से घबरा सकता है।

uint8_t फोकस = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0 … 1.0, 11 बिट, [8] = एलएसबी, [9] = एमएसबीवॉइड फोकस (uint16_t वैल) {// 12 बिट एडीसी मान से 11 बिट फोकस वैल्यू फोकस पर जा रहा है [8] = (uint8_t) (((वैल> >1) और 0xFF)); फोकस [9] = (uint8_t) (((वैल >> 1) और 0xFF00) >> 8); pControlCharacteristic->writeValue((uint8_t*)focus, 12, true); }

एपर्चर:

कैमरा 11 बिट संख्या की अपेक्षा करता है, जो निम्न से लेकर उच्च एपर्चर मान तक है। मैं आपके एडीसी मूल्य पर एक फिल्टर लगाने की सलाह देता हूं, अन्यथा एपर्चर मान घबराहट से घबरा सकता है।

uint8_t एपर्चर = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // ०.० … १.०, [८] = एलएसबी, [९] = MSBvoid एपर्चर (uint16_t वैल) {// १२ बिट एडीसी मान से ११ बिट एपर्चर मान एपर्चर [८] = (uint8_t) (((वैल >> १)) और 0xFF)); एपर्चर [9] = (uint8_t) (((वैल >> 1) और 0xFF00) >> 8); pControlCharacteristic->writeValue((uint8_t*)एपर्चर, 12, सच); }

चरण 3: सर्किट

सर्किट
सर्किट

मैंने अपने सर्किट का पीडीएफ संलग्न किया है। पीसीबी की कुछ तस्वीरें भी संलग्न हैं।

बोर्ड माइक्रो यूएसबी के साथ संचालित है।

पीसीबी प्राप्त करने के बाद मैंने फैसला किया कि मैं एक आरजीबी एलईडी ड्राइव करना चाहता हूं, इसलिए मैंने श्रृंखला में दो WS2812B को "बटन एलईडी" आउटपुट से जोड़ा (जिसे पीसीबी पर कुछ वायर पैच की आवश्यकता थी)। OSHPark.com के साथ PCB 8USD थे।

आप पीसीबी पर कुछ और कनेक्शन देख सकते हैं जैसे "एडीसी" जिसका मैं उपयोग नहीं कर रहा हूं और जिन्हें संलग्न योजनाबद्ध से हटा दिया गया था। योजना अतीत में बाहरी फोकस व्हील का उपयोग करने की थी लेकिन मैं वर्तमान में छोटे अंगूठे के पहिये से पूरी तरह खुश हूं।

चरण 4: निष्कर्ष

मुझे आशा है कि इससे मदद मिली।

मेरे मन में कुछ भविष्य के अपडेट हैं, जैसे बिना हार्ड स्टॉप के रोटरी एन्कोडर का उपयोग करना। इसके लिए नियंत्रक को कैमरे से फ़ोकस या अपर्चर का वर्तमान मान प्राप्त करने और वहां से जारी रखने की आवश्यकता होगी। शायद इसके लिए "सूचना कॉलबैक" फ़ंक्शन को अद्यतन करने की आवश्यकता है।

WS2812B RGB LED को ठीक से सिग्नल प्रदान करने के लिए PCB को अपडेट की आवश्यकता होती है।

मैंने इस काम को करने में बहुत समय बिताया, खासकर बीएलई भाग। अगर इससे आपको मदद मिली और आप मुझे एक पेय खरीदना चाहते हैं, तो इसकी बहुत सराहना की जाती है:) यह एक पेपैल दान लिंक है:

सिफारिश की: