جدول المحتويات:

الزر السحري 4k: جهاز التحكم عن بعد اللاسلكي 20 دولارًا أمريكيًا BMPCC (أو 6 كيلو): 4 خطوات (مع الصور)
الزر السحري 4k: جهاز التحكم عن بعد اللاسلكي 20 دولارًا أمريكيًا BMPCC (أو 6 كيلو): 4 خطوات (مع الصور)

فيديو: الزر السحري 4k: جهاز التحكم عن بعد اللاسلكي 20 دولارًا أمريكيًا BMPCC (أو 6 كيلو): 4 خطوات (مع الصور)

فيديو: الزر السحري 4k: جهاز التحكم عن بعد اللاسلكي 20 دولارًا أمريكيًا BMPCC (أو 6 كيلو): 4 خطوات (مع الصور)
فيديو: طريقة بسيطة و بدون تلحيم ستجعل هذه القطعة تتحكم في جميع اجهزة الاستقبال الميني بالريموت IR Sensor 2024, شهر نوفمبر
Anonim
Image
Image

لقد طلب مني العديد من الأشخاص مشاركة بعض التفاصيل حول وحدة التحكم اللاسلكية الخاصة بي لـ BMPCC4k. كانت معظم الأسئلة حول التحكم في البلوتوث ، لذلك سأذكر بعض التفاصيل حول ذلك. أفترض أنك على دراية ببيئة ESP32 Arduino.

يمكن لهذا الإصدار من جهاز التحكم عن بُعد التحكم في التسجيل والتركيز وفتحة الكاميرا عبر البلوتوث. إلقاء نظرة على الفيديو. من السهل جدًا إضافة المزيد من وظائف التحكم وفقًا لدليل التحكم في البلوتوث الخاص بـ BMPCC4k. في الأساس ، يمكن التحكم في أي شيء في الكاميرا ، بقدر ما رأيت.

ستكون خطوة سهلة لإضافة وحدة LIDAR لقياس مسافة الهدف ، بحيث يمكنك الحصول على نوع من نظام التركيز البؤري التلقائي … على الرغم من أنه من المشكوك فيه إذا كان بإمكانك الحصول على تركيز دقيق بدرجة كافية على مناطق معينة مثل العيون وما إلى ذلك …

تحديث 2020: لقد قمت بعمل الإصدار 3.0. يعتمد على عجلة دوارة مجانية باستخدام مشفر مغناطيسي. كما أنه يتصل بمحرك تركيز المتابعة الخاص بي ، والذي يصبح في الأساس جهاز بلوتوث ثانيًا (يدعم ESP32 اتصالات بلوتوث متعددة). الفيديو الجديد يوضح هذا.

إذا كنت ترغب في طلب الإصدار 3 ، فيرجى إلقاء نظرة على موقع MagicButton الإلكتروني

اللوازم

أي وحدة ESP32 مع واي فاي وبلوتوث. لقد استخدمت TTGO micro32 لأنه صغير: https://www.banggood.com/LILYGO-TTGO-Micro-32-V2_0 …

عجلة تركيز ، أي مقياس جهد سيفعله. لقد استخدمت ما يلي لأنه صغير جدًا: في إصدار مستقبلي ، سأستخدم مشفرًا دوارًا. بهذه الطريقة ، لا "يقفز" التركيز أو الفتحة إلى إعداد العجلة الحالي عند الدخول إلى الوضع.

زر rec / mode. لقد استخدمت ما يلي: https://www.aliexpress.com/item/32806223591.html؟ s …

المكونات القياسية الأخرى مثل المقاومات والأغطية … (انظر التخطيطي)

الخطوة 1: الكود

أستخدم قدرة wifi في ESP32 إما للاتصال بشبكة معروفة في وضع AP ، أو عندما أكون في الميدان ، تصبح محطة (STA) يمكنني الاتصال بها. بهذه الطريقة يمكنني تكوين الوحدة. لن أخوض في تفاصيل قسم wifi / صفحة الويب ، قد أضيف هذا في مرحلة لاحقة.

يتصل ESP32 بالكاميرا ويصبح عميل Bluetooth LE. لا يعمل رمز البلوتوث المضمن في إطار عمل ESP32 الخاص بـ Arduino مع BMPCC4k. لقد أصلحه Wakwak-koba لنا. شكرا لك واكواك-كوبا! لقد استخدمت مكتبة BLE من هنا:

github.com/wakwak-koba/arduino-esp32

ومع ذلك ، لا يزال هذا الإصدار من BLE lib قيد التطوير ولا يبدو أن أحدث إصدار من BLEUUID.cpp يعمل في الوقت الحالي ، لذا خذ النسخة السابقة "التي تم التحقق منها" من هذا الملف.

بالنسبة للباقي ، يكون معظم كود البلوتوث الخاص بي كثيرًا وفقًا لأمثلة BLE المضمنة في إطار عمل Arduino:

تعرف بعض UUID BLE والمتغير:

ثابت BLEUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb") ؛

ثابت BLEUID ControlserviceUID ("291D567A-6D75-11E6-8B77-86F30CA893D3") ؛ ثابت BLEUID DevInfoServiceControlUUID ("180A") ؛ ثابت BLEUID ControlcharUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB") ؛ ثابت BLEUID NotifcharUID ("B864E140-76A0-416A-BF30-5876504537D9") ؛ عميل BLEUID ثابت NamecharUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C") ؛ ثابت BLEUID CamModelcharUID ("2A24") ؛ ثابت BLEScan * pBLEScan = BLEDevice:: getScan () ، ثابت BLEAddress * pServerAddress ؛ BLEAdvertisedDevice الثابت * myDevice ؛ ثابت BLERemoteCharacteristic * pControlCharacteristic ؛ ثابت BLERemoteCharacteristic * pNotifCharacteristic ؛ doConnect منطقية ثابتة = 0 ؛ ثابت منطقي متصل = 0 ؛ مسح متطاير = 0 ؛ متقلبة 32_t pinCode ؛

حلقة المسح والحلقة الرئيسية:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevertisedDevice) {Serial.print ("BLE Advertised Device found:")؛ Serial.println (advertisedDevice.toString (). c_str ()) ؛ if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Found our device!")؛ advertisedDevice.getScan () -> stop () ؛ myDevice = new BLEAdvertisedDevice (advertisedDevice) ؛ doConnect = صحيح ؛ }}}؛ مسح الفراغ الثابت ("تم المسح الضوئي") ؛ المسح = خطأ ؛ } حلقة باطلة (باطلة) {إذا (! متصل && ((uint32_t) (مللي () - مؤقت)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning…")؛ المسح = صحيح ؛ pBLEScan-> start (BLE_SCAN_TIME، scanCompleteCB) ؛ الموقت = مللي () ؛ } إذا (doConnect == true) {if (connectToServer ()) {Serial.println ("نحن الآن متصلون بخادم BLE.") ؛ متصل = صحيح ؛ } else {Serial.println ("لقد فشلنا في الاتصال بالخادم ؛ لا يوجد شيء آخر سنفعله.")؛ } doConnect = false ؛ }}

التوصيل بالكاميرا:

منطقية connectToServer () {

Serial.print ("تكوين اتصال بـ") ؛ Serial.println (myDevice-> getAddress (). toString (). c_str ()) ؛ BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT) ، BLEDevice:: setSecurityCallbacks (new MySecurity ()) ؛ BLESecurity * pSecurity = new BLESecurity () ؛ pSecurity-> setKeySize () ؛ الأمن-> setAuthenticationMode (ESP_LE_AUTH_REQ_SC_MITM_BOND) ؛ الأمن-> setCapability (ESP_IO_CAP_IN) ؛ الأمن-> setRespEncryptionKey (ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK) ؛ BLEClient * pClient = BLEDevice:: createClient () ، pClient-> setClientCallbacks (جديد MyClientCallback ()) ؛ pClient-> connect (myDevice) ؛ Serial.println ("- متصل بالخادم") ؛ BLEDevice:: setMTU (BLEDevice:: getMTU ()) ؛ // OBTAIN CAMERA MODEL 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 ()) ؛ إذا (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) ؛ إذا (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 ، خطأ) ؛ pNotifCharacteristic-> getDescriptor (BLEUID ((uint16_t) 0x2902)) -> writeValue ((uint8_t *) indicationOn، 2، true) ؛ } عودة صحيحة؛ فشل: pClient-> disconnect () ؛ عودة كاذبة؛ }

رد الاتصال المتصل / المنقطع:

فئة MyClientCallback: عمومية BLEClientCallbacks {

void onConnect (BLEClient * pclient) {Serial.println ("نحن متصلون.") ؛ } void onDisconnect (BLEClient * pclient) {connect = false؛ pclient-> قطع الاتصال () ؛ Serial.println ("تم قطع اتصالنا") ؛ }}؛

جزء الرمز السري:

في إصداري الحالي يمكنني إدخال الرمز السري عبر واجهة الويب ولكن هذه تفاصيل wifi / صفحة الويب التي قد أضيفها لاحقًا.

فئة MySecurity: استرداد BLESecurityCallbacks العامة

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (ينتهي بـ ENTER):")؛ pinCode = 0 ؛ شار ؛ افعل {while (! Serial.available ()) {delay (1) ؛ } ch = Serial.read () ؛ إذا (ch> = '0' && ch <= '9') {pinCode = pinCode * 10 + (ch -'0 ') ؛ Serial.print (الفصل) ؛ }} while ((ch! = 'n')) ؛ عودة pinCode } باطل onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG، "رقم إعلام مفتاح المرور:٪ d"، pass_key) ؛ } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG، "رقم مفتاح المرور YES / NO:٪ d"، pass_key) ؛ vTaskDelay (5000) ؛ عودة حقيقية } bool onSecurityRequest () {ESP_LOGI (LOG_TAG، "Security Request") ؛ عودة حقيقية } باطل onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status =") ؛ Serial.println (auth_cmpl.success) ، }}؛

إشعار BLE:

تقوم الكاميرا بإخطار عملاء BLE بأي تغييرات في الكاميرا ، بما في ذلك عندما تبدأ الكاميرا وتتوقف عن التسجيل. يقوم هذا الرمز بتبديل مؤشر LED الخاص بي عندما يبدأ / يتوقف عن التسجيل.

إخطار الفراغ الثابت

uint8_t * pData، size_t length، 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 (length == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { إعادة الحالة = 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 = إيقاف ، 2 = تشغيل ، [8] سجل باطل (تسجيل منطقي) {if (! RecOn) سجل [8] = 0 ؛ سجل آخر [8] = 2 ؛ pControlCharacteristic-> writeValue ((uint8_t *) سجل ، 16 ، صحيح) ؛ }

التركيز:

تتوقع الكاميرا رقمًا 11 بت ، يتراوح من التركيز القريب إلى البعيد. أنصح بوضع مرشح على قيمة ADC الخاصة بك ، وإلا فقد يكون التركيز متوتراً بشكل عصبي.

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) {// الانتقال من قيمة ADC 12 بت إلى تركيز قيمة التركيز 11 بت [8] = (uint8_t) (((val> > 1) & 0xFF)) ؛ التركيز [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8) ؛ pControlCharacteristic-> writeValue ((uint8_t *) focus، 12، true) ؛ }

فتحة:

تتوقع الكاميرا رقمًا 11 بت ، يتراوح من قيمة فتحة منخفضة إلى قيمة عالية. أنصح بوضع مرشح على قيمة ADC الخاصة بك ، وإلا فإن قيمة الفتحة قد تكون متوترة بشكل عصبي.

فتحة uint8_t = {255 ، 6 ، 0 ، 0 ، 0 ، 3 ، 128 ، 0 ، 0 ، 0 ، 0 ، 0} ؛ // 0.0… 1.0، [8] = LSB، [9] = فتحة MSBwoid (uint16_t val) {// الانتقال من قيمة ADC 12 بت إلى فتحة قيمة فتحة 11 بت [8] = (uint8_t) (((val >> 1) & 0xFF)) ؛ الفتحة [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8) ؛ pControlCharacteristic-> writeValue ((uint8_t *) فتحة العدسة ، 12 ، صحيح) ؛ }

الخطوة 3: الدائرة

الدائرة
الدائرة

لقد أرفقت ملف PDF الخاص بدارتي. يتم أيضًا إرفاق بعض صور ثنائي الفينيل متعدد الكلور.

يتم تشغيل اللوحة بواسطة micro USB.

بعد استلام PCB ، قررت أنني أرغب في تشغيل RGB LED ، لذلك قمت بتوصيل اثنين من WS2812B في سلسلة بإخراج "Button Led" (الذي يحتاج إلى بعض تصحيحات الأسلاك على PCB). كان ثنائي الفينيل متعدد الكلور 8 دولارات أمريكية مع OSHPark.com.

يمكنك رؤية المزيد من الاتصالات على PCB مثل "adc" التي لا أستخدمها والتي تمت إزالتها من المخططات المرفقة. كانت الخطة هي استخدام عجلة تركيز خارجية في الماضي ، لكنني حاليًا سعيد تمامًا بعجلة الإبهام الصغيرة.

الخطوة 4: الخاتمة

آمل أن يكون هذا قد ساعد.

لقد وضعت بعض التحديثات المستقبلية في الاعتبار ، مثل استخدام برنامج تشفير دوار بدون توقفات صعبة. سيتطلب ذلك من وحدة التحكم الحصول على القيمة الحالية للتركيز أو الفتحة من الكاميرا ، والمتابعة من هناك. تحتاج وظيفة "notifyCallback" إلى التحديث لذلك على الأرجح.

يحتاج PCB إلى تحديث لتوفير الإشارات لمصابيح WS2812B RGB LED بشكل صحيح.

لقد قضيت الكثير من الوقت (الكثير) من الوقت في جعل هذا العمل ، وخاصة جزء BLE. إذا كان هذا قد ساعدك وتريد شراء مشروب لي ، فهذا موضع تقدير كبير:) هذا رابط تبرع من Paypal:

موصى به: