Turinys:

Magiškas mygtukas 4k: 20 USD BMPCC 4k (arba 6 k) belaidis nuotolinio valdymo pultas: 4 žingsniai (su nuotraukomis)
Magiškas mygtukas 4k: 20 USD BMPCC 4k (arba 6 k) belaidis nuotolinio valdymo pultas: 4 žingsniai (su nuotraukomis)

Video: Magiškas mygtukas 4k: 20 USD BMPCC 4k (arba 6 k) belaidis nuotolinio valdymo pultas: 4 žingsniai (su nuotraukomis)

Video: Magiškas mygtukas 4k: 20 USD BMPCC 4k (arba 6 k) belaidis nuotolinio valdymo pultas: 4 žingsniai (su nuotraukomis)
Video: Laimingų Naujųjų metų dainų 2024 🎉 Laimingų Naujųjų metų muzika 2024 🎉 Top Christmas Dainos 2024 2024, Liepa
Anonim
Image
Image

Daugelis žmonių paprašė manęs pasidalinti informacija apie mano belaidį valdiklį, skirtą BMPCC4k. Dauguma klausimų buvo susiję su „Bluetooth“valdymu, todėl paminėsiu keletą detalių. Manau, kad esate susipažinę su ESP32 „Arduino“aplinka.

Ši nuotolinio valdymo pulto versija gali valdyti fotoaparato įrašymą, fokusavimą ir diafragmą per „Bluetooth“. Pažvelkite į vaizdo įrašą. Gana lengva pridėti daugiau valdymo funkcijų pagal BMPCC4k „Bluetooth“valdymo vadovą. Iš esmės viską, kas yra kameroje, galima valdyti, kiek mačiau.

Būtų paprastas žingsnis pridėti LIDAR modulį, kad būtų galima išmatuoti objekto atstumą, kad gautumėte savotišką automatinio fokusavimo sistemą … Nors abejotina, ar galite pakankamai tiksliai sutelkti dėmesį į tam tikras sritis, pvz., Akis ir pan.

ATNAUJINIMAS 2020: sukūriau 3.0 versiją. Jis pagrįstas laisvai besisukančiu ratu, naudojant magnetinį kodavimo įrenginį. Jis taip pat jungiasi prie mano sekimo fokusavimo variklio, kuris iš esmės tampa antruoju „Bluetooth“įrenginiu (ESP32 palaiko kelis „Bluetooth“ryšius). Naujasis vaizdo įrašas tai parodo.

Jei norite užsisakyti 3 versiją, peržiūrėkite „MagicButton“svetainę

Prekės

Bet kuris ESP32 modulis su „Wi -Fi“ir „Bluetooth“. Aš naudoju TTGO micro32, nes jis mažas:

Tiks fokusavimo ratas, bet koks potenciometras. Aš naudoju šiuos dalykus, nes jie yra maži: https://www.aliexpress.com/item/32963061806.html? S … Ši rūšis sunkiai sustoja prie viršutinės ir apatinės ribos. Būsimoje versijoje naudosiu rotacinį kodavimo įrenginį. Tokiu būdu, kai aš įjungiu režimą, fokusavimas ar diafragma „neperšoka“į dabartinį rato nustatymą.

Įrašymo/režimo mygtukas. Aš naudojau tai: https://www.aliexpress.com/item/32806223591.html? S…

Kiti standartiniai komponentai, tokie kaip rezistoriai, dangteliai,… (žr. Schemą)

1 žingsnis: Kodas

Aš naudoju ESP32 „Wi -Fi“galimybę prisijungti prie žinomo tinklo AP režimu arba, kai esu lauke, jis tampa stotimi (STA), prie kurios galiu prisijungti. Tokiu būdu galiu konfigūruoti modulį. Aš nesileisiu į „wifi“/tinklalapio skyriaus detales, galbūt pridėsiu tai vėliau.

ESP32 jungiasi prie fotoaparato ir tampa „Bluetooth LE“klientu. „Arduino“ESP32 sistemoje esantis „Bluetooth“kodas neveikia su BMPCC4k. „Wakwak-koba“mums tai ištaisė. Ačiū Wakwak-koba! Aš naudoju BLE biblioteką iš čia:

github.com/wakwak-koba/arduino-esp32

Nepaisant to, ta BLE lib versija vis dar kuriama, o naujausia BLEUUID.cpp versija šiuo metu neveikia, todėl imkitės ankstesnės „patvirtintos“šio failo versijos.

Likusioje dalyje dauguma mano „Bluetooth“kodo yra daug pagal BLE pavyzdžius, įtrauktus į „Arduino“sistemą:

Kai kurie BLE UUID ir kintamieji apibrėžia:

statinis „BLEUUID BlackMagic“(„00001800-0000-1000-8000-00805f9b34fb“);

statinis „BLEUUID ControlserviceUUID“(„291D567A-6D75-11E6-8B77-86F30CA893D3“); statinis BLEUUID DevInfoServiceControlUUID ("180A"); statinis „BLEUUID ControlcharUUID“(„5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB“); statinis BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statinis „BLEUUID ClientNamecharUUID“(„FFAC0C52-C9FB-41A0-B063-CC76282EB89C“); statinis BLEUUID CamModelcharUUID ("2A24"); statinis BLEScan *pBLEScan = BLEDevice:: getScan (); statinis BLEAddress *pServerAddress; statinis BLEAdvertisedDevice* myDevice; statinis BLERemoteCharacteristic *pControlCharacteristic; statinis BLERemoteCharacteristic *pNotifCharacteristic; statinis loginis doConnect = 0; prijungtas statinis loginis = 0; lakiųjų skiedinių nuskaitymas = 0; volatileuint32_t pinCode;

Nuskaitymas ir pagrindinė kilpa:

klasė MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("Rastas BLE reklamuojamas įrenginys:"); Serial.println (AdvertisedDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). lygus („BlackMagic“)) {Serial.print ("Radome mūsų įrenginį!"); AdvertisedDevice.getScan ()-> stop (); myDevice = naujas BLEAdvertisedDevice (reklamuojamas įrenginys); doConnect = tiesa; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("nuskaitymas atliktas"); nuskaitymas = klaidinga; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! nuskaitymas))) {Serial.println ("nuskaitymas …"); nuskaitymas = tiesa; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Laikmatis = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Dabar esame prisijungę prie BLE serverio"); prijungtas = tiesa; } else {Serial.println ("Nepavyko prisijungti prie serverio; nieko daugiau nedarysime."); } doConnect = false; }}

Prijungimas prie fotoaparato:

bool connectToServer () {

Serial.print ("Ryšio suformavimas"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (new MySecurity ()); BLESecurity *pSecurity = naujas 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 (naujas MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Prisijungta prie serverio"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // ĮSIGYTI KAMEROS MODELĮ BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Nepavyko gauti įrenginio informacijos paslaugos"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); nepavyko; } Serial.println (" - Įrenginio informacijos skaitymas"); // Gauti nuorodą į charakteristiką nuotolinio BLE serverio paslaugoje. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nepavyko rasti fotoaparato modelio"); Serial.println (CamModelcharUUID.toString (). C_str ()); nepavyko; } // Perskaitykite charakteristikos vertę. std:: eilutės reikšmė = pRemoteCamModelCharacteristic-> readValue (); Serial.print („Fotoaparatas yra“); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Fotoaparatas nėra BMPCC4k"); nepavyko; } // ĮSIGYTI valdymą pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Nepavyko gauti kameros paslaugos"); Serial.println (ControlserviceUUID.toString (). C_str ()); nepavyko; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (ManoVardas.c_str (), ManoVardas. ilgis ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nepavyko gauti valdymo charakteristikos"); Serial.println (ControlcharUUID.toString (). C_str ()); nepavyko; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - pranešimo prenumerata"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indicOn, 2, true); } return true; nepavyksta: pClient-> atjungti (); grąžinti klaidingą; }

Prijungtas/atjungtas atgalinis skambutis:

„MyClientCallback“klasė: viešas BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Mes esame prisijungę"); } void onDisconnect (BLEClient *pclient) {prijungtas = klaidingas; pclient-> atjungti (); Serial.println ("Mes atsijungėme."); }};

PIN kodo dalis:

Dabartinėje versijoje galiu įvesti PIN kodą per žiniatinklio sąsają, tačiau tai yra „Wi -Fi“/tinklalapio informacija, kurią galiu pridėti vėliau.

„MySecurity“klasė: viešasis BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 SIGIT PIN PIN (end with ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} while ((ch! = '\ n')); grįžti pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Slaptažodžio pranešimo numeris:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "The passkey YES/NO number:%d", pass_key); „vTaskDelay“(5000); sugrįžti; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Saugos užklausa"); sugrįžti; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE pranešimas:

Fotoaparatas praneša savo BLE klientams apie visus fotoaparato pakeitimus, įskaitant tada, kai fotoaparatas pradeda ir sustabdo įrašymą. Šis kodas perjungia mano šviesos diodą, kai jis pradeda/sustabdo įrašymą.

statinis negaliojantis pranešimasCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t ilgis, bool isNotify) {// BMPCC4k BLE pranešimo formatas: // rec on is 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off is 255 9 0 0 10 1 1 2 0 0 64 0 2if (ilgis == 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 žingsnis: kodo 2 dalis

Tai yra dalis, kuri iš tikrųjų siunčia komandas į fotoaparatą.

Įrašymas:

uint8_t įrašas = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = IŠJUNGTA, 2 = ĮJUNGTA, [8] negaliojantis įrašas (boolean RecOn) {if (! RecOn) įrašas [8] = 0; kitas įrašas [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) įrašas, 16, tiesa); }

Fokusavimas:

Fotoaparatas tikisi 11 bitų skaičiaus, nuo artimo iki tolimo fokusavimo. Aš patariu įdėti filtrą į savo ADC vertę, kitaip dėmesys gali nervingai suvirpėti.

uint8_t focus = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, 11 bitų, [8] = LSB, [9] = „MSBvoid Focus“(uint16_t val) {// pereinant nuo 12 bitų ADC vertės iki 11 bitų fokusavimo vertės fokusavimo [8] = (uint8_t) (((val> > 1) & 0xFF)); fokusas [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokusas, 12, tiesa); }

Diafragma:

Fotoaparatas tikisi 11 bitų skaičiaus, nuo mažos iki didelės diafragmos vertės. Patariu į savo ADC vertę įdėti filtrą, kitaip diafragmos vertė gali nervingai virpėti.

uint8_t diafragma = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid diafragma (uint16_t val) {// nuo 12 bitų ADC vertės iki 11 bitų diafragmos vertės diafragma [8] = (uint8_t) ((((val >> 1)) Ir 0xFF)); diafragma [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) diafragma, 12, tiesa); }

3 žingsnis: grandinė

Circuit
Circuit

Pridedu savo grandinės PDF failą. Taip pat pridedamos kai kurios PCB nuotraukos.

Plokštė maitinama naudojant mikro USB.

Gavęs PCB nusprendžiau, kad noriu vairuoti RGB šviesos diodą, todėl prie „Button Led“išvesties prijungiau du WS2812B nuosekliai (tam reikėjo PCB laidų). PCB buvo 8 USD su OSHPark.com.

PCB galite pamatyti dar keletą jungčių, pvz., „Adc“, kurių nenaudoju ir kurios buvo pašalintos iš pridėtų schemų. Anksčiau planavau naudoti išorinį fokusavimo ratą, tačiau šiuo metu esu visiškai patenkintas mažuoju nykščio ratuku.

4 žingsnis: Išvada

Tikiuosi, kad tai padėjo.

Turiu omenyje kai kuriuos būsimus atnaujinimus, pvz., Rotacinio kodavimo įrenginio naudojimą be jokių sustojimų. Tam reikės, kad valdiklis iš fotoaparato gautų dabartinę fokusavimo ar diafragmos vertę ir tęstų iš ten. Tikriausiai reikia atnaujinti funkciją „pranešimų iškvietimas“.

Norint tinkamai pateikti WS2812B RGB šviesos diodų signalus, PCB reikia atnaujinti.

Kurdamas šį darbą, ypač BLE dalį, praleidau daug (daug laiko). Jei tai jums padėjo ir norite nusipirkti man gėrimo, tai labai vertinama:) Tai yra „Paypal“dovanojimo nuoroda:

Rekomenduojamas: