সুচিপত্র:

ম্যাজিক বাটন 4k: 20USD BMPCC 4k (বা 6k) ওয়্যারলেস রিমোট কন্ট্রোল: 4 টি ধাপ (ছবি সহ)
ম্যাজিক বাটন 4k: 20USD BMPCC 4k (বা 6k) ওয়্যারলেস রিমোট কন্ট্রোল: 4 টি ধাপ (ছবি সহ)

ভিডিও: ম্যাজিক বাটন 4k: 20USD BMPCC 4k (বা 6k) ওয়্যারলেস রিমোট কন্ট্রোল: 4 টি ধাপ (ছবি সহ)

ভিডিও: ম্যাজিক বাটন 4k: 20USD BMPCC 4k (বা 6k) ওয়্যারলেস রিমোট কন্ট্রোল: 4 টি ধাপ (ছবি সহ)
ভিডিও: Blackmagic Camera App on iPhone 15 Pro | What You Need To Know 2024, নভেম্বর
Anonim
Image
Image

অনেকে আমাকে BMPCC4k এর জন্য আমার ওয়্যারলেস কন্ট্রোলার সম্পর্কে কিছু তথ্য শেয়ার করতে বলেছেন। বেশিরভাগ প্রশ্ন ব্লুটুথ নিয়ন্ত্রণ সম্পর্কে ছিল, তাই আমি এটি সম্পর্কে কয়েকটি বিবরণ উল্লেখ করব। আমি ধরে নিচ্ছি আপনি ESP32 Arduino পরিবেশের সাথে পরিচিত।

রিমোটের এই সংস্করণটি ব্লুটুথের মাধ্যমে ক্যামেরার রেকর্ডিং, ফোকাস এবং অ্যাপারচার নিয়ন্ত্রণ করতে পারে। ভিডিওটি দেখে নিন। BMPCC4k এর ব্লুটুথ কন্ট্রোল ম্যানুয়াল অনুযায়ী আরো নিয়ন্ত্রণ ফাংশন যোগ করা বেশ সহজ। মূলত ক্যামেরার যেকোন কিছু নিয়ন্ত্রণ করা যায়, যতদূর আমি দেখেছি।

একটি বিষয়ের দূরত্ব পরিমাপ করার জন্য একটি LIDAR মডিউল যোগ করা একটি সহজ পদক্ষেপ হবে, যাতে আপনি এক ধরণের অটোফোকাস সিস্টেম পেতে পারেন … যদিও আপনি চোখের মতো নির্দিষ্ট ক্ষেত্রগুলিতে সঠিকভাবে যথেষ্ট মনোযোগ পেতে পারেন কিনা তা সন্দেহজনক …

আপডেট 2020: আমি 3.0 সংস্করণ তৈরি করেছি। এটি একটি চৌম্বকীয় এনকোডার ব্যবহার করে একটি বিনামূল্যে ঘোরানো চাকার উপর ভিত্তি করে। এটি আমার ফলো ফোকাস মোটরের সাথে সংযোগ স্থাপন করে, যা মূলত একটি দ্বিতীয় ব্লুটুথ ডিভাইস হয়ে যায় (ESP32 একাধিক ব্লুটুথ সংযোগ সমর্থন করে)। নতুন ভিডিও এটি প্রদর্শন করে।

আপনি যদি সংস্করণ 3 অর্ডার করতে চান, দয়া করে ম্যাজিক বাটন ওয়েবসাইটে দেখুন

সরবরাহ

ওয়াইফাই এবং ব্লুটুথ সহ যে কোনও ESP32 মডিউল। আমি TTGO micro32 ব্যবহার করেছি কারণ এটি ক্ষুদ্র:

একটি ফোকাস চাকা, কোন potentiometer করবে। আমি নিম্নলিখিতটি ব্যবহার করেছি কারণ এটি ক্ষুদ্র: https://www.aliexpress.com/item/32963061806.html? ভবিষ্যতের সংস্করণে আমি একটি ঘূর্ণমান এনকোডার ব্যবহার করব। এভাবে যখন আমি মোডে প্রবেশ করি তখন ফোকাস বা অ্যাপারচার বর্তমান চাকা সেটিংয়ে "লাফ" দেয় না।

একটি রিক/মোড বোতাম। আমি নিম্নলিখিতগুলি ব্যবহার করেছি: https://www.aliexpress.com/item/32806223591.html? S…

অন্যান্য স্ট্যান্ডার্ড কম্পোনেন্ট যেমন রেসিস্টর, ক্যাপস, … (পরিকল্পিত দেখুন)

ধাপ 1: কোড

আমি ESP32 এর ওয়াইফাই ক্ষমতা ব্যবহার করি হয় হয় AP মোডে পরিচিত নেটওয়ার্কের সাথে সংযোগ স্থাপন করতে, অথবা, যখন আমি মাঠে থাকি, এটি একটি স্টেশন (STA) হয়ে যায় যার সাথে আমি সংযোগ করতে পারি। এইভাবে আমি মডিউল কনফিগার করতে পারি। আমি ওয়াইফাই/ওয়েবপেজ বিভাগের বিস্তারিত বিবরণে যাব না, আমি এটি পরবর্তী পর্যায়ে যোগ করতে পারি।

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 (); স্ট্যাটিক BLEAddress *pServerAddress; স্ট্যাটিক BLEAdvertisedDevice* myDevice; স্ট্যাটিক BLERemoteCharacteristic *pControlCharacteristic; স্ট্যাটিক BLERemoteCharacteristic *pNotifCharacteristic; স্ট্যাটিক বুলিয়ান doConnect = 0; স্ট্যাটিক বুলিয়ান সংযুক্ত = 0; অস্থির বুল স্ক্যানিং = 0; volatileuint32_t পিনকোড;

স্ক্যানিং এবং প্রধান লুপ:

ক্লাস MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (advertisedDevice.toString ()। C_str ()); যদি (advertisedDevice.haveServiceUUID () && বিজ্ঞাপনকৃত ডিভাইস। GetScan ()-> stop (); myDevice = নতুন BLEAdvertisedDevice (বিজ্ঞাপনকৃত ডিভাইস); doConnect = সত্য; }}}; স্ট্যাটিক অকার্যকর স্ক্যান কমপ্লিট সিবি (BLEScanResults scanResults) {Serial.println ("স্ক্যানিং সম্পন্ন"); স্ক্যানিং = মিথ্যা; } অকার্যকর লুপ (অকার্যকর) {যদি (! সংযুক্ত && ((uint32_t) (মিলিস () - টাইমার)> BLE_RESCAN_TIME || (! স্ক্যানিং))) {সিরিয়াল.প্রিন্টলন ("স্ক্যানিং …"); স্ক্যানিং = সত্য; pBLEScan-> শুরু (BLE_SCAN_TIME, scanCompleteCB); টাইমার = মিলিস (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("আমরা এখন BLE সার্ভারের সাথে সংযুক্ত।"); সংযুক্ত = সত্য; } অন্য {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 = নতুন 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 ()); // OBTAIN ক্যামেরা মডেল 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 ()); ব্যর্থ হয়েছে; } // চরিত্রের মান পড়ুন। std:: string value = pRemoteCamModelCharacteristic-> readValue (); সিরিয়াল.প্রিন্ট ("ক্যামেরা হল"); Serial.println (value.c_str ()); যদি (CamModel! = value.c_str ()) {Serial.print (" - ক্যামেরা BMPCC4k নয়"); ব্যর্থ হয়েছে; } // OBTAIN CONTROL 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); যদি (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - বিজ্ঞপ্তিতে সদস্যতা নেওয়া") const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) ইঙ্গিত অন, 2, সত্য); } সত্য ফিরে; ব্যর্থ: pClient-> সংযোগ বিচ্ছিন্ন (); মিথ্যা প্রত্যাবর্তন; }

সংযুক্ত/বিচ্ছিন্ন কলব্যাক:

ক্লাস MyClientCallback: পাবলিক BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("আমরা সংযুক্ত।"); } void onDisconnect (BLEClient *pclient) {সংযুক্ত = মিথ্যা; pclient-> সংযোগ বিচ্ছিন্ন (); Serial.println ("আমরা সংযোগ বিচ্ছিন্ন হয়েছি।"); }};

পিন কোড অংশ:

আমার বর্তমান সংস্করণে আমি ওয়েব ইন্টারফেসের মাধ্যমে পিনকোড প্রবেশ করতে পারি কিন্তু এগুলি ওয়াইফাই/ওয়েবপেজের বিবরণ যা আমি পরে যোগ করতে পারি।

ক্লাস মাইসিকিউরিটি: পাবলিক BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (ENTER দিয়ে শেষ করুন:"); পিনকোড = 0; char ch; করুন {while (! Serial.available ()) {বিলম্ব (1); } ch = Serial.read (); যদি (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} যখন ((ch! = '\ n')); রিটার্ন পিনকোড; } vass 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, "The passkey 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 টগল করে যখন এটি রেকর্ডিং শুরু/বন্ধ করে দেয়।

স্ট্যাটিক অকার্যকর বিজ্ঞপ্তি কলব্যাক (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool is Notify) {// BMPCC4k BLE message format: // 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 (length == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {যদি (pData [8] == 0) { recstatus = 0; } যদি (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}; // 0 = OFF, 2 = ON, [8] অকার্যকর রেকর্ড (বুলিয়ান RecOn) {যদি (! RecOn) রেকর্ড [8] = 0; অন্য রেকর্ড [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) রেকর্ড, 16, সত্য); }

ফোকাসিং:

ক্যামেরা একটি 11 বিট নম্বর আশা করে, কাছাকাছি থেকে দূরবর্তী ফোকাস পর্যন্ত। আমি আপনার এডিসি মানের উপর একটি ফিল্টার লাগানোর পরামর্শ দিচ্ছি, অন্যথায় ফোকাসটি ঘাবড়ে যেতে পারে।

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 বিট সংখ্যা আশা করে, একটি নিম্ন থেকে উচ্চ অ্যাপারচার মান পর্যন্ত। আমি আপনার এডিসি ভ্যালুতে একটি ফিল্টার লাগানোর পরামর্শ দিচ্ছি, অন্যথায় অ্যাপারচারের মান ঘাবড়ে যেতে পারে।

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: সার্কিট

সার্কিট
সার্কিট

আমি আমার সার্কিটের পিডিএফ সংযুক্ত করেছি। পিসিবির কিছু ছবি সংযুক্ত করা হয়েছে।

বোর্ডটি মাইক্রো ইউএসবি দ্বারা চালিত।

পিসিবি পাওয়ার পরে আমি সিদ্ধান্ত নিলাম যে আমি একটি আরজিবি এলইডি চালাতে চাই, তাই আমি দুটি ডাব্লুএস 2812 বি সিরিজের "বোতাম লেড" আউটপুটে সংযুক্ত করেছি (যার জন্য পিসিবিতে কিছু তারের প্যাচ প্রয়োজন)। পিসিবি OSHPark.com এর সাথে 8USD ছিল।

আপনি পিসিবিতে আরো কিছু সংযোগ দেখতে পারেন যেমন "adc" যা আমি ব্যবহার করছি না এবং যা সংযুক্ত স্কিম্যাটিক্স থেকে সরানো হয়েছে। অতীতে একটি বহিরাগত ফোকাস চাকা ব্যবহার করার পরিকল্পনা ছিল কিন্তু বর্তমানে আমি সামান্য থাম্ব হুইল নিয়ে পুরোপুরি খুশি।

ধাপ 4: উপসংহার

আমি আশা করি এটি সাহায্য করেছে।

আমি ভবিষ্যতে কিছু আপডেট পেয়েছি, যেমন হার্ড স্টপ ছাড়া রোটারি এনকোডার ব্যবহার করা। এর জন্য নিয়ামককে ক্যামেরা থেকে ফোকাস বা অ্যাপারচারের বর্তমান মান পেতে হবে এবং সেখান থেকে চালিয়ে যেতে হবে। "NotifyCallback" ফাংশনটি সম্ভবত এর জন্য আপডেট করা দরকার।

WS2812B RGB LEDs এর জন্য সঠিকভাবে সিগন্যাল প্রদানের জন্য PCB এর একটি আপডেট প্রয়োজন।

আমি এই কাজটি করার জন্য অনেক সময় ব্যয় করেছি (বিশেষ করে BLE অংশ)। যদি এটি আপনাকে সাহায্য করে এবং আপনি আমাকে একটি পানীয় কিনতে চান, এটি খুবই প্রশংসিত:) এটি একটি পেপাল দান লিঙ্ক:

প্রস্তাবিত: