Obsah:

Magic Button 4k: bezdrátové dálkové ovládání 20USD BMPCC 4k (nebo 6k): 4 kroky (s obrázky)
Magic Button 4k: bezdrátové dálkové ovládání 20USD BMPCC 4k (nebo 6k): 4 kroky (s obrázky)

Video: Magic Button 4k: bezdrátové dálkové ovládání 20USD BMPCC 4k (nebo 6k): 4 kroky (s obrázky)

Video: Magic Button 4k: bezdrátové dálkové ovládání 20USD BMPCC 4k (nebo 6k): 4 kroky (s obrázky)
Video: LG Magic Remote wheel/button - REPAIR 2024, Listopad
Anonim
Image
Image

Mnoho lidí mě požádalo o sdílení některých podrobností o mém bezdrátovém ovladači pro BMPCC4k. Většina otázek se týkala ovládání bluetooth, takže o tom zmíním několik podrobností. Předpokládám, že jste obeznámeni s prostředím ESP32 Arduino.

Tato verze dálkového ovladače může ovládat záznam, zaostření a clonu fotoaparátu prostřednictvím bluetooth. Podívejte se na video. Je docela snadné přidat další ovládací funkce podle příručky pro ovládání bluetooth BMPCC4k. V kameře lze ovládat v podstatě cokoli, pokud jsem viděl.

Byl by snadný krok přidat modul LIDAR pro měření vzdálenosti objektu, takže můžete získat nějaký systém automatického zaostřování … I když je sporné, zda dokážete dostatečně přesně zaostřit na konkrétní oblasti, jako jsou oči atd …

UPDATE 2020: Vytvořil jsem verzi 3.0. Je založen na volně se otáčejícím kolečku pomocí magnetického kodéru. Připojuje se také k mému následnému zaostřovacímu motoru, který se v podstatě stává druhým zařízením bluetooth (ESP32 podporuje více připojení bluetooth). Nové video je toho důkazem.

Pokud byste si chtěli objednat verzi 3, podívejte se prosím na web MagicButton

Zásoby

Jakýkoli modul ESP32 s wifi a bluetooth. Použil jsem TTGO micro32, protože je malý:

Kolečko ostření by stačilo na jakýkoli potenciometr. Použil jsem následující, protože je malý: https://www.aliexpress.com/item/32963061806.html? S … Tento druh má tvrdé zarážky na horní a dolní hranici. V budoucí verzi použiji rotační kodér. Když tak přejdu do režimu, zaostření nebo clona tak „neskočí“na aktuální nastavení kolečka.

Tlačítko Rec/Mode. Použil jsem následující: https://www.aliexpress.com/item/32806223591.html? S…

Další standardní součásti, jako jsou odpory, krytky, … (viz schéma)

Krok 1: Kód

Používám wifi schopnost ESP32 buď k připojení ke známé síti v režimu AP, nebo, když jsem v terénu, stane se stanicí (STA), ke které se mohu připojit. Tímto způsobem mohu konfigurovat modul. Nebudu se rozepisovat o sekci wifi/webové stránky, možná to přidám později.

ESP32 se připojí k fotoaparátu a stane se klientem Bluetooth LE. Kód bluetooth obsažený v rámci ESP32 Arduina nefunguje s BMPCC4k. Wakwak-koba nám to opravil. Děkuji Wakwak-koba! Odtud jsem použil knihovnu BLE:

github.com/wakwak-koba/arduino-esp32

Nicméně tato verze BLE lib je stále ve vývoji a zdá se, že nejnovější verze BLEUUID.cpp v tuto chvíli nefunguje, takže si vezměte dřívější „ověřenou“verzi tohoto souboru.

Pro zbytek je většina mého bluetooth kódu hodně podle příkladů BLE obsažených v rámci Arduino:

Některé BLE UUID a proměnné 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 připojeno = 0; skenování volatilebool = 0; volatileuint32_t pinCode;

Skenování a hlavní smyčka:

třída MyAdvertisedDeviceCallbacks: veřejné BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (advertisingedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisingedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Found our device!"); advertisingedDevice.getScan ()-> stop (); myDevice = new BLEAdvertisedDevice (advertisingedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skenování dokončeno"); skenování = nepravda; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! skenování))) {Serial.println ("skenování …"); skenování = true; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Časovač = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Nyní jsme připojeni k serveru BLE."); připojeno = true; } else {Serial.println („Nepodařilo se nám připojit k serveru; nic dalšího neuděláme.“); } doConnect = false; }}

Připojení k fotoaparátu:

bool connectToServer () {

Serial.print ("Vytváření připojení k"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (nová MySecurity ()); BLESecurity *pSecurity = new 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 (" - Připojeno k serveru"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // ZÍSKEJTE MODEL KAMERY BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Nepodařilo se získat službu info o zařízení"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); přejít na selhání; } Serial.println (" - Čtení informací o zařízení"); // Získejte odkaz na charakteristiku ve službě vzdáleného serveru BLE. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nepodařilo se najít model kamery"); Serial.println (CamModelcharUUID.toString (). C_str ()); přejít na selhání; } // Přečíst hodnotu charakteristiky. std:: hodnota řetězce = pRemoteCamModelCharacteristic-> readValue (); Serial.print („Kamera je“); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera není BMPCC4k"); přejít na selhání; } // ZÍSKEJTE ŘÍZENÍ pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Selhalo získání kamerové služby"); Serial.println (ControlserviceUUID.toString (). C_str ()); přejít na selhání; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Selhalo získání řídicí charakteristiky"); Serial.println (ControlcharUUID.toString (). C_str ()); přejít na selhání; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - přihlášení k odběru oznámení"); const uint8_t indikaceOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (NotifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikaceOn, 2, true); } return true; selhání: pClient-> disconnect (); return false; }

Připojené/odpojené zpětné volání:

třída MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Jsme připojeni."); } void onDisconnect (BLEClient *pclient) {připojeno = false; pclient-> odpojit (); Serial.println („Byli jsme odpojeni.“); }};

Část kódu PIN:

V mé aktuální verzi mohu zadat kód PIN prostřednictvím webového rozhraní, ale toto jsou podrobnosti o wifi/webové stránce, které mohu přidat později.

třída MySecurity: public BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PROSÍM ZADEJTE 6 DIGITÁLNÍ PIN (konec 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, "The passkey Notify number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "The passkey YES/NO number:%d", pass_key); vTaskDelay (5000); návrat; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Security Request"); návrat; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE oznámení:

Kamera upozorní své klienty BLE na jakékoli změny kamery, včetně případů, kdy kamera spustí a zastaví nahrávání. Tento kód přepne moji LED, když spustí/zastaví nahrávání.

static void NotifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE formát zprá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élka == 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: Část 2 kódu

Toto je část, která ve skutečnosti odesílá příkazy do kamery.

Záznam:

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

Se zaměřením:

Fotoaparát očekává 11bitové číslo v rozsahu od blízkého po vzdálené zaostření. Doporučuji umístit filtr na hodnotu ADC, jinak může být zaostření nervózně chvění.

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

Clona:

Fotoaparát očekává 11bitové číslo v rozsahu od nízké po vysokou hodnotu clony. Doporučuji umístit filtr na hodnotu ADC, jinak by hodnota clony mohla nervózně kmitat.

clona uint8_t = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// přechod z 12bitové hodnoty ADC na 11bitovou clonovou hodnotu [8] = (uint8_t) (((val >> 1) & 0xFF)); clona [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) clona, 12, true); }

Krok 3: Okruh

Okruh
Okruh

Připojil jsem PDF mého obvodu. Připojeny jsou také některé obrázky desky plošných spojů.

Deska je napájena micro USB.

Po obdržení DPS jsem se rozhodl, že chci řídit RGB LED, a tak jsem připojil dva WS2812B v sérii na výstup „Button Led“(to vyžadovalo nějaké plošné záplaty na DPS). Desky plošných spojů byly 8USD s OSHPark.com.

Na desce plošných spojů můžete vidět několik dalších připojení, například „adc“, které nepoužívám a které byly odstraněny z připojených schémat. V plánu bylo v minulosti použít externí zaostřovací kolečko, ale v současné době jsem s malým kolečkem palce naprosto spokojený.

Krok 4: Závěr

Doufám, že to pomohlo.

Mám na mysli některé budoucí aktualizace, například použití rotačního kodéru bez pevných zastávek. To bude vyžadovat, aby ovladač získal z fotoaparátu aktuální hodnotu zaostření nebo clony a odtud pokračoval. Pravděpodobně proto bude nutné aktualizovat funkci "NotifyCallback".

Deska plošných spojů potřebuje aktualizaci, aby správně poskytovala signály pro LED diody WS2812B RGB.

Strávil jsem hodně (hodně) času při vytváření této práce, zejména BLE části. Pokud vám to pomohlo a chcete mi koupit drink, toho si velmi vážíme:) Toto je odkaz na darování Paypal:

Doporučuje: