Sadržaj:

Čarobni gumb 4k: bežični daljinski upravljač BMPCC 4k (ili 6k) od 20 USD: 4 koraka (sa slikama)
Čarobni gumb 4k: bežični daljinski upravljač BMPCC 4k (ili 6k) od 20 USD: 4 koraka (sa slikama)

Video: Čarobni gumb 4k: bežični daljinski upravljač BMPCC 4k (ili 6k) od 20 USD: 4 koraka (sa slikama)

Video: Čarobni gumb 4k: bežični daljinski upravljač BMPCC 4k (ili 6k) od 20 USD: 4 koraka (sa slikama)
Video: Garmin VIRB 360: Getting Started 2024, Srpanj
Anonim
Image
Image

Mnogi su me ljudi zamolili da podijelim neke detalje o svom bežičnom upravljaču za BMPCC4k. Većina pitanja odnosila se na bluetooth kontrolu, pa ću spomenuti nekoliko detalja o tome. Pretpostavljam da ste upoznati s okruženjem ESP32 Arduino.

Ova verzija daljinskog upravljača može upravljati snimanjem, fokusom i otvorom blende kamere putem Bluetootha. Pogledajte video. Vrlo je jednostavno dodati više kontrolnih funkcija prema Bluetooth priručniku za upravljanje BMPCC4k. U osnovi, koliko god sam vidio, u kameri se može kontrolirati.

Bio bi to jednostavan korak za dodavanje LIDAR modula za mjerenje udaljenosti subjekta, tako da možete dobiti neku vrstu sustava za automatsko fokusiranje … Iako je upitno možete li dovoljno precizno fokusirati određena područja poput očiju itd.

AŽURIRANJE 2020: Napravio sam verziju 3.0. Temelji se na slobodno rotirajućem kotaču pomoću magnetskog kodera. Također se povezuje s mojim motorom za praćenje fokusa, koji u osnovi postaje drugi bluetooth uređaj (ESP32 podržava više bluetooth veza). Novi video to dokazuje.

Ako želite naručiti verziju 3, pogledajte web stranicu MagicButton

Pribor

Bilo koji ESP32 modul s wifi i bluetoothom. Koristio sam TTGO micro32 jer je malen:

Kotačić za fokusiranje, bilo koji potenciometar bi odgovarao. Koristio sam sljedeće jer je maleno: https://www.aliexpress.com/item/32963061806.html? S… Ova vrsta ima tvrde graničnike na gornjoj i donjoj granici. U budućoj verziji koristit ću rotacijski davač. Na ovaj način fokus ili otvor blende ne "skoče" na trenutnu postavku kotača kad uđem u način rada.

Gumb za snimanje/način rada. Koristio sam sljedeće: https://www.aliexpress.com/item/32806223591.html? S…

Ostale standardne komponente kao što su otpornici, kape, … (vidi shemu)

Korak 1: Kôd

Koristim mogućnost WiFi -ja ESP32 za povezivanje s poznatom mrežom u načinu AP -a ili, kad sam na terenu, postaje stanica (STA) na koju se mogu spojiti. Na taj način mogu konfigurirati modul. Neću ulaziti u detalje o odjeljku wifi/web stranica, ovo bih mogao dodati kasnije.

ESP32 se povezuje s kamerom i postaje Bluetooth LE klijent. Bluetooth kôd uključen u Arduino ESP32 okvir ne radi s BMPCC4k. Wakwak-koba nam je to popravio. Hvala ti Wakwak-koba! Ovdje sam koristio biblioteku BLE:

github.com/wakwak-koba/arduino-esp32

Ipak, ta se verzija BLE liba još uvijek razvija, a čini se da najnovija verzija BLEUUID.cpp u ovom trenutku ne radi, pa uzmite raniju "provjerenu" verziju ove datoteke.

U ostalom, većina mog bluetooth koda je puno prema BLE primjerima uključenim u Arduino okvir:

Neki BLE UUID i varijabla definiraju:

statički BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");

statički BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statički BLEUUID DevInfoServiceControlUUID ("180A"); statički BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statički BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statički BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statički BLEUUID CamModelcharUUID ("2A24"); statički BLEScan *pBLEScan = BLEDevice:: getScan (); statička BLEAddress *pServerAddress; statički BLEAdvertisedDevice* myDevice; statički BLERemoteCharacteristic *pControlCharacteristic; statički BLERemoteCharacteristic *pNotifCharacteristic; statički boolean doConnect = 0; statički boolean spojen = 0; volatilebool skeniranje = 0; volatileuint32_t pinCode;

Skeniranje i glavna petlja:

klasa MyAdvertisedDeviceCallbacks: javni BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("Pronađen BLE oglašen uređaj:"); Serial.println (advertisedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Pronađen je naš uređaj!"); advertisedDevice.getScan ()-> stop (); myDevice = novi BLEAdvertisedDevice (advertisedDevice); doConnect = istina; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skeniranje završeno"); skeniranje = lažno; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning …"); skeniranje = istina; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Tajmer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Sada smo spojeni na BLE poslužitelj."); spojen = istina; } else {Serial.println ("Nismo se uspjeli povezati sa poslužiteljem; ništa više nećemo učiniti."); } doConnect = false; }}

Spajanje na kameru:

bool connectToServer () {

Serial.print ("Uspostavljanje veze s"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (nova MySecurity ()); BLESecurity *pSecurity = novi 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 (novi MyClientCallback ()); pClient-> povezivanje (myDevice); Serial.println (" - Spojen na poslužitelj"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // DOBIVANJE MODELA KAMERE BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Nije uspjelo dobivanje info usluge uređaja"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); goto fail; } Serial.println (" - Čitanje podataka o uređaju"); // Dobivanje reference na karakteristiku u usluzi udaljenog BLE poslužitelja. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nije uspjelo pronalaženje modela kamere"); Serial.println (CamModelcharUUID.toString (). C_str ()); goto fail; } // Očitajte vrijednost karakteristike. std:: string vrijednost = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera je"); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera nije BMPCC4k"); goto fail; } // DOBITI UPRAVLJANJE pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Nije uspjelo dobivanje usluge kamere"); Serial.println (ControlserviceUUID.toString (). C_str ()); goto fail; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nije uspjelo dobivanje kontrolne karakteristike"); Serial.println (ControlcharUUID.toString (). C_str ()); goto fail; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - pretplata na obavijest"); const uint8_t indikacijaOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikacijaOn, 2, true); } return true; fail: pClient-> disconnect (); return false; }

Povezani/prekinuti povratni poziv:

klasa MyClientCallback: javni BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Povezani smo."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> prekinuti vezu (); Serial.println ("Prekinuli smo vezu."); }};

Dio PIN koda:

U mojoj trenutnoj verziji mogu ući u PIN kod putem web sučelja, ali to su detalji o wifi/web stranici koje bih mogao dodati kasnije.

klasa MySecurity: javni BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- MOLIM VAS, UNOSITE 6 DIGITALNI PIN (završi s ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serijski.ispis (ch); }} while ((ch! = '\ n')); return pinCode; } void onPassKeyNotify (uint32_t pristupni ključ) {ESP_LOGE (LOG_TAG, "Broj obavijesti pristupnog ključa:%d", ključ_propusnika); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Zaporka DA/NE broj:%d", ključ_prolaza); vTaskDelay (5000); returnntrue; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Sigurnosni zahtjev"); returnntrue; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("par status ="); Serial.println (auth_cmpl.success); }};

BLE obavijest:

Kamera obavještava svoje BLE klijente o svim promjenama kamere, uključujući kada kamera počne i prestane snimati. Ovaj kôd prebacuje moju LED lampicu kada započne/prestane snimati.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE format poruke: // uključeno je 255 9 0 0 10 1 1 2 2 0 64 0 2 // isključeno je 255 9 0 0 10 1 1 2 0 0 64 0 2if (dužina == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { rektus = 0; } if (pData [8] == 2) {recstatus = 1; }}}

Korak 2: Kod 2, dio

Ovo je dio koji zapravo šalje naredbe kameri.

Snimanje:

uint8_t zapis = {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; else zapis [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) zapis, 16, istina); }

Fokusiranje:

Kamera očekuje 11 -bitni broj, u rasponu od bliskog do dalekog fokusa. Savjetujem vam da postavite filtar na svoju vrijednost ADC -a, inače bi fokus mogao biti nervozno podrhtavan.

uint8_t fokus = {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) {// prelazak s 12 -bitne ADC vrijednosti na 11 -bitnu vrijednost fokusa [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, istina); }

Otvor:

Kamera očekuje 11 -bitni broj, u rasponu od niske do velike vrijednosti otvora blende. Savjetujem vam da postavite vrijednost na ADC vrijednost, u protivnom bi vrijednost otvora blende mogla nervozno drhtati.

uint8_t otvor blende = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// prelazak s 12 -bitne ADC vrijednosti na 11 -bitnu vrijednost otvora blende [8] = (uint8_t) (((val >> 1) & 0xFF)); otvor blende [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) otvor blende, 12, true); }

Korak 3: Krug

Krug
Krug

Priložio sam PDF svoje sheme. U prilogu su i neke slike PCB -a.

Ploča se napaja mikro USB -om.

Nakon što sam primio PCB, odlučio sam da želim voziti RGB LED, pa sam spojio dva WS2812B u nizu na izlaz "Button Led" (za to su bile potrebne neke zakrpe žice na PCB -u). PCB -ovi su bili 8 USD uz OSHPark.com.

Na PCB -u možete vidjeti još neke veze poput "adc" koje ne koristim i koje su uklonjene iz priloženih shema. U prošlosti je plan bio koristiti vanjski kotačić za fokusiranje, ali trenutno sam savršeno zadovoljan kotačićem za mali palac.

Korak 4: Zaključak

Nadam se da je ovo pomoglo.

Imam na umu neka buduća ažuriranja, poput korištenja rotacijskog kodera bez otežanih zaustavljanja. To će zahtijevati da kontroler dobije trenutnu vrijednost fokusa ili otvora blende s fotoaparata, te nastavi odatle. Vjerojatno je za to potrebno ažurirati funkciju "notifyCallback".

PCB -u je potrebno ažuriranje kako bi pravilno pružao signale za WS2812B RGB LED diode.

Potrošio sam puno (mnogo) vremena na stvaranje ovog djela, posebno na BLE dio. Ako vam je ovo pomoglo i želite me kupiti pićem, to je jako cijenjeno:) Ovo je link za donacije putem Paypala:

Preporučeni: