Sisällysluettelo:

Magic Button 4k: 20USD BMPCC 4k (tai 6k) langaton kaukosäädin: 4 vaihetta (kuvien kanssa)
Magic Button 4k: 20USD BMPCC 4k (tai 6k) langaton kaukosäädin: 4 vaihetta (kuvien kanssa)

Video: Magic Button 4k: 20USD BMPCC 4k (tai 6k) langaton kaukosäädin: 4 vaihetta (kuvien kanssa)

Video: Magic Button 4k: 20USD BMPCC 4k (tai 6k) langaton kaukosäädin: 4 vaihetta (kuvien kanssa)
Video: MagicButton4k: super handy bmpcc4k bluetooth remote 2024, Heinäkuu
Anonim
Image
Image

Monet ihmiset ovat pyytäneet minua kertomaan joitain tietoja langattomasta ohjaimestani BMPCC4k: lle. Useimmat kysymykset koskivat bluetooth -ohjausta, joten mainitsen muutamia yksityiskohtia siitä. Oletan, että olet perehtynyt ESP32 Arduino -ympäristöön.

Tämä kaukosäätimen versio voi ohjata kameran tallennusta, tarkennusta ja aukkoa bluetoothin kautta. Katso video. On melko helppoa lisätä lisää toimintoja BMPCC4k: n Bluetooth -käyttöoppaan mukaan. Pohjimmiltaan mitä tahansa kamerassa voidaan ohjata, niin paljon kuin olen nähnyt.

Olisi helppo lisätä LIDAR -moduuli kohteen etäisyyden mittaamiseksi, jotta voit saada jonkinlaisen automaattitarkennusjärjestelmän … Vaikka on kyseenalaista, voitko saada riittävän tarkan tarkennuksen tiettyihin alueisiin, kuten silmiin jne.

PÄIVITYS 2020: Tein version 3.0. Se perustuu vapaasti pyörivään pyörään, joka käyttää magneettikooderia. Se kytkeytyy myös seurantatarkennusmoottoriini, josta tulee pohjimmiltaan toinen Bluetooth -laite (ESP32 tukee useita Bluetooth -yhteyksiä). Uusi video osoittaa tämän.

Jos haluat tilata version 3, tutustu MagicButtonin verkkosivustoon

Tarvikkeet

Mikä tahansa ESP32 -moduuli, jossa on wifi ja bluetooth. Käytin TTGO micro32: ta, koska se on pieni:

Tarkennuspyörä, mikä tahansa potentiometri tekisi. Käytin seuraavaa, koska se on pieni: https://www.aliexpress.com/item/32963061806.html? S… Tämän tyyppisellä on vaikeita pysäytyksiä ylä- ja alarajalla. Tulevassa versiossa käytän pyörivää anturia. Näin tarkennus tai aukko ei "hyppää" nykyiseen pyörä -asetukseen, kun siirrän tilaan.

Rec/mode -painike. Käytin seuraavaa: https://www.aliexpress.com/item/32806223591.html? S…

Muut vakiokomponentit, kuten vastukset, korkit,… (katso kaavio)

Vaihe 1: Koodi

Käytän ESP32: n wifi -ominaisuutta joko muodostaaksesi yhteyden tunnettuun verkkoon AP -tilassa, tai kun olen kentällä, siitä tulee asema (STA), johon voin muodostaa yhteyden. Näin voin määrittää moduulin. En mene wifi/verkkosivu -osion yksityiskohtiin, saatan lisätä tämän myöhemmin.

ESP32 muodostaa yhteyden kameraan ja siitä tulee Bluetooth LE -asiakas. Arduinon ESP32 -kehykseen sisältyvä Bluetooth -koodi ei toimi BMPCC4k: n kanssa. Wakwak-koba on korjannut sen meille. Kiitos Wakwak-koba! Käytin BLE -kirjastoa täältä:

github.com/wakwak-koba/arduino-esp32

Tästä huolimatta kyseinen BLE lib -versio on vielä kehitteillä, eikä BLEUUID.cpp: n uusin versio näytä toimivan tällä hetkellä, joten ota tämän tiedoston aikaisempi "vahvistettu" versio.

Muuten suurin osa Bluetooth -koodistani on paljon Arduino -kehykseen sisältyvien BLE -esimerkkien mukaan:

Jotkut BLE UUID ja muuttuja määrittelevät:

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

staattinen BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); staattinen BLEUUID DevInfoServiceControlUUID ("180A"); staattinen BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); staattinen BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); staattinen BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); staattinen BLEUUID CamModelcharUUID ("2A24"); staattinen BLEScan *pBLEScan = BLEDevice:: getScan (); staattinen BLE -osoite *pServerAddress; staattinen BLEAdvertisedDevice* myDevice; staattinen BLERemoteCharacteristic *pControlCharacteristic; staattinen BLERemoteCharacteristic *pNotifCharacteristic; staattinen boolen doConnect = 0; staattinen boolean kytketty = 0; haihtuvien aineiden skannaus = 0; volatileuint32_t pinCode;

Skannaus ja pääsilmukka:

luokka MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (AdvertisedDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). yhtä kuin (BlackMagic)) {Serial.print ("Löysimme laitteemme!"); AdvertisedDevice.getScan ()-> stop (); myDevice = uusi BLEAdvertisedDevice (AdvertisedDevice); doConnect = tosi; }}}; staattinen void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skannaus tehty"); skannaus = epätosi; } void loop (void) {if (! connected && ((uint32_t) (millis () - Ajastin)> BLE_RESCAN_TIME || (! skannaus))) {Serial.println ("skannaus…"); skannaus = totta; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Ajastin = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Olemme nyt yhteydessä BLE -palvelimeen."); kytketty = totta; } else {Serial.println ("Yhteyden muodostaminen palvelimeen epäonnistui; emme tee enää mitään."); } doConnect = epätosi; }}

Liittäminen kameraan:

bool connectToServer () {

Serial.print ("Yhteyden muodostaminen kohteeseen"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (uusi MySecurity ()); BLESecurity *pSecurity = uusi 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 (uusi MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Yhdistetty palvelimeen"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // HANKI KAMERAMALLI BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Laitetietopalvelun saaminen epäonnistui"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); epäonnistua; } Serial.println (" - Laitetietojen lukeminen"); // Hae viittaus ominaisuuteen BLE -etäpalvelimen palvelusta. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kameramallin löytäminen epäonnistui"); Serial.println (CamModelcharUUID.toString (). C_str ()); epäonnistua; } // Lue ominaisuuden arvo. std:: merkkijonoarvo = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera on"); Sarja.println (arvo.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera ei ole BMPCC4k"); epäonnistua; } // OTA HALLINTA pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Kamerapalvelun saaminen epäonnistui"); Serial.println (ControlserviceUUID.toString (). C_str ()); epäonnistua; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (OmaNimi.c_str (), OmaNimi.pituus ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Ohjausominaisuuden saaminen epäonnistui"); Serial.println (ControlcharUUID.toString (). C_str ()); epäonnistua; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - ilmoituksen tilaaminen"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikaatioOn, 2, true); } return true; epäonnistua: pClient-> katkaise yhteys (); palauta epätosi; }

Yhdistetty/katkaistu soittopyyntö:

luokka MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Olemme yhteydessä."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> irrota (); Serial.println ("Yhteys katkesi."); }};

PIN -koodin osa:

Nykyisessä versiossa voin syöttää PIN -koodin verkkokäyttöliittymän kautta, mutta nämä ovat wifi/verkkosivun tiedot, jotka voin lisätä myöhemmin.

luokka MySecurity: julkinen BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (end with ENTER):"); pinCode = 0; char ch; tee {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Sarjanjälki (ch); }} while ((ch! = '\ n')); palauta pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Salasanan ilmoitusnumero:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Salasana KYLLÄ/EI numero:%d", pass_key); vTaskDelay (5000); paluu; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Suojauspyyntö"); paluu; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Sarja.println (auth_cmpl.success); }};

BLE -ilmoitus:

Kamera ilmoittaa BLE -asiakkailleen kaikista kameran muutoksista, myös silloin, kun kamera aloittaa ja lopettaa tallennuksen. Tämä koodi vaihtaa LED -valoni, kun se aloittaa/lopettaa tallennuksen.

staattinen mitätön ilmoitusCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE -viestimuoto: // 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 0 0 64 0 2if (pituus == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } jos (pData [8] == 2) {recstatus = 1; }}}

Vaihe 2: Koodi Osa 2

Tämä on osa, joka todella lähettää komennot kameraan.

Äänite:

uint8_t -tietue = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = POIS, 2 = PÄÄLLÄ, [8] mitätön tietue (boolean RecOn) {if (! RecOn) -tietue [8] = 0; muu ennätys [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) -tietue, 16, tosi); }

Tarkennus:

Kamera odottaa 11 -bittistä numeroa, joka vaihtelee läheltä pitkälle. Suosittelen laittamaan suodattimen ADC -arvoosi, muuten tarkennus saattaa hermostuttaa.

uint8_t focus = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, 11 -bittinen, [8] = LSB, [9] = MSBvoid -tarkennus (uint16_t val) {// siirtyminen 12 -bittisestä ADC -arvosta 11 -bittiseen tarkennusarvoon [8] = (uint8_t) (((val> > 1) & 0xFF)); tarkennus [9] = (uint8_t) (((arvo >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) tarkennus, 12, tosi); }

Aukko:

Kamera odottaa 11 -bittistä numeroa, joka vaihtelee alhaisesta suureen aukon arvoon. Suosittelen laittamaan suodattimen ADC -arvoosi, muuten aukon arvo saattaa hermostuttaa.

uint8_t -aukko = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid -aukko (uint16_t val) {// siirtyy 12 -bittisestä ADC -arvosta 11 -bittiseen aukkoarvoon [8] = (uint8_t) ((((val >> 1)) & 0xFF)); aukko [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) aukko, 12, tosi); }

Vaihe 3: Piiri

Piiri
Piiri

Olen liittänyt piirini PDF -tiedoston. Liitteenä on myös joitain kuvia piirilevystä.

Kortti saa virtansa micro USB: llä.

PCB: n vastaanottamisen jälkeen päätin, että haluan ajaa RGB -LED -valoa, joten liitin kaksi WS2812B -laitetta sarjaan "Button Led" -lähtöön (joka vaati johdotuspiirilevyjä PCB: ssä). Piirilevyt olivat 8USD ja OSHPark.com.

Piirilevyssä näkyy joitakin muita yhteyksiä, kuten "adc", joita en käytä ja jotka on poistettu liitteenä olevista kaavioista. Suunnitelma oli käyttää ulkoista tarkennuspyörää aiemmin, mutta olen tällä hetkellä täysin tyytyväinen pieneen peukalopyörään.

Vaihe 4: Johtopäätös

Toivottavasti tämä auttoi.

Minulla on mielessä joitain tulevia päivityksiä, kuten pyörivän kooderin käyttäminen ilman keskeytyksiä. Tämä edellyttää, että ohjain saa tarkennuksen tai aukon nykyisen arvon kamerasta ja jatkaa siitä. "IlmoitaCallback" -toiminto on päivitettävä tätä varten todennäköisesti.

Piirilevy tarvitsee päivityksen, jotta WS2812B RGB -LEDien signaalit toimisivat oikein.

Vietin paljon (loooot) aikaa tämän työn tekemiseen, erityisesti BLE -osaan. Jos tämä auttoi sinua ja haluat ostaa minulle drinkin, sitä arvostetaan suuresti:) Tämä on Paypal -lahjoituslinkki:

Suositeltava: