Innholdsfortegnelse:

Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernkontroll: 4 trinn (med bilder)
Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernkontroll: 4 trinn (med bilder)

Video: Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådløs fjernkontroll: 4 trinn (med bilder)

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

Mange har bedt meg om å dele noen detaljer om min trådløse kontroller for BMPCC4k. De fleste spørsmål handlet om Bluetooth -kontrollen, så jeg nevner noen detaljer om det. Jeg antar at du er kjent med ESP32 Arduino -miljøet.

Denne versjonen av fjernkontrollen kan kontrollere opptak, fokus og blenderåpning av kameraet via bluetooth. Ta en titt på videoen. Det er ganske enkelt å legge til flere kontrollfunksjoner i henhold til Bluetooth -kontrollmanualen til BMPCC4k. I utgangspunktet kan alt i kameraet kontrolleres, så langt jeg har sett.

Det ville være et enkelt trinn å legge til en LIDAR -modul for å måle avstanden til et motiv, slik at du kan få et slags autofokussystem … Selv om det er tvilsomt om du kan få et nøyaktig nok fokus på bestemte områder som øyne osv …

OPPDATERING 2020: Jeg laget versjon 3.0. Det er basert på et fritt roterende hjul ved hjelp av en magnetisk koder. Den kobles også til min følgfokusmotor, som i utgangspunktet blir en andre Bluetooth -enhet (ESP32 støtter flere Bluetooth -tilkoblinger). Den nye videoen demonstrerer dette.

Hvis du vil bestille versjon 3, kan du se på MagicButton -nettstedet

Rekvisita

Enhver ESP32 -modul med wifi og bluetooth. Jeg brukte TTGO micro32 fordi den er liten:

Et fokushjul, et hvilket som helst potensiometer ville gjøre. Jeg brukte følgende fordi det er lite: https://www.aliexpress.com/item/32963061806.html? S… Denne typen har harde stopp ved øvre og nedre grense. I en fremtidig versjon vil jeg bruke en roterende encoder. På denne måten "hopper" ikke fokus eller blenderåpning til gjeldende hjulinnstilling når jeg går inn i en modus.

En opptak/modus -knapp. Jeg brukte følgende: https://www.aliexpress.com/item/32806223591.html? S …

Andre standardkomponenter som motstander, hetter, … (se skjematisk)

Trinn 1: Koden

Jeg bruker wifi -funksjonen til ESP32 til å enten koble til et kjent nettverk i AP -modus, eller når jeg er i feltet, blir det en stasjon (STA) som jeg kan koble til. På den måten kan jeg konfigurere modulen. Jeg vil ikke gå inn på detaljene i wifi/websiden, jeg kan legge til dette på et senere tidspunkt.

ESP32 kobles til kameraet og blir en Bluetooth LE -klient. Bluetooth -koden som er inkludert i Arduinos ESP32 -rammeverk, fungerer ikke med BMPCC4k. Wakwak-koba har fikset det for oss. Takk Wakwak-koba! Jeg brukte BLE -biblioteket herfra:

github.com/wakwak-koba/arduino-esp32

Den versjonen av BLE lib er imidlertid fortsatt under utvikling, og den siste versjonen av BLEUUID.cpp ser ikke ut til å fungere for øyeblikket, så ta den tidligere "verifiserte" versjonen av denne filen.

For resten er det meste av min bluetooth -kode mye i henhold til BLE -eksemplene som er inkludert i Arduino -rammeverket:

Noen 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 tilkoblet = 0; volatilebool skanning = 0; volatileuint32_t pinCode;

Skanningen og hovedsløyfen:

klasse MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (advertisedDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Fant enheten vår!"); advertisedDevice.getScan ()-> stop (); myDevice = ny BLEAdvertisedDevice (advertisedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skanning utført"); skanning = usant; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning)))) {Serial.println ("skanning …")); skanning = sant; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Vi er nå koblet til BLE -serveren."); tilkoblet = sant; } else {Serial.println ("Vi klarte ikke å koble til serveren. Det er ingenting mer vi skal gjøre."); } doConnect = false; }}

Koble til kameraet:

bool connectToServer () {

Serial.print ("Opprette forbindelse til"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDenhet:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (new MySecurity ()); BLESikkerhet *pSecurity = ny BLESikkerhet (); 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 (" - Koblet til server"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN CAMERA MODEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Kunne ikke hente enhetsinfotjeneste"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); mislykkes; } Serial.println (" - Lese enhetsinformasjon"); // Få en referanse til egenskapen i tjenesten til den eksterne BLE -serveren. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kunne ikke finne kameramodell"); Serial.println (CamModelcharUUID.toString (). C_str ()); mislykkes; } // Les verdien av karakteristikken. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera er"); Serial.println (verdi.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kameraet er ikke BMPCC4k"); mislykkes; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Kunne ikke få kameratjeneste"); Serial.println (ControlserviceUUID.toString (). C_str ()); mislykkes; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Kunne ikke få kontrollkarakteristikk"); Serial.println (ControlcharUUID.toString (). C_str ()); mislykkes; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - abonnement på melding"); const uint8_t indiciOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikasjonOn, 2, true); } returner sant; mislykkes: pClient-> koble fra (); return falsk; }

Tilkoblet/frakoblet tilbakeringing:

klasse MyClientCallback: offentlig BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Vi er tilkoblet."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> koble fra (); Serial.println ("Vi ble koblet fra."); }};

PIN -koden delen:

I min nåværende versjon kan jeg skrive inn PIN -koden via webgrensesnittet, men dette er wifi/webside detaljer som jeg kan legge til senere.

klasse MySecurity: offentlig BLESikkerhetCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- VENNLIGGJØR 6-sifers PIN-kode (avslutt med ENTER):"); pinCode = 0; char ch; gjø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')); retur 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, "The keykey YES/NO number:%d", pass_key); vTaskDelay (5000); returntrue; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Sikkerhetsforespørsel"); returntrue; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE -varsling:

Kameraet varsler sine BLE -klienter om eventuelle kameraendringer, inkludert når kameraet starter og stopper opptaket. Denne koden bytter lysdioden min når den starter/stopper opptaket.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE melding format: // 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 (length == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { rekstatus = 0; } hvis (pData [8] == 2) {recstatus = 1; }}}

Trinn 2: Koden Del 2

Dette er delen som faktisk sender kommandoene til kameraet.

Innspilling:

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 post [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) post, 16, true); }

Fokuserer:

Kameraet forventer et 11 -biters tall, fra nær til langt fokus. Jeg anbefaler å sette et filter på ADC -verdien din, ellers kan fokuset bli nervøst nervøst.

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 12bit ADC -verdi til 11bit fokusverdi fokus [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, true); }

Blenderåpning:

Kameraet forventer et 11 -biters tall, alt fra lav til høy blenderåpning. Jeg anbefaler å sette et filter på ADC -verdien din, ellers kan blenderverdien bli nervøs.

uint8_t blenderåpning = {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 -verdi til 11bit blenderverdi blender [8] = (uint8_t) (((val >> 1) & 0xFF)); blender [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) blenderåpning, 12, true); }

Trinn 3: Kretsen

Kretsen
Kretsen

Jeg har lagt ved PDF -en til kretsen min. Noen bilder av kretskortet er også vedlagt.

Brettet drives av mikro -USB.

Etter å ha mottatt PCB bestemte jeg meg for at jeg ville kjøre en RGB LED, så jeg koblet to WS2812B i serie til "Button Led" -utgangen (som trengte noen ledningsoppdateringer på PCB). PCB -ene var 8USD med OSHPark.com.

Du kan se noen flere tilkoblinger på kretskortet, for eksempel "adc" som jeg ikke bruker og som ble fjernet fra de vedlagte skjemaene. Planen var å bruke et eksternt fokushjul tidligere, men jeg er for tiden helt fornøyd med det lille tommelhjulet.

Trinn 4: Konklusjon

Jeg håper dette hjalp.

Jeg har noen fremtidige oppdateringer i tankene, for eksempel å bruke en roterende encoder uten harde stopp. Dette vil kreve at kontrolleren får den nåværende verdien av fokus eller blenderåpning fra kameraet, og fortsetter derfra. Funksjonen "notifyCallback" må sannsynligvis oppdateres for det.

Kretskortet trenger en oppdatering for å gi signalene for WS2812B RGB -lysdiodene riktig.

Jeg brukte mye tid på å få dette til å fungere, spesielt BLE -delen. Hvis dette hjalp deg og du vil kjøpe meg en drink, er det veldig verdsatt:) Dette er en lenke til donasjon fra Paypal:

Anbefalt: