Агуулгын хүснэгт:

Magic Button 4k: 20USD BMPCC 4k (эсвэл 6k) утасгүй алсын удирдлага: 4 алхам (зурагтай)
Magic Button 4k: 20USD BMPCC 4k (эсвэл 6k) утасгүй алсын удирдлага: 4 алхам (зурагтай)

Видео: Magic Button 4k: 20USD BMPCC 4k (эсвэл 6k) утасгүй алсын удирдлага: 4 алхам (зурагтай)

Видео: Magic Button 4k: 20USD BMPCC 4k (эсвэл 6k) утасгүй алсын удирдлага: 4 алхам (зурагтай)
Видео: MagicButton4k: super handy bmpcc4k bluetooth remote 2024, Есдүгээр
Anonim
Image
Image

Олон хүмүүс надаас BMPCC4k утасгүй хянагчийнхаа талаар дэлгэрэнгүй мэдээлэл өгөхийг хүссэн. Ихэнх асуултууд нь bluetooth хяналттай холбоотой байсан тул би энэ талаар хэдэн дэлгэрэнгүй мэдээлэл өгөх болно. Таныг ESP32 Arduino орчинтой танилцсан гэж бодож байна.

Алсын удирдлагын энэ хувилбар нь камерын бичлэг, фокус, диафрагмыг bluetooth -ээр хянах боломжтой. Видео бичлэгийг үзээрэй. BMPCC4k -ийн bluetooth хяналтын гарын авлагын дагуу илүү олон хяналтын функцийг нэмэх нь маш хялбар юм. Үндсэндээ миний харж байгаагаар камер доторх бүх зүйлийг хянах боломжтой.

Субъектын зайг хэмжих LIDAR модулийг нэмэх нь хялбар алхам бөгөөд ингэснээр та ямар нэгэн төрлийн автофокусын систем авах боломжтой болно … Хэдийгээр та нүд гэх мэт тодорхой чиглэлд хангалттай нарийвчлалтай анхаарлаа төвлөрүүлж чадах эсэх нь эргэлзээтэй байна.

UPDATE 2020: Би 3.0 хувилбарыг хийсэн. Энэ нь соронзон кодлогч ашиглан үнэгүй эргэдэг дугуй дээр суурилдаг. Энэ нь миний дагаж мөрдөх фокус мотортой холбогддог бөгөөд энэ нь үндсэндээ хоёр дахь Bluetooth төхөөрөмж болдог (ESP32 нь олон Bluetooth холболтыг дэмждэг). Шинэ видео нь үүнийг харуулж байна.

Хэрэв та 3 -р хувилбарыг захиалахыг хүсвэл MagicButton вэбсайтаас үзнэ үү

Хангамж

Wifi болон bluetooth бүхий аливаа ESP32 модуль. Би TTGO micro32-ийг жижигхэн учраас ашигласан:

Аливаа потенциометрийн фокус дугуй. Жижигхэн болохоор би дараах зүйлийг ашигласан: https://www.aliexpress.com/item/32963061806.html? S… Энэ төрөл нь дээд ба доод хил дээр хатуу зогсолттой байдаг. Ирээдүйн хувилбарт би эргэдэг кодлогч ашиглах болно. Ийм байдлаар намайг горимд ороход фокус эсвэл диафрагм нь одоогийн дугуйны тохиргоо руу "үсрэхгүй" болно.

Rec/mode товчлуур. Би дараахь зүйлийг ашигласан: https://www.aliexpress.com/item/32806223591.html? S …

Бусад стандарт бүрэлдэхүүн хэсгүүд болох резистор, таг,… (схемийг үзнэ үү)

Алхам 1: Код

Би ESP32 -ийн wifi боломжийг ашиглан мэдэгдэж буй сүлжээнд AP горимд холбогддог, эсвэл намайг талбайд байхад энэ нь миний холбогдож болох станц (STA) болдог. Ингэснээр би модулийг тохируулж чадна. Би wifi/вэб хуудасны хэсгийг нарийвчлан тайлбарлахгүй, дараа нь үүнийг нэмж болно.

ESP32 нь камертай холбогдож, Bluetooth LE үйлчлүүлэгч болдог. Arduino -ийн ESP32 системд багтсан bluetooth код нь BMPCC4k -тэй ажиллахгүй байна. Ваквак-коба үүнийг бидэнд зориулж зассан. Баярлалаа Ваквак-коба! Би эндээс BLE номын санг ашигласан.

github.com/wakwak-koba/arduino-esp32

Гэсэн хэдий ч BLE lib -ийн энэ хувилбар боловсруулагдаагүй байгаа бөгөөд BLEUUID.cpp -ийн хамгийн сүүлийн хувилбар одоогоор ажиллахгүй байгаа тул энэ файлын өмнөх "баталгаажсан" хувилбарыг аваарай.

Бусад тохиолдолд миний ихэнх bluetooth код нь 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 *pNotifCaracteristic; статик логик doConnect = 0; статик логик холбогдсон = 0; volatilebool скан хийх = 0; volatileuint32_t pinCode;

Скан хийх ба үндсэн давталт:

MyAdvertisedDeviceCallbacks анги: нийтийн BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice reklamaedDevice) {Serial.print ("BLE зарласан төхөөрөмж олдсон:"); Serial.println (зарлагдсанDevice.toString (). C_str ()); if (сурталчилсанDevice.haveServiceUUID () && adsedDevice.getServiceUUID (). тэнцүү (BlackMagic)) {Serial.print ("Манай төхөөрөмжийг олсон!"); зарлагдсанDevice.getScan ()-> зогсоох (); myDevice = шинэ BLEAdvertisedDevice (сурталчилсан төхөөрөмж); doConnect = үнэн; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("скан хийсэн"); скан хийх = худал; } void loop (void) {if (! холбогдсон && ((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 = худал; }}

Камертай холбогдож байна:

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 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 утга = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Камер бол"); Serial.println (утга.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, үнэн); } үнэн рүү буцах; амжилтгүй болсон: pClient-> disconnect (); худал буцах; }

Холбогдсон/салгагдсан дуудлага:

MyClientCallback анги: нийтийн BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Бид холбогдсон байна."); } void onDisconnect (BLEClient *pclient) {холбогдсон = худал; pclient-> салгах (); Serial.println ("Бид салсан."); }};

Пин кодын хэсэг:

Миний одоогийн хувилбарт би пин кодыг вэб интерфэйсээр оруулах боломжтой боловч эдгээр нь дараа нь нэмж болох wifi/вэб хуудасны дэлгэрэнгүй мэдээлэл юм.

MySecurity анги: нийтийн BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- 6 ОРООТОЙ ПИН оруулна уу (ENTER-ээр дуусна):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Цуваа.хэвлэх (ch); }} байхад ((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, "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 ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE мэдэгдэл:

Камер нь камерын өөрчлөлт, түүний дотор камер бичиж эхлэх, зогсоох тухай BLE үйлчлүүлэгчдэдээ мэдэгддэг. Энэ код нь бичлэгийг эхлүүлэх/зогсоох үед миний LED -ийг унтраана.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCaracteristic, 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 (урт == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { статус = 0; } if (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 = OFF, 2 = ON, [8] void Record (boolean RecOn) {if (! RecOn) record [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) {// 12 битийн ADC утгаас 11 битийн фокусын утга руу шилжих [8] = (uint8_t) (((val> > 1) & 0xFF)); анхаарал [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) фокус, 12, үнэн); }

Нүх:

Камер нь бага, өндөр диафрагмын хооронд 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) {// 12 битийн ADC -ээс 11 битийн диафрагмын диафрагм руу шилжих [8] = (uint8_t) ((((val >> 1)) & 0xFF)); нүх [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) диафрагм, 12, үнэн); }

Алхам 3: Хэлхээ

Хэлхээ
Хэлхээ

Би тойргийнхоо PDF файлыг хавсаргав. ПХБ -ийн зарим зургийг хавсаргасан болно.

Уг самбар нь микро USB -ээр тэжээгддэг.

ПХБ -ийг хүлээн авсны дараа би RGB LED жолоодох хүсэлтэй байгаагаа шийдсэн тул хоёр WS2812B -ийг "Button Led" гаралт руу холбосон (үүнд ПХБ -д утсан засвар хийх шаардлагатай байсан). ПХБ нь OSHPark.com -той 8USD байсан.

ПХБ дээр миний ашигладаггүй "хавсралт" гэх мэт холболтыг харж болно. Өмнө нь гаднах фокусын дугуй ашиглах төлөвлөгөөтэй байсан боловч одоогоор би эрхий хуруугаараа маш их баяртай байна.

Алхам 4: Дүгнэлт

Энэ тусалсан гэж найдаж байна.

Эргэдэг кодлогчийг ямар ч зогсолтгүй ашиглах гэх мэт ирээдүйн зарим шинэчлэлтийг би санаж байна. Энэ нь хянагчийг камераас фокус эсвэл диафрагмын одоогийн утгыг аваад тэндээс үргэлжлүүлэхийг шаардах болно. "NotifyCallback" функцийг шинэчлэх шаардлагатай байж магадгүй юм.

WS2812B RGB LED -ийн дохиог зохих ёсоор хангахын тулд ПХБ -ийг шинэчлэх шаардлагатай байна.

Би энэ ажлыг хийхэд маш их цаг зарцуулсан, ялангуяа BLE хэсэг. Хэрэв энэ нь танд тусалсан бөгөөд та надад ундаа уухыг хүсч байвал энэ нь маш их талархаж байна:) Энэ бол Paypal хандивын линк юм:

Зөвлөмж болгож буй: