Kazalo:

Čarobni gumb 4k: brezžični daljinski upravljalnik 20USD BMPCC 4k (ali 6k): 4 koraki (s slikami)
Čarobni gumb 4k: brezžični daljinski upravljalnik 20USD BMPCC 4k (ali 6k): 4 koraki (s slikami)

Video: Čarobni gumb 4k: brezžični daljinski upravljalnik 20USD BMPCC 4k (ali 6k): 4 koraki (s slikami)

Video: Čarobni gumb 4k: brezžični daljinski upravljalnik 20USD BMPCC 4k (ali 6k): 4 koraki (s slikami)
Video: (pусские субтитры) Токио Япония Капсульный отель опыт😊 Этаж только для женщин 2024, Julij
Anonim
Image
Image

Mnogi ljudje so me prosili, naj povem nekaj podrobnosti o svojem brezžičnem krmilniku za BMPCC4k. Večina vprašanj se je nanašala na nadzor Bluetooth, zato bom omenil nekaj podrobnosti o tem. Predvidevam, da poznate okolje ESP32 Arduino.

Ta različica daljinskega upravljalnika lahko nadzoruje snemanje, ostrenje in zaslonko kamere prek Bluetootha. Oglejte si video. Dodajanje več kontrolnih funkcij je v skladu z navodili za upravljanje bluetooth BMPCC4k precej preprosto. Kolikor sem videl, je v bistvu vse v fotoaparatu mogoče nadzorovati.

Dodajanje modula LIDAR za merjenje razdalje predmeta je preprost korak, tako da lahko dobite nekakšen sistem samodejnega ostrenja … Čeprav je vprašljivo, ali se lahko dovolj natančno osredotočite na določena področja, kot so oči itd.

UPDATE 2020: Naredil sem različico 3.0. Temelji na prostem vrtljivem kolesu z magnetnim kodirnikom. Povezuje se tudi z mojim sledilnim motorjem, ki v bistvu postane druga naprava Bluetooth (ESP32 podpira več povezav bluetooth). Novi video to dokazuje.

Če želite naročiti različico 3, si oglejte spletno mesto MagicButton

Zaloge

Vsak modul ESP32 z wifi in bluetoothom. Uporabil sem TTGO micro32, ker je majhen:

Kolo za ostrenje, kateri koli potenciometer bi bil primeren. Uporabil sem naslednje, ker je majhno: https://www.aliexpress.com/item/32963061806.html? S… Ta vrsta se trdo ustavi na zgornji in spodnji meji. V prihodnji različici bom uporabil rotacijski dajalnik. Tako izostritev ali zaslonka ne "skočita" na trenutno nastavitev kolesa, ko vstopim v način.

Gumb za snemanje/način. Uporabil sem naslednje: https://www.aliexpress.com/item/32806223591.html? S…

Druge standardne komponente, kot so upori, pokrovi, … (glej shemo)

1. korak: Koda

ESP32 uporabljam za povezavo z znanim omrežjem v načinu AP ali pa, ko sem na terenu, postane postaja (STA), na katero se lahko povežem. Tako lahko konfiguriram modul. Ne bom se spuščal v podrobnosti o razdelku wifi/spletna stran, to lahko dodam pozneje.

ESP32 se poveže s kamero in postane odjemalec Bluetooth LE. Koda bluetooth, vključena v okvir Arduino ESP32, ne deluje z BMPCC4k. Wakwak-koba nam je to popravil. Hvala Wakwak-koba! Od tu sem uporabil knjižnico BLE:

github.com/wakwak-koba/arduino-esp32

Kljub temu se ta različica knjižnice BLE še razvija in najnovejša različica programa BLEUUID.cpp trenutno ne deluje, zato vzemite prejšnjo "preverjeno" različico te datoteke.

V ostalem je večina moje kode bluetooth veliko po primerih BLE, vključenih v okvir Arduino:

Nekateri BLE UUID in spremenljivka opredeljujejo:

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

statični nadzorni servis BLEUUIDUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statični BLEUUID DevInfoServiceControlUUID ("180A"); statični nadzor BLEUUIDcharcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statični BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statični BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statični BLEUUID CamModelcharUUID ("2A24"); statični BLEScan *pBLEScan = BLEDevice:: getScan (); statični naslov BLEAddress *pServerAddress; statična BLEAdvertisedDevice* myDevice; statična BLERemoteCharacteristic *pControlCharacteristic; statična BLERemoteCharacteristic *pNotifCharacteristic; statična logična vrednost doConnect = 0; statična logična povezava = 0; skeniranje volatilebool = 0; volatileuint32_t pinCode;

Skeniranje in glavna zanka:

razred MyAdvertisedDeviceCallbacks: javni BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("Najdena oglaševana naprava BLE:"); Serial.println (advertisedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Najdena je bila naša naprava!"); advertisedDevice.getScan ()-> stop (); myDevice = nova BLEAdvertisedDevice (advertisedDevice); doConnect = res; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skeniranje končano"); skeniranje = napačno; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning …"); skeniranje = res; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Časovnik = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Zdaj smo povezani s strežnikom BLE."); povezan = res; } else {Serial.println ("Povezave s strežnikom ni uspelo; nič več ne bomo storili."); } doConnect = false; }}

Povezovanje s kamero:

bool connectToServer () {

Serial.print ("Vzpostavljanje povezave z"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (nova MySecurity ()); BLESecurity *pSecurity = nova 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 (nov MyClientCallback ()); pClient-> poveži (myDevice); Serial.println (" - Povezano s strežnikom"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // PRIDOBITE MODEL KAMERE BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Dostop do podatkov o napravi ni uspel"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); iti neuspešno; } Serial.println (" - Branje podatkov o napravi"); // Pridobite sklic na značilnost v storitvi oddaljenega strežnika BLE. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Modela kamere ni bilo mogoče najti"); Serial.println (CamModelcharUUID.toString (). C_str ()); iti neuspešno; } // Preberite vrednost lastnosti. std:: niz vrednost = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera je"); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera ni BMPCC4k"); iti neuspešno; } // PRIDOBITE NADZOR pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Storitev kamere ni uspela"); Serial.println (ControlserviceUUID.toString (). C_str ()); iti neuspešno; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Ni bilo mogoče dobiti kontrolne lastnosti"); Serial.println (ControlcharUUID.toString (). C_str ()); iti neuspešno; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - naročnina na obvestilo"); 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/odklopljeni povratni klic:

razred MyClientCallback: javni BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Povezani smo."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> odklopi (); Serial.println ("Prekinili smo povezavo."); }};

Del PIN kode:

V svoji trenutni različici lahko vnesem pinkodo prek spletnega vmesnika, vendar so to podrobnosti o wifi/spletni strani, ki jih lahko dodam kasneje.

razred MySecurity: javna BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PROSIM VSTOPITE 6 ŠTEVIČNI PIN (konec z 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, "Številka obvestila gesla:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Geslo YES/NO številka:%d", pass_key); vTaskDelay (5000); povratnik; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Varnostna zahteva"); povratnik; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

Obvestilo BLE:

Kamera obvesti svoje odjemalce BLE o vseh spremembah fotoaparata, tudi o tem, kdaj fotoaparat zažene in preneha snemati. Ta koda preklopi LED, ko začne/ustavi snemanje.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k format sporočila BLE: // rec on je 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off je 255 9 0 0 10 1 1 2 0 0 64 0 2if (dolž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; }}}

2. korak: 2. del kode

To je del, ki dejansko pošilja ukaze kameri.

Snemanje:

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, true); }

Osredotočanje:

Kamera pričakuje 11 -bitno število, ki sega od blizu do daleč. Svetujem, da filtrirate vrednost ADC -ja, sicer se lahko osredotočite na živčno tresenje.

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) {// prehod z 12 -bitne vrednosti ADC na 11 -bitno vrednost ostrenja [8] = (uint8_t) (((val> > 1) & 0xFF)); focus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) focus, 12, true); }

Odprtina:

Kamera pričakuje 11 -bitno število, od nizke do visoke vrednosti zaslonke. Priporočam, da za vrednost ADC vstavite filter, sicer bi lahko vrednost zaslonke živčno trepetala.

uint8_t zaslonka = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// gre od 12 -bitne vrednosti ADC do 11 -bitne vrednosti zaslonke aperture [8] = (uint8_t) (((val >> 1) & 0xFF)); zaslonka [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) zaslonka, 12, true); }

3. korak: vezje

Vezje
Vezje

Priložil sem PDF svojega vezja. Priloženih je tudi nekaj slik tiskanega vezja.

Plošča se napaja z mikro USB.

Po prejemu tiskanega vezja sem se odločil, da želim poganjati LED RGB, zato sem dva WS2812B zaporedoma priključil na izhod "Button Led" (to je zahtevalo nekaj žic na tiskanem vezju). PCB -ji so bili 8USD z OSHPark.com.

Na tiskanem vezju lahko vidite še nekaj povezav, na primer "adc", ki jih ne uporabljam in so bile odstranjene iz priloženih shem. Načrt je bil, da sem v preteklosti uporabil zunanje ostrenje, vendar sem trenutno popolnoma zadovoljen s koleščkom palca.

4. korak: Zaključek

Upam, da je to pomagalo.

V mislih imam nekaj prihodnjih posodobitev, na primer uporabo rotacijskega dajalnika brez močnih ustavitev. To bo zahtevalo, da krmilnik dobi trenutno vrednost ostrenja ali zaslonke iz fotoaparata in nadaljuje od tam. Verjetno je treba za to posodobiti funkcijo "notifyCallback".

PCB potrebuje posodobitev za pravilno zagotavljanje signalov za LED WS2812B RGB.

Za to delo sem porabil veliko (ogromno) časa, še posebej za BLE. Če vam je to pomagalo in mi želite kupiti pijačo, je to zelo cenjeno:) To je povezava za donacije Paypala:

Priporočena: