Innehållsförteckning:

Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådlös fjärrkontroll: 4 steg (med bilder)
Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådlös fjärrkontroll: 4 steg (med bilder)

Video: Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådlös fjärrkontroll: 4 steg (med bilder)

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

Många har bett mig att dela några detaljer om min trådlösa handkontroll för BMPCC4k. De flesta frågor handlade om bluetooth -kontrollen, så jag nämner några detaljer om det. Jag antar att du är bekant med ESP32 Arduino -miljön.

Denna version av fjärrkontrollen kan styra inspelning, fokus och bländare på kameran via bluetooth. Ta en titt på videon. Det är ganska enkelt att lägga till fler kontrollfunktioner enligt bluetooth -kontrollhandboken för BMPCC4k. I princip kan allt i kameran styras, vad jag har sett.

Det skulle vara ett enkelt steg att lägga till en LIDAR -modul för att mäta avståndet till ett motiv, så att du kan få ett slags autofokussystem … Även om det är tveksamt om du kan få tillräckligt noggrant fokus på specifika områden som ögon osv …

UPPDATERING 2020: Jag gjorde version 3.0. Det är baserat på ett fritt roterande hjul med en magnetisk kodare. Den ansluter också till min följfokusmotor, som i princip blir en andra Bluetooth -enhet (ESP32 stöder flera Bluetooth -anslutningar). Den nya videon visar detta.

Om du vill beställa version 3 kan du titta på MagicButtons webbplats

Tillbehör

Alla ESP32 -moduler med wifi och bluetooth. Jag använde TTGO micro32 eftersom den är liten:

Ett fokushjul, vilken potentiometer som helst skulle göra. Jag använde följande eftersom det är litet: https://www.aliexpress.com/item/32963061806.html? S … Denna typ har hårda stopp vid den övre och nedre gränsen. I en framtida version använder jag en roterande kodare. På så sätt hoppar inte fokus eller bländare till den aktuella hjulinställningen när jag går in i ett läge.

En inspelningsknapp. Jag använde följande: https://www.aliexpress.com/item/32806223591.html? S …

Andra standardkomponenter som motstånd, lock, … (se schemat)

Steg 1: Koden

Jag använder ESP32: s wifi -kapacitet för att antingen ansluta till ett känt nätverk i AP -läge, eller, när jag är i fältet, blir det en station (STA) som jag kan ansluta till. På så sätt kan jag konfigurera modulen. Jag kommer inte att gå in på detaljerna i wifi/webbsidan, jag kan lägga till detta i ett senare skede.

ESP32 ansluter till kameran och blir en Bluetooth LE -klient. Bluetooth -koden som ingår i Arduinos ESP32 -ram fungerar inte med BMPCC4k. Wakwak-koba har fixat det åt oss. Tack Wakwak-koba! Jag använde BLE -biblioteket härifrån:

github.com/wakwak-koba/arduino-esp32

Ändå är den versionen av BLE lib fortfarande under utveckling och den senaste versionen av BLEUUID.cpp verkar inte fungera just nu, så ta den tidigare "verifierade" versionen av filen.

För resten är det mesta av min bluetooth -kod mycket enligt BLE -exemplen som ingår i Arduino -ramverket:

Några BLE UUID och variabler definierar:

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 boolean ansluten = 0; volatilebool -skanning = 0; volatileuint32_t pinCode;

Skanning och huvudslinga:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (annonseradDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Hittade vår enhet!"); advertisedDevice.getScan ()-> stop (); myDevice = new BLEAdvertisedDevice (advertisedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skanning klar"); skanning = falskt; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning …"); skanning = sant; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Vi är nu anslutna till BLE -servern."); ansluten = sann; } else {Serial.println ("Vi misslyckades med att ansluta till servern; det finns inget mer vi kommer att göra."); } doConnect = false; }}

Anslutning till kameran:

bool connectToServer () {

Serial.print ("Skapa en anslutning till"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (new MySecurity ()); BLESecurity *pSecurity = ny BLESecurity (); pSecurity-> setKeySize (); pSecurity-> setAuthenticationMode (ESP_LE_AUTH_REQ_SC_MITM_BOND); pSäkerhet-> setCapability (ESP_IO_CAP_IN); pSecurity-> setRespEncryptionKey (ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); BLEClient *pClient = BLEDevice:: createClient (); pClient-> setClientCallbacks (nya MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Ansluten till server"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN CAMERA MODEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Det gick inte att hämta enhetsinfotjänst"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); gå fel; } Serial.println (" - Läsenhetsinformation"); // Skaffa en referens till egenskapen i tjänsten för den avlägsna BLE -servern. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("Det gick inte att hitta kameramodellen"); Serial.println (CamModelcharUUID.toString (). C_str ()); gå fel; } // Läs värdet på egenskapen. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera är"); Serial.println (värde.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kameran är inte BMPCC4k"); gå fel; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Det gick inte att få kameratjänst"); Serial.println (ControlserviceUUID.toString (). C_str ()); gå fel; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - misslyckades med att få kontrollkarakteristik"); Serial.println (ControlcharUUID.toString (). C_str ()); gå misslyckas; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - prenumerera på avisering"); const uint8_t indicionOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikationOn, 2, true); } återvända sant; misslyckas: pClient-> koppla bort (); return falsk; }

Den anslutna/frånkopplade återuppringningen:

class MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Vi är anslutna."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> koppla bort (); Serial.println ("Vi kopplades bort."); }};

PIN -kodens del:

I min nuvarande version kan jag ange pinkoden via webbgränssnittet men det här är wifi/webbsida som jag kan lägga till senare.

klass MySecurity: public BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- Vänligen ange 6 siffrors PIN-kod (sluta med ENTER):"); pinCode = 0; char ch; gör {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} medan ((ch! = '\ n')); retur pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "The password key Notify number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Lösenordet YES/NO nummer:%d", pass_key); vTaskDelay (5000); återvändande; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Säkerhetsbegäran"); återvändande; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE -meddelande:

Kameran meddelar sina BLE -klienter om eventuella kameraändringar, inklusive när kameran startar och slutar spela in. Denna kod växlar min lysdiod när den startar/stoppar inspelningen.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE meddelandeformat: // rec on är 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off är 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; } if (pData [8] == 2) {recstatus = 1; }}}

Steg 2: Koden Del 2

Detta är den del som faktiskt skickar kommandona till kameran.

Inspelning:

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 (boolean RecOn) {if (! RecOn) record [8] = 0; annars post [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) post, 16, true); }

Fokus:

Kameran förväntar sig ett 11 -bitars tal, allt från nära till långt fokus. Jag rekommenderar att du sätter ett filter på ditt ADC -värde, annars kan fokus bli nervöst skakande.

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) {// går från ett 12 bitars ADC -värde till 11 bitars fokusvärdesfokus [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, true); }

Öppning:

Kameran förväntar sig ett 11 -bitars tal, allt från ett lågt till ett högt bländarvärde. Jag rekommenderar att du sätter ett filter på ditt ADC -värde, annars kan bländarvärdet bli nervöst skakande.

uint8_t bländare = {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 från ett 12 bitars ADC -värde till 11 bitars bländarvärde bländare [8] = (uint8_t) (((val >> 1) & 0xFF)); bländare [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) bländare, 12, true); }

Steg 3: Kretsen

Kretsen
Kretsen

Jag har bifogat PDF: en för min krets. Några bilder på kretskortet bifogas också.

Kortet drivs med mikro -USB.

Efter att ha mottagit kretskortet bestämde jag mig för att jag ville köra en RGB -LED, så jag kopplade två WS2812B i serie till "Button Led" -utgången (som behövde några trådplåster på kretskortet). Kretskortet var 8USD med OSHPark.com.

Du kan se några fler anslutningar på kretskortet, till exempel "adc" som jag inte använder och som togs bort från den bifogade schemat. Planen var att använda ett externt fokushjul tidigare men jag är för närvarande helt nöjd med det lilla tumhjulet.

Steg 4: Slutsats

Jag hoppas att detta hjälpte.

Jag har några framtida uppdateringar i åtanke, till exempel att använda en roterande kodare utan hårda stopp. Detta kräver att regulatorn får det aktuella värdet för fokus eller bländare från kameran och fortsätter därifrån. "NotifyCallback" -funktionen måste förmodligen uppdateras för det.

Kretskortet behöver en uppdatering för att ge signalerna för WS2812B RGB -lysdioderna korrekt.

Jag spenderade mycket (en loooot) tid på att få detta att fungera, särskilt BLE -delen. Om detta hjälpte dig och du vill köpa mig en drink, är det mycket uppskattat:) Detta är en Paypal -donationslänk:

Rekommenderad: