Obsah:

Magic Button 4k: Bezdrôtové diaľkové ovládanie 20USD BMPCC 4k (alebo 6k): 4 kroky (s obrázkami)
Magic Button 4k: Bezdrôtové diaľkové ovládanie 20USD BMPCC 4k (alebo 6k): 4 kroky (s obrázkami)

Video: Magic Button 4k: Bezdrôtové diaľkové ovládanie 20USD BMPCC 4k (alebo 6k): 4 kroky (s obrázkami)

Video: Magic Button 4k: Bezdrôtové diaľkové ovládanie 20USD BMPCC 4k (alebo 6k): 4 kroky (s obrázkami)
Video: Samsung one remote control pairing - RESET 2024, November
Anonim
Image
Image

Mnoho ľudí ma požiadalo, aby som sa podelil o niektoré podrobnosti o mojom bezdrôtovom ovládači pre BMPCC4k. Väčšina otázok sa týkala ovládania bluetooth, preto o tom uvediem niekoľko podrobností. Predpokladám, že ste oboznámení s prostredím ESP32 Arduino.

Táto verzia diaľkového ovládania môže ovládať nahrávanie, zaostrovanie a clonu fotoaparátu prostredníctvom bluetooth. Pozrite sa na video. Podľa návodu na ovládanie bluetooth BMPCC4k je veľmi jednoduché pridať ďalšie funkcie ovládania. V kamere je možné ovládať v zásade čokoľvek, pokiaľ som videl.

Pridanie modulu LIDAR na meranie vzdialenosti objektu by bolo jednoduchým krokom, aby ste mohli získať nejaký systém automatického zaostrovania … Aj keď je otázne, či dokážete dostatočne presne zaostriť na konkrétne oblasti, ako sú oči atď.

UPDATE 2020: Vytvoril som verziu 3.0. Je založený na voľne sa otáčajúcom kolese pomocou magnetického snímača. Pripojí sa tiež k môjmu nasledujúcemu zaostrovaciemu motoru, ktorý sa v podstate stáva druhým zariadením bluetooth (ESP32 podporuje viacnásobné pripojenie bluetooth). Svedčí o tom nové video.

Ak by ste si chceli objednať verziu 3, pozrite sa na webovú stránku MagicButton

Zásoby

Akýkoľvek modul ESP32 s wifi a bluetooth. Použil som TTGO micro32, pretože je malý:

Zaostrovacie koliesko by stačilo na akýkoľvek potenciometer. Použil som nasledujúce, pretože je to malé: https://www.aliexpress.com/item/32963061806.html? S … Tento druh má pevné zarážky na hornej a dolnej hranici. V budúcej verzii budem používať rotačný kodér. Keď tak prejdem do režimu, zaostrenie alebo clona tak „nepreskočí“na aktuálne nastavenie kolieska.

Tlačidlo nahrávania/režimu. Použil som nasledujúce: https://www.aliexpress.com/item/32806223591.html? S…

Ďalšie štandardné komponenty, ako sú odpory, krytky, … (pozri schému)

Krok 1: Kód

Používam wifi schopnosť ESP32 buď na pripojenie k známej sieti v režime AP, alebo, keď som v teréne, stane sa stanicou (STA), ku ktorej sa môžem pripojiť. Tak môžem nakonfigurovať modul. Nebudem sa podrobne zaoberať sekciou wifi/webových stránok, možno to pridám neskôr.

ESP32 sa pripojí k fotoaparátu a stane sa klientom Bluetooth LE. Kód bluetooth zahrnutý v rámci ESP32 systému Arduino nefunguje s BMPCC4k. Wakwak-koba nám to opravil. Ďakujem Wakwak-koba! Odtiaľ som použil knižnicu BLE:

github.com/wakwak-koba/arduino-esp32

Napriek tomu je táto verzia BLE lib stále vo vývoji a zdá sa, že najnovšia verzia BLEUUID.cpp v tejto chvíli nefunguje, preto vezmite predchádzajúcu „overenú“verziu tohto súboru.

Vo zvyšku je väčšina môjho kódu bluetooth veľa podľa príkladov BLE zahrnutých v rámci Arduino:

Niektoré BLE UUID a premenné definujú:

statický BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");

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

Skenovacia a hlavná slučka:

trieda MyAdvertisedDeviceCallbacks: verejné BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (advertisingedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Found our device!"); advertisingedDevice.getScan ()-> stop (); myDevice = new BLEAdvertisedDevice (advertisingedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skenovanie dokončené"); skenovanie = nepravda; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! skenovanie))) {Serial.println ("skenovanie …"); skenovanie = true; pBLEScan-> štart (BLE_SCAN_TIME, scanCompleteCB); Časovač = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Teraz sme pripojení k serveru BLE."); spojený = pravdivý; } else {Serial.println („Nepodarilo sa nám pripojiť k serveru; už nebudeme robiť nič.“); } doConnect = false; }}

Pripojenie k fotoaparátu:

bool connectToServer () {

Serial.print ("Vytváranie pripojenia k"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (nová MySecurity ()); BLESecurity *pSecurity = nová 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-> connect (myDevice); Serial.println (" - Pripojené k serveru"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // ZÍSKAJTE MODEL KAMERY BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Službu s informáciami o zariadení sa nepodarilo získať"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); choďte neúspešne; } Serial.println (" - informácie o zariadení na čítanie"); // Získať odkaz na charakteristiku v službe vzdialeného servera BLE. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nepodarilo sa nájsť model kamery"); Serial.println (CamModelcharUUID.toString (). C_str ()); choďte neúspešne; } // Prečítajte si hodnotu charakteristiky. std:: hodnota reťazca = pRemoteCamModelCharacteristic-> readValue (); Serial.print („Fotoaparát je“); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera nie je BMPCC4k"); choďte neúspešne; } // ZÍSKANIE KONTROLY pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Nepodarilo sa získať kamerový servis"); Serial.println (ControlserviceUUID.toString (). C_str ()); choďte neúspešne; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nepodarilo sa získať kontrolnú charakteristiku"); Serial.println (ControlcharUUID.toString (). C_str ()); choďte neúspešne; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - predplatenie oznámenia"); const uint8_t indikáciaOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (NotifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikáciaOn, 2, true); } return true; zlyhať: pClient-> odpojiť (); return false; }

Pripojené/odpojené spätné volanie:

trieda MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Sme spojení."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> odpojiť (); Serial.println („Odpojili nás.“); }};

Časť kódu PIN:

V mojej aktuálnej verzii môžem zadať PIN kód prostredníctvom webového rozhrania, ale toto sú podrobnosti o wifi/webovej stránke, ktoré môžem pridať neskôr.

trieda MySecurity: public BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PROSÍM ZADAJTE 6 DIGITÁLNY PIN (koniec 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')); návrat pinCode; } neplatné onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Číslo prístupového kľúča:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Heslo YES/NO number:%d", pass_key); vTaskDelay (5000); návratnosť; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, „požiadavka na bezpečnosť“); návratnosť; } neplatné onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

Upozornenie BLE:

Fotoaparát upozorňuje svojich klientov BLE na všetky zmeny fotoaparátu, a to aj vtedy, keď fotoaparát spustí a zastaví nahrávanie. Tento kód prepne moju LED diódu, keď začne/zastaví nahrávanie.

static Void NotifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE formát správy: // 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 2 0 0 64 0 2if (dĺžka == 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; }}}

Krok 2: Kód, časť 2

Toto je časť, ktorá skutočne odosiela príkazy kamere.

Nahrávanie:

záznam uint8_t = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = VYPNUTÉ, 2 = ZAPNUTÉ, [8] neplatný záznam (booleovský RecOn) {if (! RecOn) záznam [8] = 0; else record [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) záznam, 16, true); }

Zaostrovanie:

Fotoaparát očakáva 11 -bitové číslo v rozsahu od blízkeho po vzdialené zaostrovanie. Odporúčam vložiť filter na hodnotu ADC, inak môže dôjsť k nervóznemu chveniu zaostrenia.

uint8_t zameranie = {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) {// prechod z hodnoty 12bit ADC na 11bit focus focus focus [8] = (uint8_t) (((val> > 1) & 0xFF)); zaostrenie [9] = (uint8_t) ((((hodnota >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) focus, 12, true); }

Clona:

Fotoaparát očakáva 11 -bitové číslo v rozsahu od nízkej po vysokú hodnotu clony. Odporúčam vložiť filter na hodnotu ADC, inak môže hodnota clony nervózne trhať.

clona uint8_t = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, [8] = LSB, [9] = MS Vyhnite sa clone (uint16_t val) {// prechod z 12bitovej hodnoty ADC na 11bitovú clonovú hodnotu [8] = (uint8_t) (((hodnota >> 1) & 0xFF)); clona [9] = (uint8_t) ((((hodnota >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) clona, 12, true); }

Krok 3: Okruh

Okruh
Okruh

Priložil som PDF svojho obvodu. Priložené sú aj niektoré obrázky DPS.

Doska je napájaná micro USB.

Po prijatí DPS som sa rozhodol, že chcem napájať RGB LED, a tak som zapojil dva WS2812B do série na výstup „Button Led“(to vyžadovalo niekoľko vodičových záplat na DPS). Dosky plošných spojov boli 8USD s OSHPark.com.

Na doske plošných spojov môžete vidieť niekoľko ďalších spojení, ako napríklad „adc“, ktoré nepoužívam a ktoré boli odstránené z priložených schém. V minulosti bolo v pláne použiť externé zaostrovacie koliesko, ale v súčasnosti som s malým kolieskom pre palec úplne spokojný.

Krok 4: Záver

Dúfam, že to pomohlo.

Mám na mysli niekoľko budúcich aktualizácií, napríklad používanie rotačného enkodéra bez pevných zastávok. To bude vyžadovať, aby ovládač získal z fotoaparátu aktuálnu hodnotu zaostrenia alebo clony a odtiaľ pokračoval. Pravdepodobne je preto potrebné aktualizovať funkciu „NotifyCallback“.

DPS potrebuje aktualizáciu, aby správne poskytoval signály pre LED diódy WS2812B RGB.

Strávil som veľa (hlúposť) času pri vytváraní tejto práce, najmä v časti BLE. Ak vám to pomohlo a chcete mi kúpiť nápoj, veľmi si to vážime:) Toto je darovací odkaz na Paypal:

Odporúča: