Tartalomjegyzék:

Magic Button 4k: a 20USD BMPCC 4k (vagy 6k) vezeték nélküli távirányító: 4 lépés (képekkel)
Magic Button 4k: a 20USD BMPCC 4k (vagy 6k) vezeték nélküli távirányító: 4 lépés (képekkel)

Videó: Magic Button 4k: a 20USD BMPCC 4k (vagy 6k) vezeték nélküli távirányító: 4 lépés (képekkel)

Videó: Magic Button 4k: a 20USD BMPCC 4k (vagy 6k) vezeték nélküli távirányító: 4 lépés (képekkel)
Videó: Do This To Learn Handheld Video (Filmmaking or Vlog) 2024, November
Anonim
Image
Image

Sokan kérték, hogy osszak meg néhány részletet a BMPCC4k vezeték nélküli vezérlőjéről. A legtöbb kérdés a bluetooth vezérlésre vonatkozott, ezért megemlítek néhány részletet ezzel kapcsolatban. Feltételezem, hogy ismeri az ESP32 Arduino környezetet.

A távirányító ezen verziója Bluetooth -on keresztül vezérelheti a fényképezőgép felvételét, fókuszát és rekeszét. Nézd meg a videót. A BMPCC4k bluetooth vezérlő kézikönyve szerint nagyon könnyű több vezérlőfunkciót hozzáadni. A kamerában alapvetően bármit lehet vezérelni, amennyire én láttam.

Könnyű lépés lenne egy LIDAR modul hozzáadása a téma távolságának méréséhez, így valamilyen autofókusz rendszert kaphat … Bár kérdéses, hogy képes -e elég pontosan fókuszálni bizonyos területekre, például a szemekre stb.

FRISSÍTÉS 2020: Megcsináltam a 3.0 -s verziót. Ez egy szabadon forgó kerékre épül, mágneses kódoló segítségével. Csatlakozik a követési fókuszmotoromhoz is, amely alapvetően egy második Bluetooth -eszközzé válik (az ESP32 több Bluetooth -kapcsolatot támogat). Az új videó ezt bizonyítja.

Ha szeretné megrendelni a 3 -as verziót, nézze meg a MagicButton weboldalát

Kellékek

Bármilyen ESP32 modul wifivel és bluetooth -al. A TTGO micro32-t használtam, mert apró:

Egy fókuszkerék, bármilyen potenciométer megteszi. Az alábbiakat használtam, mert kicsi: https://www.aliexpress.com/item/32963061806.html? S… Ez a fajta keményen megáll a felső és az alsó határnál. Egy későbbi verzióban forgó kódolót fogok használni. Így a fókusz vagy a rekesz nem "ugrik" az aktuális kerékbeállításra, amikor módba lépek.

Rec/mód gomb. A következőt használtam: https://www.aliexpress.com/item/32806223591.html? S…

Egyéb szabványos alkatrészek, például ellenállások, kupakok,… (lásd az ábrát)

1. lépés: A kód

Az ESP32 wifi -képességét használva csatlakozom egy ismert hálózathoz AP módban, vagy ha a terepen vagyok, akkor ez lesz az állomás (STA), amelyhez csatlakozhatok. Így konfigurálhatom a modult. Nem részletezem a wifi/weboldal részt, lehet, hogy ezt később hozzáadom.

Az ESP32 csatlakozik a fényképezőgéphez, és Bluetooth LE ügyfélgé válik. Az Arduino ESP32 keretrendszerébe tartozó bluetooth kód nem működik a BMPCC4k -vel. A Wakwak-koba javította nekünk. Köszönöm Wakwak-koba! Innen használtam a BLE könyvtárat:

github.com/wakwak-koba/arduino-esp32

Ennek ellenére a BLE lib verziója még fejlesztés alatt áll, és úgy tűnik, hogy a BLEUUID.cpp legújabb verziója jelenleg nem működik, ezért vegye a fájl korábbi "ellenőrzött" verzióját.

A többiben a legtöbb Bluetooth -kódom sok az Arduino keretrendszerben szereplő BLE példák szerint:

Néhány BLE UUID és változó meghatározza:

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

statikus BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statikus BLEUUID DevInfoServiceControlUUID ("180A"); statikus BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statikus BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statikus BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statikus BLEUUID CamModelcharUUID ("2A24"); statikus BLEScan *pBLEScan = BLEDevice:: getScan (); statikus BLEAddress *pServerAddress; statikus BLEAdvertisedDevice* myDevice; statikus BLERemoteCharacteristic *pControlCharacteristic; statikus BLERemoteCharacteristic *pNotifCharacteristic; statikus logikai doConnect = 0; statikus logikai összefüggés = 0; volatilebool szkennelés = 0; volatileuint32_t pinCode;

A szkennelés és a fő hurok:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (hirdetettDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). egyenlő (BlackMagic)) {Serial.print ("Megtaláltuk eszközünket!"); AdvertisedDevice.getScan ()-> stop (); myDevice = új BLEAdvertisedDevice (hirdetett eszköz); doConnect = igaz; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("szkennelés kész"); szkennelés = hamis; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! szkennelés))) {Serial.println ("szkennelés…"); szkennelés = igaz; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Időzítő = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Most csatlakoztunk a BLE szerverhez."); csatlakoztatva = igaz; } else {Serial.println ("Nem sikerült csatlakozni a szerverhez; nincs más dolgunk."); } doConnect = hamis; }}

Csatlakozás a kamerához:

bool connectToServer () {

Serial.print ("Kapcsolat létrehozása"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (új MySecurity ()); BLESecurity *pSecurity = új 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 (új MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Csatlakoztatva a szerverhez"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // KAMERAModell beszerzése BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Nem sikerült lekérni az eszközinformációs szolgáltatást"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); goto fail; } Serial.println (" - Eszközadatok olvasása"); // Hivatkozás beszerzése a karakterisztikára a távoli BLE szerver szolgáltatásában. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nem sikerült megtalálni a kamera modelljét"); Serial.println (CamModelcharUUID.toString (). C_str ()); goto fail; } // Olvassa el a jellemző értékét. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("A kamera"); Soros.println (érték.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - A kamera nem BMPCC4k"); goto fail; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Nem sikerült lekérni a kameraszolgáltatást"); Serial.println (ControlserviceUUID.toString (). C_str ()); goto fail; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (SajátNév.c_str (), SajátNév.hossz ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nem sikerült lekérni az ellenőrzési jellemzőt"); Serial.println (ControlcharUUID.toString (). C_str ()); goto fail; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - feliratkozás az értesítésre"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (alertCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) jelzésOn, 2, true); } return true; sikertelen: pClient- >connect (); hamis visszatérés; }

A csatlakoztatott/leválasztott visszahívás:

class MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Kapcsolatban vagyunk."); } void onDisconnect (BLEClient *pclient) {csatlakoztatva = hamis; pclient-> szétkapcsolás (); Serial.println ("Megszakadt a kapcsolatunk."); }};

A PIN kód része:

A jelenlegi verziómban megadhatom a PIN -kódot a webes felületen keresztül, de ezek a wifi/weboldal részletei, amelyeket később hozzáadhatok.

osztály MySecurity: nyilvános BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (end ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Sorozat.olvasás (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Soros.nyomat (ch); }} while ((ch! = '\ n')); return pinCode; } void 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, "A jelszó YES/NO szám:%d", pass_key); vTaskDelay (5000); visszatérő; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Biztonsági kérés"); visszatérő; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE értesítés:

A kamera értesíti BLE ügyfeleit minden kameraváltozásról, beleértve azt is, amikor a kamera elindítja és leállítja a felvételt. Ez a kód kapcsolja a LED -et, amikor elindítja/leállítja a felvételt.

static void alertCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE üzenetformátum: // 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 (hossz == 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; }}}

2. lépés: A kód 2. része

Ez az a rész, amely ténylegesen elküldi a parancsokat a kamerának.

Felvétel:

uint8_t rekord = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = KI, 2 = BE, [8] void Record (boolean RecOn) {if (! RecOn) rekord [8] = 0; else rekord [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) rekord, 16, igaz); }

Összpontosítás:

A kamera 11 bites számot vár, közelről távoli fókuszra. Azt tanácsolom, hogy tegyen szűrőt az ADC értékére, különben a fókusz idegesen izgulhat.

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) {// 12 bites ADC értékről 11 bites fókuszértékre állítva [8] = (uint8_t) (((val> > 1) & 0xFF)); fókusz [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fókusz, 12, igaz); }

Nyílás:

A kamera 11 bites számot vár, az alacsony és a nagy rekeszérték között. Azt tanácsolom, hogy tegyen szűrőt az ADC értékére, különben a rekesznyílás idegesen remeghet.

uint8_t rekesz = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid rekesz (uint16_t val) {// 12 bites ADC értékről 11 bites rekesznyílás értékre megy át [8] = (uint8_t) ((((val >> 1) & 0xFF)); rekesz [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) rekesz, 12, igaz); }

3. lépés: Az áramkör

Az áramkör
Az áramkör

Csatoltam az áramköröm PDF -jét. Néhány képet a NYÁK -ról is mellékelünk.

A tábla micro USB -ről működik.

Miután megkaptam a nyomtatott áramköri lapot, úgy döntöttem, hogy RGB LED -et szeretnék vezetni, ezért két WS2812B -t sorba kötöttem a "Button Led" kimenettel (ehhez szükség volt néhány huzalfoltra a PCB -n). A NYÁK 8 USD volt az OSHPark.com webhelyen.

Láthat még néhány csatlakozást a NYÁK -on, például az "adc" -t, amelyet nem használok, és amelyet eltávolítottak a mellékelt rajzokból. A terv az volt, hogy korábban egy külső fókuszkereket használtam, de jelenleg tökéletesen elégedett vagyok a kis hüvelykujjával.

4. lépés: Következtetés

Remélem ez segített.

Gondolkoztam néhány jövőbeli frissítésen, például egy forgó kódoló használata ellenállás nélkül. Ehhez a vezérlőnek meg kell kapnia a fókusz vagy a rekesznyílás aktuális értékét a fényképezőgépről, és onnan kell folytatnia. Valószínűleg frissíteni kell az "értesítési visszahívás" funkciót.

A NYÁK -nak frissítésre van szüksége ahhoz, hogy megfelelően jelezze a WS2812B RGB LED -eket.

Nagyon sok időt töltöttem ezzel a munkával, különösen a BLE részével. Ha ez segített rajtad, és vásárolni akarsz nekem egy italt, akkor nagyon örülök:) Ez egy Paypal adományozási link:

Ajánlott: