Sadržaj:

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

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

Video: Čarobno dugme 4k: bežični daljinski upravljač BMPCC 4k od 20 USD (ili 6k): 4 koraka (sa slikama)
Video: Kako bežično povezati telefon sa smart TV-om 2024, Juli
Anonim
Image
Image

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

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, sve što je u kameri može se kontrolirati, koliko sam vidio.

Bio bi jednostavan korak dodati LIDAR modul za mjerenje udaljenosti subjekta, tako da možete dobiti neku vrstu sistema 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. Zasnovan je 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

Supplies

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

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

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

Ostale standardne komponente, poput otpornika, kapa, … (vidi shemu)

Korak 1: Kôd

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

ESP32 se povezuje sa 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! Koristio sam BLE biblioteku odavde:

github.com/wakwak-koba/arduino-esp32

Ipak, ta verzija BLE liba je još uvijek u razvoju i č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čka BLERemoteCharacteristic *pControlCharacteristic; statički BLERemoteCharacteristic *pNotifCharacteristic; statičko logičko polje doConnect = 0; statičko logičko stanje povezano = 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 (). jednako (BlackMagic)) {Serial.print ("Pronađen je naš uređaj!"); advertisedDevice.getScan ()-> stop (); myDevice = novi BLEAdvertisedDevice (advertisedDevice); doConnect = true; }}}; statička praznina scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skeniranje završeno"); scanning = false; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning …"); scanning = true; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Tajmer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Sada smo povezani sa BLE serverom."); povezan = tačno; } else {Serial.println ("Nismo se uspjeli povezati sa serverom; ništa više nećemo učiniti."); } doConnect = false; }}

Povezivanje sa kamerom:

bool connectToServer () {

Serial.print ("Uspostavljanje veze sa"); 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-> connect (myDevice); Serial.println (" - Povezano sa serverom"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // DOBIVANJE MODELA KAMERE BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Preuzimanje informacione usluge o uređaju nije uspjelo"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); goto fail; } Serial.println (" - Čitanje informacija o uređaju"); // Dobivanje reference na karakteristiku u servisu udaljenog BLE servera. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nije moguće pronaći model kamere"); Serial.println (CamModelcharUUID.toString (). C_str ()); goto fail; } // Očitavanje vrijednosti 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 KONTROLU pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Usluga kamere nije uspjela"); 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-> disconnect (); Serial.println ("Prekinuli smo vezu."); }};

Dio PIN koda:

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

klasa MySecurity: javni BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- MOLIM VAS UNOSITE 6 DIGITALNI PIN (završi sa 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')); return pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Broj lozinke Notify:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Lozinka 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 ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE obavještenje:

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

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) { rekstatus = 0; } if (pData [8] == 2) {recstatus = 1; }}}

Korak 2: Kod drugi 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, tačno); }

Fokusiranje:

Kamera očekuje 11 -bitni broj, u rasponu od bliskog do dalekog fokusa. Savjetujem vam da postavite filter na vrijednost ADC -a, u protivnom 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 sa 12 -bitne ADC vrijednosti na 11 -bitnu vrijednost fokusa fokus [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, tačno); }

Otvor blende:

Kamera očekuje 11 -bitni broj, u rasponu od niske do velike vrijednosti otvora blende. Savetujem vam da postavite filter na ADC vrednost, u suprotnom bi vrednost otvora blende mogla nervozno da podrhtava.

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 sa 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

The Circuit
The Circuit

Priložio sam PDF svog kola. 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 seriju na izlaz "Button Led" (za koji su bile potrebne neke zakrpe žice na PCB -u). PCB -ovi su bili 8 USD sa OSHPark.com.

Možete vidjeti još neke veze na PCB -u, poput "adc" koje ne koristim i koje su uklonjene iz priloženih shema. Plan je bio da se u prošlosti koristi vanjski točkić za fokusiranje, ali trenutno sam savršeno zadovoljan malim točkićem za 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 koraka. To će zahtijevati da kontroler dobije trenutnu vrijednost fokusa ili otvora blende s fotoaparata, te nastavi odatle. Vjerovatno je potrebno ažurirati funkciju "notifyCallback" za to.

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

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

Preporučuje se: