فهرست مطالب:

دکمه جادویی 4k: کنترل از راه دور بی سیم 20USD BMPCC 4k (یا 6k): 4 مرحله (همراه با تصاویر)
دکمه جادویی 4k: کنترل از راه دور بی سیم 20USD BMPCC 4k (یا 6k): 4 مرحله (همراه با تصاویر)

تصویری: دکمه جادویی 4k: کنترل از راه دور بی سیم 20USD BMPCC 4k (یا 6k): 4 مرحله (همراه با تصاویر)

تصویری: دکمه جادویی 4k: کنترل از راه دور بی سیم 20USD BMPCC 4k (یا 6k): 4 مرحله (همراه با تصاویر)
تصویری: 50 دوچرخه برقی و لوازم جانبی دوچرخه 2021 - 2022 2024, جولای
Anonim
Image
Image

بسیاری از مردم از من خواسته اند تا جزئیات مربوط به کنترلر بی سیم خود را برای BMPCC4k به اشتراک بگذارم. بیشتر سوالات در مورد کنترل بلوتوث بود ، بنابراین من به چند جزئیات در مورد آن اشاره می کنم. فرض می کنم شما با محیط ESP32 Arduino آشنا هستید.

این نسخه از راه دور می تواند ضبط ، فوکوس و دیافراگم دوربین را از طریق بلوتوث کنترل کند. به ویدیو نگاه کنید. مطابق راهنمای کنترل بلوتوث BMPCC4k ، افزودن عملکردهای کنترل بسیار آسان است. تا آنجا که من دیده ام ، اساساً هر چیزی در دوربین قابل کنترل است.

افزودن یک ماژول LIDAR برای اندازه گیری فاصله یک موضوع ، گامی آسان خواهد بود ، بنابراین می توانید نوعی سیستم فوکوس خودکار داشته باشید … اگرچه می توانید تمرکز کافی را بر روی مناطق خاصی مانند چشم و غیره به دست آورید ، مشکوک است.

UPDATE 2020: من نسخه 3.0 را تهیه کردم. این بر اساس یک چرخان چرخشی رایگان با استفاده از رمزگذار مغناطیسی است. همچنین به موتور فوکوس follow من متصل می شود ، که اساساً به یک دستگاه بلوتوث دوم تبدیل می شود (ESP32 از چندین اتصال بلوتوث پشتیبانی می کند). ویدئوی جدید این را نشان می دهد.

اگر می خواهید نسخه 3 را سفارش دهید ، لطفاً به وب سایت MagicButton مراجعه کنید

تدارکات

هر ماژول ESP32 با وای فای و بلوتوث. من از TTGO micro32 استفاده کردم چون کوچک است:

یک چرخ فوکوس ، هر پتانسیومتر می تواند انجام دهد. من از موارد زیر استفاده کردم زیرا بسیار کوچک است: https://www.aliexpress.com/item/32963061806.html؟ s… این نوع توقف های سختی در مرز بالا و پایین دارد. در نسخه آینده از رمزگذار چرخشی استفاده می کنم. به این ترتیب هنگام وارد شدن به حالت ، فوکوس یا دیافراگم به تنظیمات چرخ فعلی "پرش" نمی کند.

یک دکمه rec/mode. من از موارد زیر استفاده کردم: https://www.aliexpress.com/item/32806223591.html؟ s…

سایر اجزای استاندارد مانند مقاومت ، سرپوش ،… (شماتیک را ببینید)

مرحله 1: کد

من از قابلیت wifi ESP32 برای اتصال به یک شبکه شناخته شده در حالت AP استفاده می کنم ، یا وقتی در میدان هستم ، به یک ایستگاه (STA) تبدیل می شود که می توانم به آن متصل شوم. به این ترتیب می توانم ماژول را پیکربندی کنم. من جزئیات بخش wifi/صفحه وب را وارد نمی کنم ، ممکن است این را در مرحله بعدی اضافه کنم.

ESP32 به دوربین متصل می شود و به یک مشتری بلوتوث LE تبدیل می شود. کد بلوتوث موجود در چارچوب ESP32 آردوینو با BMPCC4k کار نمی کند. Wakwak-koba آن را برای ما حل کرده است. با تشکر از Wakwak-koba! من از کتابخانه BLE از اینجا استفاده کردم:

github.com/wakwak-koba/arduino-esp32

با این وجود ، نسخه BLE lib هنوز در دست توسعه است و به نظر نمی رسد که آخرین نسخه BLEUUID.cpp فعلاً کار کند ، بنابراین نسخه قبلی "تأیید شده" این فایل را بگیرید.

در بقیه موارد ، بیشتر کد بلوتوث من بر اساس نمونه های 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 استاتیک 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 pinCode؛

حلقه اسکن و اصلی:

کلاس MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("دستگاه تبلیغاتی BLE پیدا شد:") ؛ Serial.println (advertisedDevice.toString (). c_str ()) ؛ if (advertisedDevice.getScan ()-> stop ()؛ myDevice = BLEAdvertisedDevice جدید (advertisedDevice) ؛ doConnect = true؛ }}} ؛ اسکن خالی استاتیک CompleteCB (BLEScanResults scanResults) {Serial.println ("اسکن انجام شد") ؛ اسکن = false؛ } حلقه void (void) {if (! متصل && ((uint32_t) (میلی ثانیه () - تایمر)> BLE_RESCAN_TIME || (! اسکن))) {Serial.println ("اسکن …") ؛ اسکن = درست؛ pBLEScan-> شروع (BLE_SCAN_TIME ، scanCompleteCB) ؛ تایمر = میلی ثانیه ()؛ } if (doConnect == true) {if (connectToServer ()) {Serial.println ("ما اکنون به سرور BLE متصل هستیم.")؛ متصل = true؛ } 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 = 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 ()) ؛ // 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 ("Camera is")؛ 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 indicationOn = {0x2 ، 0x0} ؛ pNotifCharacteristic-> registerForNotify (notifyCallback ، false) ؛ pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) نشانگر On ، 2 ، true) ؛ } true true؛ fail: pClient-> disconnect ()؛ false false؛ }

تماس تلفنی متصل/قطع شده:

کلاس MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("ما متصل هستیم.")؛ } void onDisconnect (BLEClient *pclient) {connect = false؛ pclient-> disconnect ()؛ Serial.println ("ما قطع شدیم.")؛ }}؛

قسمت کد پین:

در نسخه فعلی من می توانم کد پین را از طریق رابط وب وارد کنم ، اما اینها جزئیات wifi/صفحه وب هستند که بعداً ممکن است اضافه کنم.

کلاس MySecurity: public 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'))؛ بازگشت پین کد ؛ } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG ، "شماره هشدار رمز عبور:٪ d" ، کلید عبور)؛ } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG ، "شماره رمز بله/شماره شماره:٪ d" ، کلید_ عبور) ؛ 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 من را تغییر می دهد.

void static notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic،

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 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 ؛ } if (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 = خاموش ، 2 = روشن ، [8] void Record (boolean RecOn) {if (! RecOn) record [8] = 0؛ else record [8] = 2؛ pControlCharacteristic-> recordValue ((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] = MSBvocus Focus (uint16_t val) {// رفتن از یک مقدار ADC 12bit به 11bit تمرکز [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] = MSBvoid Aperture (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 پشتیبانی می کند.

پس از دریافت PCB تصمیم گرفتم که می خواهم LED RGB را هدایت کنم ، بنابراین دو سری WS2812B را به صورت خروجی "Button Led" (که به برخی از وصله های سیم روی PCB نیاز داشت) وصل کردم. PCB ها 8USD با OSHPark.com بودند.

شما می توانید اتصالات بیشتری را در PCB مانند "adc" که من از آنها استفاده نمی کنم و از نمودارهای پیوست حذف شده اند ، مشاهده کنید. برنامه این بود که در گذشته از چرخ فوکوس خارجی استفاده شود ، اما در حال حاضر از چرخ انگشت شست کوچک بسیار راضی هستم.

مرحله 4: نتیجه گیری

امیدوارم این کمک کرده باشد.

من برخی از به روز رسانی های آینده را در ذهن دارم ، مانند استفاده از رمزگذار چرخشی بدون توقف های سخت. این امر باعث می شود کنترل کننده مقدار فعلی فوکوس یا دیافراگم را از دوربین دریافت کرده و از آنجا ادامه دهد. احتمالاً عملکرد "notifyCallback" باید به روز شود.

PCB نیاز به یک به روز رسانی دارد تا سیگنال های LED های WS2812B RGB را به درستی ارائه دهد.

من زمان زیادی را صرف ساخت این کار کردم ، به ویژه قسمت BLE. اگر این به شما کمک کرد و می خواهید برای من نوشیدنی بخرید ، بسیار قدردانی می شود:) این پیوند اهدای پی پال است:

توصیه شده: