Სარჩევი:

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 მოდულის დამატება საგნის მანძილის გასაზომად, ასე რომ თქვენ შეგიძლიათ მიიღოთ რაიმე სახის ავტოფოკუსირების სისტემა … თუმცა საეჭვოა თუ შეძლებთ საკმარისად ზუსტი ფოკუსირება ისეთ სფეროებზე, როგორიცაა თვალები და ა.

განახლება 2020: მე გავაკეთე ვერსია 3.0. იგი დაფუძნებულია უფასო მბრუნავ ბორბალზე მაგნიტური კოდირების გამოყენებით. ის ასევე უკავშირდება ჩემს შემდგომ ფოკუსირების ძრავას, რომელიც ძირითადად ხდება მეორე bluetooth მოწყობილობა (ESP32 მხარს უჭერს მრავალ bluetooth კავშირს). ახალი ვიდეო ამას ადასტურებს.

თუ გსურთ შეუკვეთოთ ვერსია 3, გადახედეთ MagicButton ვებსაიტს

მარაგები

ნებისმიერი ESP32 მოდული wifi და bluetooth. მე გამოვიყენე 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 *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.haveServiceUUID () && advertisedDevice.getServiceUUID (). უდრის (BlackMagic)) {Serial.print ("ვიპოვეთ ჩვენი მოწყობილობა!"); advertisedDevice.getScan ()-> გაჩერება (); myDevice = ახალი BLEAdvertisedDevice (რეკლამირებული მოწყობილობა); doConnect = ჭეშმარიტი; }}}; სტატიკური ბათილი სკანირება CompleteCB (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 = 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 ("კამერა არის"); 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 მითითება = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) ჩვენებაOn, 2, true); } დაბრუნება ჭეშმარიტი; ვერ: pClient-> გაწყვეტა (); დაბრუნება ცრუ; }

დაკავშირებული/გათიშული გამოძახება:

კლასი MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("ჩვენ დაკავშირებულები ვართ."); } void onDisconnect (BLEClient *pclient) {დაკავშირებული = ყალბი; კლიენტი-> გათიშვა (); Serial.println ("ჩვენ გათიშული ვართ."); }};

პინ კოდის ნაწილი:

ჩემს ახლანდელ ვერსიაში შემიძლია პინკოდის შეყვანა ვებ ინტერფეისის საშუალებით, მაგრამ ეს არის wifi/ვებ გვერდის დეტალები, რომელიც შეიძლება მოგვიანებით დავამატო.

კლასი MySecurity: public BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- გთხოვთ შეიყვანოთ 6 ციფრი PIN (დასრულდება ENTER):"); pinCode = 0; char ch; გავაკეთოთ {while (! Serial.available ()) {დაგვიანებით (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); სერიული. ბეჭდვა (ჩ); }} 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 ("წყვილის სტატუსი ="); Serial.println (auth_cmpl. წარმატება); }};

BLE შეტყობინება:

კამერა აცნობებს თავის BLE კლიენტებს კამერის ნებისმიერი ცვლილების შესახებ, მათ შორის, როდესაც კამერა იწყებს და შეწყვეტს ჩაწერას. ეს კოდი ცვლის ჩემს LED- ს, როდესაც ის იწყებს/წყვეტს ჩაწერას.

static void 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 0 0 64 0 2if (სიგრძე == 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 ჩანაწერი = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = გამორთული, 2 = ჩართული, [8] ბათილი ჩანაწერი (ლოგიკური ჩაწერა) {if (! RecOn) ჩანაწერი [8] = 0; else record [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) ჩანაწერი, 16, ჭეშმარიტი); }

ფოკუსირება:

კამერა ელოდება 11 ბიტიან რიცხვს, დაწყებული ახლოდან შორს ფოკუსამდე. მე გირჩევთ, რომ განათავსოთ ფილტრი თქვენს ADC მნიშვნელობაზე, წინააღმდეგ შემთხვევაში ყურადღება შეიძლება ნერვიულად მომაჯადოებელი იყოს.

uint8_t ფოკუსი = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, 11 ბიტი, [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) {// 12bit ADC მნიშვნელობიდან 11bit დიაფრაგმის მნიშვნელობის დიაფრაგმა [8] = (uint8_t) (((val >> 1) & 0xFF)); დიაფრაგმა [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) დიაფრაგმა, 12, ჭეშმარიტი); }

ნაბიჯი 3: წრე

წრე
წრე

მე დავამატე ჩემი წრის PDF. PCB– ს ზოგიერთი სურათი ასევე თან ერთვის.

დაფა იკვებება მიკრო USB- ით.

PCB– ის მიღების შემდეგ მე გადავწყვიტე, რომ მინდოდა RGB LED– ის მართვა, ამიტომ მე სერიულად ორი WS2812B შევუერთე ღილაკს Led გამომავალს (ამას PCB– ზე გარკვეული მავთულის პატჩები სჭირდებოდა). PCB იყო 8USD ერთად OSHPark.com.

თქვენ შეგიძლიათ ნახოთ PCB– ზე კიდევ რამდენიმე კავშირი, როგორიცაა „adc“, რომელსაც მე არ ვიყენებ და რომელიც ამოღებულია თანდართული სქემებიდან. გეგმა იყო წარსულში გარე ფოკუსის ბორბლის გამოყენება, მაგრამ მე ამჟამად მშვენივრად კმაყოფილი ვარ ცერა თითით.

ნაბიჯი 4: დასკვნა

ვიმედოვნებ, რომ ეს დაეხმარა.

მხედველობაში მაქვს მომავალი განახლებები, როგორიცაა მბრუნავი კოდირების გამოყენება მყარი გაჩერების გარეშე. ეს მოითხოვს კონტროლერს, რომ მიიღოს კამერის ფოკუსის ან დიაფრაგმის მიმდინარე მნიშვნელობა და გააგრძელოს იქიდან. ალბათ "notifyCallback" ფუნქციის განახლებაა საჭირო.

PCB- ს სჭირდება განახლება, რათა უზრუნველყოს სიგნალები WS2812B RGB LED- ებისთვის.

მე ბევრი დრო დავხარჯე ამ სამუშაოს შესაქმნელად, განსაკუთრებით BLE ნაწილისთვის. თუ ეს დაგეხმარათ და გინდათ ჩემთვის სასმელის ყიდვა, ეს ძალიან დასაფასებელია:) ეს არის Paypal შემოწირულობის ბმული:

გირჩევთ: