INHOUDSOPGAWE:

Magic Button 4k: die 20USD BMPCC 4k (of 6k) draadlose afstandsbediening: 4 stappe (met foto's)
Magic Button 4k: die 20USD BMPCC 4k (of 6k) draadlose afstandsbediening: 4 stappe (met foto's)

Video: Magic Button 4k: die 20USD BMPCC 4k (of 6k) draadlose afstandsbediening: 4 stappe (met foto's)

Video: Magic Button 4k: die 20USD BMPCC 4k (of 6k) draadlose afstandsbediening: 4 stappe (met foto's)
Video: ATEM Mini Tips Marathon — All 16 Tips in One Video! 2024, November
Anonim
Image
Image

Baie mense het my gevra om 'n paar besonderhede oor my draadlose beheerder vir die BMPCC4k te deel. Die meeste vrae was oor die Bluetooth -beheer, so ek noem 'n paar besonderhede daaroor. Ek neem aan dat u vertroud is met die ESP32 Arduino -omgewing.

Hierdie weergawe van die afstandsbediening kan die opname, fokus en diafragma van die kamera beheer via bluetooth. Kyk na die video. Dit is redelik maklik om meer beheerfunksies by te voeg volgens die Bluetooth -bedieningshandleiding van die BMPCC4k. Basies kan alles in die kamera beheer word, sover ek gesien het.

Dit sou 'n maklike stap wees om 'n LIDAR -module by te voeg om die afstand van 'n onderwerp te meet, sodat u 'n soort outofokusstelsel kan kry … Alhoewel dit twyfelagtig is as u 'n akkurate genoeg fokus op spesifieke gebiede, soos oë, ens.

UPDATE 2020: Ek het weergawe 3.0 gemaak. Dit is gebaseer op 'n vrydraaiende wiel met 'n magnetiese encoder. Dit sluit ook aan by my volgfokusmotor, wat basies 'n tweede Bluetooth -toestel word (die ESP32 ondersteun verskeie Bluetooth -verbindings). Die nuwe video toon dit aan.

As u weergawe 3 wil bestel, kyk gerus op die MagicButton -webwerf

Voorrade

Enige ESP32 -module met wifi en bluetooth. Ek het die TTGO micro32 gebruik omdat dit klein is:

'N Fokuswiel, enige potensiometer kan dit doen. Ek het die volgende gebruik omdat dit klein is: https://www.aliexpress.com/item/32963061806.html? S … Hierdie soort hou moeilik by die boonste en onderste grens. In 'n toekomstige weergawe sal ek 'n roterende encoder gebruik. Op hierdie manier spring die fokus of diafragma nie na die huidige wielinstelling as ek in 'n modus gaan nie.

'N Herhaal/modus knoppie. Ek het die volgende gebruik: https://www.aliexpress.com/item/32806223591.html? S …

Ander standaardkomponente soos weerstande, kappies, … (sien skematiese)

Stap 1: Die kode

Ek gebruik die wifi -vermoë van die ESP32 om in die AP -modus aan te sluit op 'n bekende netwerk, of as ek in die veld is, word dit 'n stasie (STA) waarmee ek kan skakel. Op hierdie manier kan ek die module instel. Ek gaan nie in op die gedeelte van die wifi/webbladsy nie, ek kan dit later byvoeg.

Die ESP32 maak verbinding met die kamera en word 'n Bluetooth LE -kliënt. Die bluetooth -kode wat in die ESP32 -raamwerk van Arduino ingesluit is, werk nie met die BMPCC4k nie. Wakwak-koba het dit vir ons reggemaak. Dankie Wakwak-koba! Ek het die BLE -biblioteek hiervandaan gebruik:

github.com/wakwak-koba/arduino-esp32

Die weergawe van die BLE lib is nog steeds in ontwikkeling en die nuutste weergawe van BLEUUID.cpp werk tans nie, dus neem die vroeëre "geverifieerde" weergawe van hierdie lêer.

Vir die res is die meeste van my bluetooth -kode baie volgens die BLE -voorbeelde wat in die Arduino -raamwerk ingesluit is:

Sommige BLE UUID en veranderlike definieer:

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

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

Die skandering en hooflus:

klas MyAdvertisedDeviceCallbacks: publiek 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 ("Ons toestel gevind!"); advertisedDevice.getScan ()-> stop (); myDevice = nuwe BLEAdvertisedDevice (advertisedDevice); doConnect = waar; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skandering gedoen"); skandering = vals; } leemte -lus (leegte) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning)))) {Serial.println ("scanning …"); skandering = waar; pBLEScan-> begin (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Ons is nou gekoppel aan die BLE -bediener."); verbind = waar; } else {Serial.println ("Ons kon nie aan die bediener koppel nie; daar is niks meer wat ons sal doen nie."); } doConnect = vals; }}

Koppel aan die kamera:

bool connectToServer () {

Serial.print ("Maak 'n verbinding met"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLED -toestel:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLED -toestel:: setSecurityCallbacks (nuwe MySecurity ()); BLESecurity *pSecurity = nuwe 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 = BLEDapparaat:: createClient (); pClient-> setClientCallbacks (nuwe MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - gekoppel aan bediener"); BLED -toestel:: setMTU (BLED -toestel:: getMTU ()); // BETREK KAMERA MODEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print ("Kon nie toesteldata -diens kry nie"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); misluk; } Serial.println (" - inligting oor leestoestelle"); // Verkry 'n verwysing na die kenmerk in diens van die afgeleë BLE -bediener. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("Kon nie kameramodel vind nie"); Serial.println (CamModelcharUUID.toString (). C_str ()); misluk; } // Lees die waarde van die eienskap. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("kamera is"); Serial.println (waarde.c_str ()); as (CamModel! = value.c_str ()) {Serial.print (" - kamera is nie BMPCC4k"); misluk; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print ("Kon nie kameradiens kry nie"); Serial.println (ControlserviceUUID.toString (). C_str ()); misluk; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print ("Kon nie die beheerkenmerk kry nie"); Serial.println (ControlcharUUID.toString (). C_str ()); misluk; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - intekening op kennisgewing"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indicationOn, 2, true); } terugkeer waar; misluk: pClient-> ontkoppel (); terugkeer vals; }

Die terug/teruggekoppelde terugbel:

klas MyClientCallback: openbare BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Ons is verbind."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> ontkoppel (); Serial.println ("Ons is ontkoppel."); }};

Die pincode gedeelte:

In my huidige weergawe kan ek die PIN -kode via die webkoppelvlak invoer, maar dit is wifi/webbladbesonderhede wat ek later kan byvoeg.

klas MySecurity: openbare BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- Voer ASSEBLIEF 6-syfer-PIN in (eindig met ENTER):"); pinCode = 0; char ch; doen {terwyl (! Serial.available ()) {vertraging (1); } ch = Serial.read (); as (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} terwyl ((ch! = '\ n')); terugkeer pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "The password key Notify number:%d", pass_key); } bool opConfirmPIN (uint32_t wagwoordsleutel) {ESP_LOGI (LOG_TAG, "Die wagwoord JA/GEEN nommer:%d", slaagsleutel); vTaskDelay (5000); terugkeer; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Sekuriteitsversoek"); terugkeer; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE kennisgewing:

Die kamera stel sy BLE -kliënte in kennis van enige kameraveranderings, insluitend wanneer die kamera begin en stop met opneem. Hierdie kode skakel my LED aan as dit begin/stop met opnames.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCaracteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE boodskapformaat: // 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; } as (pData [8] == 2) {rekstatus = 1; }}}

Stap 2: Die kode Deel 2

Dit is die deel wat die opdragte eintlik na die kamera stuur.

Opneem:

uint8_t rekord = {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; anders rekord [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) rekord, 16, waar); }

Fokus:

Die kamera verwag 'n nommer van 11 bis, wat wissel van naby tot ver. Ek raai u aan om 'n filter op u ADC -waarde te plaas, anders kan die fokus senuweeagtig wankel.

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) {// van 'n 12bit ADC waarde na 11bit fokus waarde fokus [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, waar); }

Diafragma:

Die kamera verwag 'n nommer van 11 bis, wat wissel van 'n lae tot 'n hoë diafragmawaarde. Ek raai u aan om 'n filter op u ADC -waarde te plaas, anders kan die diafragma senuweeagtig skrik.

uint8_t diafragma = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// gaan van 'n 12bit ADC waarde tot 11bit diafragma opening [8] = (uint8_t) (((val >> 1) & 0xFF)); diafragma [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) diafragma, 12, waar); }

Stap 3: Die stroombaan

Die stroombaan
Die stroombaan

Ek het die PDF van my kring aangeheg. 'N Paar foto's van die PCB is ook aangeheg.

Die kaart word aangedryf met 'n mikro -USB.

Nadat ek die PCB ontvang het, het ek besluit dat ek 'n RGB -LED wil bestuur, en ek het twee WS2812B in serie gekoppel aan die "Button Led" -uitset (wat 'n paar draadkolle op die PCB benodig). Die PCB's was 8USD met OSHPark.com.

U kan nog meer verbindings op die PCB sien, soos 'adc' wat ek nie gebruik nie en wat uit die aangehegte skemas verwyder is. Die plan was om in die verlede 'n eksterne fokuswiel te gebruik, maar ek is tans heeltemal tevrede met die klein duimwiel.

Stap 4: Gevolgtrekking

Ek hoop dit het gehelp.

Ek het 'n paar toekomstige opdaterings in gedagte, soos die gebruik van 'n draaikodeerder sonder harde stop. Dit sal vereis dat die beheerder die huidige waarde van die fokus of diafragma van die kamera kry, en van daar af voortgaan. Die funksie "notifyCallback" moet waarskynlik hiervoor opgedateer word.

Die PCB benodig 'n opdatering om die seine vir die WS2812B RGB LED's behoorlik te verskaf.

Ek het baie tyd daaraan bestee, veral die BLE -deel. As dit u gehelp het en u vir my 'n drankie wou koop, word dit baie waardeer:) Dit is 'n skenkingskakel van Paypal:

Aanbeveel: