תוכן עניינים:

לחצן הקסם 4k: 20USD BMPCC 4k (או 6k) שלט רחוק אלחוטי: 4 שלבים (עם תמונות)
לחצן הקסם 4k: 20USD BMPCC 4k (או 6k) שלט רחוק אלחוטי: 4 שלבים (עם תמונות)

וִידֵאוֹ: לחצן הקסם 4k: 20USD BMPCC 4k (או 6k) שלט רחוק אלחוטי: 4 שלבים (עם תמונות)

וִידֵאוֹ: לחצן הקסם 4k: 20USD BMPCC 4k (או 6k) שלט רחוק אלחוטי: 4 שלבים (עם תמונות)
וִידֵאוֹ: Vivitar 28mm 2.8 MC адаптированный к A6000 Sony 2024, נוֹבֶמבֶּר
Anonim
Image
Image

אנשים רבים ביקשו ממני לשתף כמה פרטים על בקר האלחוטי שלי עבור BMPCC4k. רוב השאלות היו על בקרת ה- Bluetooth, אז אזכיר כמה פרטים על זה. אני מניח שאתה מכיר את הסביבה ESP32 Arduino.

גרסה זו של השלט יכולה לשלוט בהקלטה, מיקוד וצמצם של המצלמה באמצעות בלוטות '. תסתכל על הסרטון. די קל להוסיף פונקציות שליטה נוספות בהתאם למדריך הבקרה של ה- Bluetooth של BMPCC4k. בעצם כל דבר במצלמה ניתן לשליטה, עד כמה שראיתי.

זה יהיה צעד קל להוסיף מודול LIDAR למדידת מרחק הנושא, כך שתוכל לקבל איזושהי מערכת פוקוס אוטומטי … אם כי זה מוטל בספק אם תוכל להתמקד מספיק מספיק באזורים ספציפיים כגון עיניים וכו '…

עדכון 2020: הכנתי את גרסה 3.0. הוא מבוסס על גלגל מסתובב חופשי באמצעות מקודד מגנטי. הוא גם מתחבר למנוע הפוקוס שלי לעקוב, שבעצם הופך למכשיר Bluetooth שני (ה- ESP32 תומך בחיבורי Bluetooth מרובים). הסרטון החדש מדגים זאת.

אם ברצונך להזמין את גרסה 3, עיין באתר MagicButton

אספקה

כל מודול ESP32 עם wifi ו- bluetooth. השתמשתי במיקרו 32 TTGO מכיוון שהוא זעיר:

גלגל מיקוד, כל פוטנציומטר יעשה. השתמשתי בדברים הבאים מכיוון שהוא זעיר: https://www.aliexpress.com/item/32963061806.html? S … לסוג זה יש עצירות קשות בגבול העליון והתחתון. בגרסה עתידית אשתמש במקודד סיבובי. בדרך זו המיקוד או הצמצם אינם "קופצים" להגדרת הגלגל הנוכחית כשאני נכנס למצב.

כפתור rec/mode. השתמשתי בדברים הבאים: https://www.aliexpress.com/item/32806223591.html? S…

רכיבים סטנדרטיים אחרים כגון נגדים, כובעים, … (ראה סכמטי)

שלב 1: הקוד

אני משתמש ביכולת ה- wifi של ה- ESP32 כדי להתחבר לרשת ידועה במצב AP, או שכאשר אני בשטח היא הופכת לתחנה (STA) שאליה אני יכול להתחבר. כך אוכל להגדיר את המודול. לא אפרט על סעיף ה- wifi/webpage, אולי אוכל להוסיף זאת בשלב מאוחר יותר.

ה- ESP32 מתחבר למצלמה והופך ללקוח Bluetooth LE. קוד ה- Bluetooth הכלול במסגרת ה- ESP32 של Arduino אינו פועל עם BMPCC4k. וואקוואק-קובה תיקן לנו את זה. תודה וואקוואק-קובה! השתמשתי בספריית BLE מכאן:

github.com/wakwak-koba/arduino-esp32

עם זאת גרסה זו של BLE lib עדיין בפיתוח והגרסה העדכנית ביותר של BLEUUID.cpp לא עובדת כרגע, אז קח את הגרסה הקודמת "המאומתת" של קובץ זה.

לשאר, רוב קוד ה- Bluetooth שלי הוא הרבה לפי דוגמאות ה- BLE הכלולות במסגרת Arduino:

כמה הגדרות 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 סטטי NamecharUUID ("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;

הסריקה והלולאה הראשית:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("נמצא מכשיר מפורסם BLE:"); Serial.println (advertisedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). שווה (BlackMagic)) {Serial.print ("מצאנו את המכשיר שלנו!"); advertisedDevice.getScan ()-> stop (); myDevice = BLEAdvertisedDevice חדש (advertisedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("הסריקה בוצעה"); סריקה = שקר; } לולאת void (void) {אם (! מחובר && ((uint32_t) (millis () - טיימר)> BLE_RESCAN_TIME || (! סריקה))) {Serial.println ("סריקה …"); סריקה = אמת; pBLEScan-> התחל (BLE_SCAN_TIME, scanCompleteCB); טיימר = מיליס (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("כעת אנו מחוברים לשרת BLE."); מחובר = נכון; } else {Serial.println ("לא הצלחנו להתחבר לשרת; אין עוד מה לעשות"); } doConnect = false; }}

חיבור למצלמה:

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-> 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 ()); 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 indicion On = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indicOn, 2, true); } להחזיר נכון; נכשל: pClient-> נתק (); להחזיר שקר; }

החזרה המחוברת/מנותקת:

class MyClientCallback: BLEClientCallbacks ציבורי {

void onConnect (BLEClient *pclient) {Serial.println ("אנחנו מחוברים."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> נתק (); Serial.println ("התנתקנו."); }};

חלק הפין קוד:

בגרסה הנוכחית שלי אני יכול להזין את קוד הגישה באמצעות ממשק האינטרנט אך אלה הם פרטי wifi/דף אינטרנט אותם אני יכול להוסיף מאוחר יותר.

class MySecurity: BLESecurityCallbacks ציבורי

{uint32_t onPassKeyRequest () {Serial.println ("- אנא הזן 6 ספרות מספר (סיום עם ENTER):"); pinCode = 0; char ch; עשה {while (! Serial.available ()) {עיכוב (1); } ch = Serial.read (); if (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, "מספר הודעת מפתח הסיסמה:%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, "בקשת אבטחה"); חוזר; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

הודעת BLE:

המצלמה מודיעה ללקוחות BLE שלה על כל שינוי במצלמה, כולל מתי המצלמה מתחילה ומפסיקה את ההקלטה. קוד זה מחליף את ה- LED שלי כשהוא מתחיל/מפסיק להקליט.

הודעה על החלל הסטטי Callback (BLERemoteCharacteristic *pBLERemoteCharisticistic, 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) { recstatus = 0; } אם (pData [8] == 2) {recstatus = 1; }}}

שלב 2: הקוד חלק 2

זהו החלק שלמעשה שולח את הפקודות למצלמה.

הקלטה:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] record record (ריקול בוליאני) {if (! RecOn) record [8] = 0; רשומה אחרת [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) רשומה, 16, true); }

התמקדות:

המצלמה מצפה למספר של 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 של 12bit ל- focus bit value של 11bit [8] = (uint8_t) (((val> > 1) & 0xFF)); מוקד [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) מיקוד, 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] = צמצם MSBvoid (uint16_t val) {// עובר מערך ADC של 12bit לצמצם של ערך ערך צמצם של 11bit [8] = (uint8_t) (((val >> 1) & 0xFF)); צמצם [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) צמצם, 12, נכון); }

שלב 3: המעגל

המעגל
המעגל

צירפתי את קובץ ה- PDF של המעגל שלי. מצורפות גם כמה תמונות של ה- PCB.

הלוח מופעל באמצעות מיקרו USB.

לאחר קבלת הלוח החלטתי שאני רוצה להפעיל נורית RGB, ולכן חיברתי שני WS2812B בסדרה ליציאת "כפתור לד" (שצריך כמה תיקוני תיל במחשב הלוח). ה- PCB היו 8USD עם OSHPark.com.

אתה יכול לראות עוד חיבורים במחשב הלוח, כגון "adc" שאני לא משתמש בהם והוסרו מהתרשימים המצורפים. התוכנית הייתה להשתמש בגלגל מיקוד חיצוני בעבר, אבל אני כרגע מרוצה לחלוטין מגלגל האגודל הקטן.

שלב 4: מסקנה

אני מקווה שזה עזר.

יש לי כמה עדכונים עתידיים בחשבון, כגון שימוש במקודד סיבובי ללא עצירות קשות. זה ידרוש מהבקר לקבל את הערך הנוכחי של המיקוד או הצמצם מהמצלמה, ולהמשיך משם. צריך לעדכן את הפונקציה "notifyCallback" לשם כך כנראה.

ה- PCB זקוק לעדכון כדי לספק את האותות עבור נוריות ה- RGB WS2812B כראוי.

ביליתי הרבה זמן בביצוע העבודה הזו, במיוחד בחלק BLE. אם זה עזר לך ואתה רוצה לקנות לי משקה, זה מאוד מוערך:) זהו קישור לתרומה מ- PayPal:

מוּמלָץ: