Satura rādītājs:

Burvju poga 4k: 20 ASV dolāru BMPCC 4k (vai 6 k) bezvadu tālvadības pults: 4 soļi (ar attēliem)
Burvju poga 4k: 20 ASV dolāru BMPCC 4k (vai 6 k) bezvadu tālvadības pults: 4 soļi (ar attēliem)

Video: Burvju poga 4k: 20 ASV dolāru BMPCC 4k (vai 6 k) bezvadu tālvadības pults: 4 soļi (ar attēliem)

Video: Burvju poga 4k: 20 ASV dolāru BMPCC 4k (vai 6 k) bezvadu tālvadības pults: 4 soļi (ar attēliem)
Video: A 20 Year Old Mystery...Inside the Lonely War Veteran's Abandoned House! 2024, Novembris
Anonim
Image
Image

Daudzi cilvēki ir lūguši man dalīties ar informāciju par manu BMPCC4k bezvadu kontrolieri. Lielākā daļa jautājumu bija par Bluetooth vadību, tāpēc es minēšu dažas detaļas par to. Es pieņemu, ka esat pazīstams ar ESP32 Arduino vidi.

Šī tālvadības pults versija var kontrolēt kameras ierakstīšanu, fokusu un diafragmu, izmantojot Bluetooth. Ieskatieties video. Ir diezgan viegli pievienot vairāk vadības funkciju saskaņā ar BMPCC4k Bluetooth vadības rokasgrāmatu. Būtībā jebko kamerā var kontrolēt, cik esmu redzējis.

Tas būtu vienkāršs solis, lai pievienotu LIDAR moduli, lai izmērītu objekta attālumu, lai jūs varētu iegūt sava veida autofokusa sistēmu … Lai gan ir apšaubāmi, vai varat pietiekami precīzi fokusēties uz noteiktām zonām, piemēram, acīm utt.

UPDATE 2020: Es izveidoju versiju 3.0. Tas ir balstīts uz brīvi rotējošu riteni, izmantojot magnētisko kodētāju. Tas arī savienojas ar manu sekošanas fokusa motoru, kas būtībā kļūst par otro Bluetooth ierīci (ESP32 atbalsta vairākus Bluetooth savienojumus). Jaunais video to pierāda.

Ja vēlaties pasūtīt 3. versiju, lūdzu, ieskatieties vietnē MagicButton

Piegādes

Jebkurš ESP32 modulis ar wifi un Bluetooth. Es izmantoju TTGO micro32, jo tas ir niecīgs:

Fokusa ritenis, jebkurš potenciometrs derētu. Es izmantoju sekojošo, jo tas ir niecīgs: https://www.aliexpress.com/item/32963061806.html? S… Šim veidam ir grūti apstāties pie augšējās un apakšējās robežas. Nākamajā versijā es izmantošu rotējošu kodētāju. Tādā veidā fokuss vai diafragma "nepāriet" līdz pašreizējam riteņa iestatījumam, kad es ieeju režīmā.

Rec/mode poga. Es izmantoju šo: https://www.aliexpress.com/item/32806223591.html? S…

Citas standarta detaļas, piemēram, rezistori, vāciņi,… (skat. Shematisku attēlu)

1. darbība: kods

Es izmantoju ESP32 wifi iespējas, lai izveidotu savienojumu ar zināmu tīklu AP režīmā, vai, atrodoties laukā, tā kļūst par staciju (STA), kurai varu izveidot savienojumu. Tādā veidā es varu konfigurēt moduli. Es neiedziļināšos wifi/tīmekļa lapas sadaļā, es to varētu pievienot vēlāk.

ESP32 izveido savienojumu ar kameru un kļūst par Bluetooth LE klientu. Arduino ESP32 ietvarā iekļautais Bluetooth kods nedarbojas ar BMPCC4k. Wakwak-koba to mums ir labojis. Paldies Wakwak-koba! Es izmantoju BLE bibliotēku no šejienes:

github.com/wakwak-koba/arduino-esp32

Tomēr šī BLE lib versija joprojām tiek izstrādāta, un šķiet, ka jaunākā BLEUUID.cpp versija pašlaik nedarbojas, tāpēc ņemiet iepriekšējo šī faila "pārbaudīto" versiju.

Pārējā daļā lielākā daļa mana Bluetooth koda ir daudz saskaņā ar BLE piemēriem, kas iekļauti Arduino ietvarā:

Daži BLE UUID un mainīgie definē:

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

statiskais BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statisks BLEUUID DevInfoServiceControlUUID ("180A"); statiska BLEUUID vadības ķēdeUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statisks BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statisks BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statisks BLEUUID CamModelcharUUID ("2A24"); statisks BLEScan *pBLEScan = BLEDevice:: getScan (); statiskā BLEAddress *pServerAddress; statiskā BLEAdvertisedDevice* myDevice; statisks BLERemoteCharacteristic *pControlCharacteristic; statisks BLERemoteCharacteristic *pNotifCharacteristic; statiskā Būla doConnect = 0; statiskais Būla savienojums = 0; gaistošo bolu skenēšana = 0; volatileuint32_t pinCode;

Skenēšana un galvenā cilpa:

klase MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("Atrasta BLE reklamētā ierīce:"); Serial.println (AdvertisedDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). vienāds (BlackMagic)) {Serial.print ("Atradām mūsu ierīci!"); AdvertisedDevice.getScan ()-> stop (); myDevice = jauna BLEAdvertisedDevice (reklamēta ierīce); doConnect = taisnība; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skenēšana pabeigta"); skenēšana = nepatiesa; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! skenēšana))) {Serial.println ("skenēšana …"); skenēšana = taisnība; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Taimeris = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Mēs tagad esam savienoti ar BLE serveri."); savienots = taisnība; } else {Serial.println ("Mums neizdevās izveidot savienojumu ar serveri; mēs neko vairāk nedarīsim."); } doConnect = nepatiess; }}

Savienojuma izveide ar kameru:

bool connectToServer () {

Serial.print ("Savienojuma veidošana ar"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (jauna MySecurity ()); BLESecurity *pSecurity = jauns BLESecurity (); pDrošība-> 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 (jauns MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - savienots ar serveri"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // IEGŪT KAMERAS MODELI BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Neizdevās iegūt ierīces informācijas pakalpojumu"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); gote fail; } Serial.println (" - Ierīces informācijas lasīšana"); // Iegūt atsauci uz raksturlielumu attālā BLE servera pakalpojumā. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - neizdevās atrast kameras modeli"); Serial.println (CamModelcharUUID.toString (). C_str ()); gote fail; } // Lasiet raksturlieluma vērtību. std:: virknes vērtība = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera ir"); Sērijas.println (vērtība.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera nav BMPCC4k"); gote fail; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Neizdevās iegūt kameras pakalpojumu"); Serial.println (ControlserviceUUID.toString (). C_str ()); gote fail; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); ja (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Neizdevās iegūt kontroles raksturlielumu"); Serial.println (ControlcharUUID.toString (). C_str ()); gote fail; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - paziņojuma abonēšana"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (paziņotCallback, nepatiess); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) norādeOn, 2, true); } return true; neizdoties: pClient-> atvienot (); atgriezt nepatiesu; }

Pievienotais/atvienotais atzvans:

klase MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Mēs esam savienoti."); } void onDisconnect (BLEClient *pclient) {savienots = nepatiess; pclient-> atvienot (); Serial.println ("Mēs atvienojāmies."); }};

PIN koda daļa:

Pašreizējā versijā es varu ievadīt PIN kodu, izmantojot tīmekļa saskarni, taču šī ir informācija par wifi/tīmekļa lapu, kuru es varētu pievienot vēlāk.

klase MySecurity: publiska BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- LŪDZU, IEVADIET 6 CIPARA PIN (beidzas ar ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Sērijas.lasījums (); ja (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Sērijas nospiedums (ch); }} while ((ch! = '\ n')); atgriezt 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 passkey YES/NO number:%d", pass_key); vTaskDelay (5000); atgriezties; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Drošības pieprasījums"); atgriezties; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pāra statuss ="); Serial.println (auth_cmpl.success); }};

BLE paziņojums:

Kamera paziņo saviem BLE klientiem par jebkādām kameras izmaiņām, tostarp par to, kad kamera sāk un pārtrauc ierakstīšanu. Šis kods pārslēdz manu LED, kad tas sāk/pārtrauc ierakstīšanu.

static void paziņotCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE ziņojuma formāts: // 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 (garums == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } ja (pData [8] == 2) {recstatus = 1; }}}

2. darbība: kodeksa 2. daļa

Šī ir daļa, kas faktiski nosūta komandas kamerai.

Ieraksts:

uint8_t ieraksts = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = IZSLĒGTS, 2 = IESLĒGTS, [8] void Record (Būla RecOn) {if (! RecOn) ieraksts [8] = 0; cits ieraksts [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) ieraksts, 16, true); }

Fokusēšana:

Kamera sagaida 11 bitu skaitli, sākot no tuvuma līdz tālumam. Es ieteiktu ievietot filtru jūsu ADC vērtībai, pretējā gadījumā fokuss var nervozi nervozēt.

uint8_t fokuss = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, 11 bitu, [8] = LSB, [9] = MSBvoid fokuss (uint16_t val) {// pārejot no 12 bitu ADC vērtības uz 11 bitu fokusa vērtības fokusu [8] = (uint8_t) (((val> > 1) & 0xFF)); fokuss [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokuss, 12, true); }

Apertūra:

Kamera sagaida 11 bitu skaitli, sākot no zemas līdz lielai diafragmas atvēruma vērtībai. Es iesaku ADC vērtībai ievietot filtru, pretējā gadījumā diafragmas atvēruma vērtība var nervozi nervozēt.

uint8_t diafragma = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid diafragma (uint16_t val) {// pārejot no 12 bitu ADC vērtības uz 11 bitu diafragmas atvērumu [8] = (uint8_t) ((((val >> 1) & 0xFF)); diafragma [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) diafragma, 12, true); }

3. solis: ķēde

Ķēde
Ķēde

Esmu pievienojis savas shēmas PDF failu. Ir pievienoti arī daži PCB attēli.

Plāksne tiek darbināta ar mikro USB.

Pēc PCB saņemšanas es nolēmu, ka vēlos vadīt RGB gaismas diodi, tāpēc es pievienoju divus WS2812B sērijveidā ar izvadi "Button Led" (tam vajadzēja dažus vadus uz PCB). PCB bija 8 USD ar OSHPark.com.

PCB var redzēt vēl dažus savienojumus, piemēram, "adc", kurus es neizmantoju un kuri tika noņemti no pievienotajām shēmām. Iepriekš plānojat izmantot ārēju fokusēšanas riteni, bet šobrīd esmu pilnīgi apmierināts ar mazo īkšķa riteni.

4. solis. Secinājums

Es ceru, ka tas palīdzēja.

Man ir padomā daži nākotnes atjauninājumi, piemēram, rotējošā kodētāja izmantošana bez grūtībām. Tas prasīs, lai kontrolieris no kameras iegūtu pašreizējo fokusa vai diafragmas vērtību un turpinātu no turienes. Lai to izdarītu, iespējams, ir jāatjaunina funkcija "paziņotCallback".

PCB ir jāatjaunina, lai pareizi nodrošinātu signālus WS2812B RGB gaismas diodēm.

Es pavadīju daudz (loooot) laika, lai izveidotu šo darbu, it īpaši BLE daļu. Ja tas jums palīdzēja un vēlaties man nopirkt dzērienu, tas ir ļoti pateicīgi:) Šī ir Paypal ziedojumu saite:

Ieteicams: