Sisukord:

Maagiline nupp 4k: 20USD BMPCC 4k (või 6k) juhtmevaba kaugjuhtimispult: 4 sammu (piltidega)
Maagiline nupp 4k: 20USD BMPCC 4k (või 6k) juhtmevaba kaugjuhtimispult: 4 sammu (piltidega)

Video: Maagiline nupp 4k: 20USD BMPCC 4k (või 6k) juhtmevaba kaugjuhtimispult: 4 sammu (piltidega)

Video: Maagiline nupp 4k: 20USD BMPCC 4k (või 6k) juhtmevaba kaugjuhtimispult: 4 sammu (piltidega)
Video: Это приносит мне $ 4 391,00 в месяц, пока я сплю ... (Пассивны... 2024, Juuli
Anonim
Image
Image

Paljud inimesed on palunud mul jagada mõningaid üksikasju oma traadita kontrolleri kohta BMPCC4k jaoks. Enamik küsimusi oli bluetooth -juhtimise kohta, nii et mainin selle kohta mõned üksikasjad. Eeldan, et olete ESP32 Arduino keskkonnaga tuttav.

See kaugjuhtimispuldi versioon saab Bluetoothi kaudu juhtida kaamera salvestamist, fookust ja ava. Vaadake videot. BMPCC4k Bluetoothi juhtimisjuhendi kohaselt on üsna lihtne lisada rohkem juhtimisfunktsioone. Põhimõtteliselt saab kaameras kõike juhtida, niipalju kui olen näinud.

Oleks lihtne samm lisada objekti kauguse mõõtmiseks LIDAR -moodul, et saaksite hankida mingisuguse autofookussüsteemi … Kuigi on küsitav, kas suudate piisavalt täpselt keskenduda teatud piirkondadele, nagu silmad jne …

UPDATE 2020: tegin versiooni 3.0. See põhineb vabalt pöörleval rattal, mis kasutab magnetkooderit. Samuti ühendatakse see minu fookusmootoriga, millest saab põhimõtteliselt teine bluetooth -seade (ESP32 toetab mitut Bluetooth -ühendust). Uus video näitab seda.

Kui soovite tellida versiooni 3, vaadake palun MagicButtoni veebisaiti

Tarvikud

Kõik ESP32 moodulid, millel on wifi ja bluetooth. Kasutasin TTGO micro32, sest see on pisike:

Fookusratas, iga potentsiomeeter sobiks. Kasutasin järgmist, sest see on pisike: https://www.aliexpress.com/item/32963061806.html? S … Sellel liigil on ülemise ja alumise piiri juures raskeid peatusi. Tulevases versioonis kasutan pöördkooderit. Nii ei hüppa fookus ega ava režiimi sisenedes ratta praeguse seadistuse juurde.

Rec/mode nupp. Kasutasin järgmist: https://www.aliexpress.com/item/32806223591.html? S…

Muud standardkomponendid, nagu takistid, mütsid,… (vt skeemi)

Samm: kood

Kasutan ESP32 WiFi -ühendust, et luua ühendus AP -režiimis teadaoleva võrguga või kui olen selles valdkonnas, saab sellest jaam (STA), millega saan ühenduse luua. Nii saan mooduli konfigureerida. Ma ei süvene wifi/veebilehe jaotise üksikasjadesse, võib -olla lisan selle hiljem.

ESP32 ühendub kaameraga ja muutub Bluetooth LE kliendiks. Arduino ESP32 raamistikus sisalduv bluetooth -kood ei tööta BMPCC4k -ga. Wakwak-koba on selle meie jaoks parandanud. Aitäh Wakwak-koba! Kasutasin siit BLE raamatukogu:

github.com/wakwak-koba/arduino-esp32

Sellegipoolest on see BLE libi versioon alles väljatöötamisel ja uusim versioon BLEUUID.cpp ei tundu praegu töötavat, seega võtke selle faili varasem "kinnitatud" versioon.

Ülejäänud osas on enamik minu bluetooth -koodist Arduino raamistikus sisalduvate BLE -näidete järgi palju:

Mõned BLE UUID ja muutuja määratlevad:

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

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

Skaneerimine ja peamine silmus:

klass MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("Leiti BLE reklaamitud seade:"); Serial.println (AdvertisedDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). võrdub (BlackMagic)) {Serial.print ("Leidsime meie seadme!"); AdvertisedDevice.getScan ()-> stop (); myDevice = uus BLEAdvertisedDevice (reklaamitud seade); doConnect = tõsi; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skaneerimine tehtud"); skaneerimine = vale; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! skaneerimine))) {Serial.println ("scaning …"); skaneerimine = tõsi; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Taimer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Oleme nüüd ühendatud BLE -serveriga."); ühendatud = tõene; } else {Serial.println ("Meil ei õnnestunud serveriga ühendust luua; me ei tee enam midagi."); } doConnect = vale; }}

Kaameraga ühendamine:

bool connectToServer () {

Serial.print ("Ühenduse loomine"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (uus MySecurity ()); BLESecurity *pSecurity = uus 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 (uus MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - ühendatud serveriga"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // SAADA KAAMERAMUDEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Seadme infoteenuse hankimine ebaõnnestus"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); ebaõnnestub; } Serial.println (" - Seadme teabe lugemine"); // Hankige viide karakteristikule BLE -serveri teenuses. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kaamera mudeli leidmine ebaõnnestus"); Serial.println (CamModelcharUUID.toString (). C_str ()); ebaõnnestub; } // Tunnuse väärtuse lugemine. std:: stringi väärtus = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kaamera on"); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kaamera ei ole BMPCC4k"); ebaõnnestub; } // OTA KONTROLL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Kaamerateenuse hankimine ebaõnnestus"); Serial.println (ControlserviceUUID.toString (). C_str ()); ebaõnnestub; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MinuNimi.c_str (), MinuNimi.pikkus ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Juhtimisomaduste hankimine ebaõnnestus"); Serial.println (ControlcharUUID.toString (). C_str ()); ebaõnnestub; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - märguande tellimine"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (teate tagasikutsumine, vale); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) märgeOn, 2, true); } return true; ebaõnnestumine: pClient-> katkesta ühendus (); tagastama vale; }

Ühendatud/katkestatud tagasihelistamine:

klassi MyClientCallback: avalik BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Oleme ühendatud."); } void onDisconnect (BLEClient *pclient) {ühendatud = vale; pclient-> katkesta ühendus (); Serial.println ("Saime ühenduse katkestada."); }};

Pin -koodi osa:

Praeguses versioonis saan sisestada PIN -koodi veebiliidese kaudu, kuid need on wifi/veebilehe üksikasjad, mille võin hiljem lisada.

klassi MySecurity: avalik BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PALUN SISESTA 6 DIGIT PIN-koodi (lõpeta ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} while ((ch! = '\ n')); tagasta pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Parooli märguande number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Parool YES/NO number:%d", pass_key); vTaskDelay (5000); tagasipöördumine; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Turvalisus"); tagasipöördumine; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("paari olek ="); Serial.println (auth_cmpl.success); }};

BLE teatis:

Kaamera teavitab oma BLE kliente kõigist kaamera muudatustest, sealhulgas siis, kui kaamera alustab ja lõpetab salvestamise. See kood lülitab minu LED -i sisse, kui see alustab/lõpetab salvestamise.

staatiline tühine teadeCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t pikkus, bool isNotify) {// BMPCC4k BLE sõnumi vorming: // 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 (pikkus == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } kui (pData [8] == 2) {recstatus = 1; }}}

2. etapp: koodi 2. osa

See on osa, mis tegelikult saadab käsklused kaamerale.

Salvestamine:

uint8_t kirje = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = VÄLJAS, 2 = SEES, [8] tühine kirje (boolean RecOn) {if (! RecOn) kirje [8] = 0; muu rekord [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) kirje, 16, true); }

Teravustamine:

Kaamera ootab 11 -bitist numbrit, mis ulatub lähedalt kuni kaugele. Soovitan siiski ADC väärtusele filtri panna, muidu võib fookus närviliselt väriseda.

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) {// üleminek 12 -bitiselt ADC -lt 11 -bitisele fookusväärtusele [8] = (uint8_t) (((val> > 1) & 0xFF)); fookus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fookus, 12, true); }

Ava:

Kaamera ootab 11 -bitist numbrit, ulatudes madalast kuni suure ava väärtuseni. Soovitan ADC väärtusele filtri panna, vastasel juhul võib ava väärtus närviliselt väriseda.

uint8_t ava = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid -ava (uint16_t val) {// üleminek 12 -bitiselt ADC -lt 11 -bitisele ava väärtusele [8] = (uint8_t) ((((val >> 1) & 0xFF)); ava [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) ava, 12, true); }

3. samm: vooluring

Ringkond
Ringkond

Lisasin oma vooluringi PDF -faili. Lisatud on ka mõned PCB pildid.

Tahvli toiteallikaks on mikro -USB.

Pärast trükkplaadi saamist otsustasin, et tahan juhtida RGB LED -i, nii et ühendasin kaks WS2812B järjestikku väljundiga "Button Led" (mis vajas PCB -l mõningaid juhtmepaiku). PCB -d olid 8 USD USA OSHPark.com -iga.

PCB -l on näha veel mõned ühendused, näiteks "adc", mida ma ei kasuta ja mis eemaldati lisatud skeemidelt. Plaan oli varem kasutada välist fookusratast, kuid praegu olen väikese pöidlarattaga täiesti rahul.

4. samm: järeldus

Loodan, et see aitas.

Mul on mõned tulevased uuendused meeles, näiteks pöörleva kodeerija kasutamine ilma peatusteta. Selleks on vaja, et kontroller saaks kaamerast fookuse või ava praeguse väärtuse ja jätkaks sealt. Tõenäoliselt tuleb funktsiooni "teate kutsumine" värskendada.

PCB vajab värskendamist, et anda WS2812B RGB LED -ide signaalide nõuetekohane edastamine.

Kulutasin selle töö tegemisele palju (loooot) aega, eriti BLE osa. Kui see aitas teid ja soovite mulle jooki osta, on see väga teretulnud:) See on Paypali annetuse link:

Soovitan: