Indholdsfortegnelse:

Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernbetjening: 4 trin (med billeder)
Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernbetjening: 4 trin (med billeder)

Video: Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernbetjening: 4 trin (med billeder)

Video: Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernbetjening: 4 trin (med billeder)
Video: ATEM Mini Tips Marathon — All 16 Tips in One Video! 2024, Juli
Anonim
Image
Image

Mange mennesker har bedt mig om at dele nogle detaljer om min trådløse controller til BMPCC4k. De fleste spørgsmål handlede om bluetooth -kontrollen, så jeg vil nævne et par detaljer om det. Jeg går ud fra, at du kender ESP32 Arduino -miljøet.

Denne version af fjernbetjeningen kan styre kameraets optagelse, fokus og blænde via bluetooth. Tag et kig på videoen. Det er ganske let at tilføje flere kontrolfunktioner i henhold til bluetooth -kontrolmanualen til BMPCC4k. Stort set alt i kameraet kan styres, så vidt jeg har set.

Det ville være et let trin at tilføje et LIDAR -modul til at måle afstanden til et motiv, så du kan få en slags autofokussystem … Selvom det er tvivlsomt, om du kan få et præcist nok fokus på bestemte områder som øjne osv …

OPDATERING 2020: Jeg lavede version 3.0. Det er baseret på et frit roterende hjul ved hjælp af en magnetisk encoder. Det tilsluttes også til min følgfokusmotor, som dybest set bliver en anden bluetooth -enhed (ESP32 understøtter flere bluetooth -forbindelser). Det viser den nye video.

Hvis du vil bestille version 3, kan du kigge på MagicButton -webstedet

Forbrugsvarer

Ethvert ESP32 -modul med wifi og bluetooth. Jeg brugte TTGO micro32, fordi den er lille:

Et fokushjul, ethvert potentiometer ville gøre. Jeg brugte følgende, fordi det er lillebitte: https://www.aliexpress.com/item/32963061806.html? S… Denne slags har hårde stop ved den øvre og nedre grænse. I en fremtidig version vil jeg bruge en roterende encoder. På denne måde "springer" fokus eller blænde ikke til den aktuelle hjulindstilling, når jeg går ind i en tilstand.

En knap til optagelse/tilstand. Jeg brugte følgende: https://www.aliexpress.com/item/32806223591.html? S …

Andre standardkomponenter såsom modstande, hætter, … (se skematisk)

Trin 1: Koden

Jeg bruger ESP32s wifi -kapacitet til enten at oprette forbindelse til et kendt netværk i AP -tilstand, eller når jeg er i marken, bliver det til en station (STA), som jeg kan oprette forbindelse til. På den måde kan jeg konfigurere modulet. Jeg vil ikke gå i detaljer med afsnittet wifi/webside, jeg kan tilføje dette på et senere tidspunkt.

ESP32 opretter forbindelse til kameraet og bliver en Bluetooth LE -klient. Bluetooth -koden, der er inkluderet i Arduinos ESP32 -ramme, fungerer ikke med BMPCC4k. Wakwak-koba har ordnet det for os. Tak Wakwak-koba! Jeg brugte BLE -biblioteket herfra:

github.com/wakwak-koba/arduino-esp32

Ikke desto mindre er denne version af BLE lib stadig under udvikling, og den nyeste version af BLEUUID.cpp ser ikke ud til at fungere i øjeblikket, så tag den tidligere "verificerede" version af denne fil.

For resten er det meste af min bluetooth -kode meget ifølge BLE -eksemplerne, der er inkluderet i Arduino -rammen:

Nogle BLE UUID og variabler definerer:

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

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

Scanningen og hovedsløjfen:

klasse MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE -annonceret enhed fundet:"); Serial.println (advertisedDevice.toString (). C_str ()); hvis (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). er lig med (BlackMagic)) {Serial.print ("Fundet vores enhed!"); advertisedDevice.getScan ()-> stop (); myDevice = ny BLEAdvertisedDevice (advertisedDevice); doConnect = sand; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("scanning udført"); scanning = falsk; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning …"); scanning = sand; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Vi har nu forbindelse til BLE -serveren."); forbundet = sandt; } else {Serial.println ("Vi kunne ikke oprette forbindelse til serveren; der er ikke mere, vi skal gøre."); } doConnect = falsk; }}

Tilslutning til kameraet:

bool connectToServer () {

Serial.print ("Oprettelse af forbindelse til"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDenhed:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (ny MySecurity ()); BLESecurity *pSecurity = ny 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 (ny MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Tilsluttet server"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN CAMERA MODEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); hvis (pRemoteService == nullptr) {Serial.print (" - kunne ikke hente enhedsinfotjeneste"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); gå fejl; } Serial.println (" - Læseenhedsinformation"); // Få en henvisning til karakteristikken i tjenesten på den eksterne BLE -server. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kunne ikke finde kameramodel"); Serial.println (CamModelcharUUID.toString (). C_str ()); gå fejl; } // Læs værdien af karakteristikken. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kameraet er"); Serial.println (værdi.c_str ()); hvis (CamModel! = value.c_str ()) {Serial.print (" - Kameraet er ikke BMPCC4k"); gå fejl; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); hvis (pRemoteService == nullptr) {Serial.print (" - Kunne ikke få kameratjeneste"); Serial.println (ControlserviceUUID.toString (). C_str ()); gå fejl; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); hvis (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); hvis (pControlCharacteristic == nullptr) {Serial.print (" - kunne ikke få kontrolkarakteristik"); Serial.println (ControlcharUUID.toString (). C_str ()); gå fejl; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); hvis (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - abonnerer på underretning"); const uint8_t indicionOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikationOn, 2, true); } returner sandt; fail: pClient-> afbryd (); return falsk; }

Tilsluttet/afbrudt tilbagekald:

klasse MyClientCallback: offentlig BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Vi er forbundet."); } void onDisconnect (BLEClient *pclient) {tilsluttet = falsk; pclient-> afbryd (); Serial.println ("Vi blev afbrudt."); }};

Pin -kode delen:

I min nuværende version kan jeg indtaste pinkoden via webgrænsefladen, men det er wifi/webside detaljer, som jeg muligvis tilføjer senere.

klasse MySecurity: offentlig BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- INDTAST 6 DIGIT PIN-kode (slut med ENTER):"); pinCode = 0; char ch; gør {while (! Serial.available ()) {delay (1); } ch = Serial.read (); hvis (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} mens ((ch! = '\ n')); returner pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Adgangsnøglen, meddelelsesnummer:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Adgangsnøglen YES/NO nummer:%d", pass_key); vTaskDelay (5000); returntrue; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Sikkerhedsanmodning"); tilbagevendende; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE -meddelelse:

Kameraet underretter sine BLE -klienter om eventuelle kameraændringer, herunder når kameraet starter og stopper optagelsen. Denne kode skifter min LED, når den starter/stopper optagelsen.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE meddelelsesformat: // rec on er 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off er 255 9 0 0 10 1 1 2 0 0 64 0 2if (length == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } hvis (pData [8] == 2) {recstatus = 1; }}}

Trin 2: Koden Del 2

Dette er den del, der faktisk sender kommandoerne til kameraet.

Indspilning:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] void Record (boolsk RecOn) {if (! RecOn) record [8] = 0; ellers record [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) record, 16, true); }

Fokusering:

Kameraet forventer et 11 bit -tal, der spænder fra tæt til langt fokus. Jeg råder dig til at sætte et filter på din ADC -værdi, ellers kan fokus blive nervøst nervøs.

uint8_t fokus = {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) {// går fra en 12 bit ADC værdi til 11 bit fokus værdi fokus [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, sand); }

Blænde:

Kameraet forventer et 11 bit -tal, der spænder fra en lav til en høj blændeværdi. Jeg råder dig til at sætte et filter på din ADC -værdi, ellers kan blændeværdien blive nervøst nervøs.

uint8_t blænde = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// går fra en 12bit ADC -værdi til 11bit blændeværdi blænde [8] = (uint8_t) (((val >> 1) & 0xFF)); blænde [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) blænde, 12, sand); }

Trin 3: Kredsløbet

Kredsløbet
Kredsløbet

Jeg har vedhæftet PDF'en af mit kredsløb. Nogle billeder af printkortet er også vedhæftet.

Kortet forsynes med mikro -USB.

Efter at have modtaget printkortet besluttede jeg, at jeg ville køre en RGB LED, så jeg sluttede to WS2812B i serie til "Button Led" -udgangen (der skulle nogle ledningspletter på printkortet). PCB'erne var 8USD med OSHPark.com.

Du kan se nogle flere forbindelser på printkortet, f.eks. "Adc", som jeg ikke bruger, og som blev fjernet fra det vedhæftede skema. Planen var at bruge et eksternt fokushjul tidligere, men jeg er i øjeblikket helt tilfreds med det lille tommelfingerhjul.

Trin 4: Konklusion

Jeg håber, at dette hjalp.

Jeg har nogle fremtidige opdateringer i tankerne, såsom at bruge en roterende encoder uden hårde stop. Dette vil kræve, at controlleren får den aktuelle værdi af fokus eller blænde fra kameraet og fortsætter derfra. Funktionen "notifyCallback" skal sandsynligvis opdateres.

PCB har brug for en opdatering for at levere signaler til WS2812B RGB -lysdioderne korrekt.

Jeg brugte meget (en loooot) tid på at få dette til at fungere, især BLE -delen. Hvis dette hjalp dig, og du vil købe en drink til mig, er det meget værdsat:) Dette er et PayPal -donationslink:

Anbefalede: