Përmbajtje:

Butoni Magjik 4k: telekomanda me valë 20USD BMPCC 4k (ose 6k): 4 hapa (me fotografi)
Butoni Magjik 4k: telekomanda me valë 20USD BMPCC 4k (ose 6k): 4 hapa (me fotografi)

Video: Butoni Magjik 4k: telekomanda me valë 20USD BMPCC 4k (ose 6k): 4 hapa (me fotografi)

Video: Butoni Magjik 4k: telekomanda me valë 20USD BMPCC 4k (ose 6k): 4 hapa (me fotografi)
Video: (pусские субтитры) Токио Япония Капсульный отель опыт😊 Этаж только для женщин 2024, Korrik
Anonim
Image
Image

Shumë njerëz më kanë kërkuar të ndaj disa detaje rreth kontrolluesit tim pa tel për BMPCC4k. Shumica e pyetjeve ishin në lidhje me kontrollin bluetooth, kështu që unë do të përmend disa detaje në lidhje me këtë. Supozoj se jeni njohur me mjedisin ESP32 Arduino.

Ky version i telekomandës mund të kontrollojë regjistrimin, fokusin dhe hapjen e kamerës përmes bluetooth -it. Hidhini një sy videos. Quiteshtë mjaft e lehtë të shtosh më shumë funksione kontrolli sipas manualit të kontrollit bluetooth të BMPCC4k. Në thelb çdo gjë në kamera mund të kontrollohet, me sa kam parë.

Do të ishte një hap i lehtë për të shtuar një modul LIDAR për të matur distancën e një lënde, kështu që ju mund të merrni një lloj sistemi automatik të fokusimit … Edhe pse është e diskutueshme nëse mund të merrni një fokus mjaft të saktë në zona të veçanta siç janë sytë, etj…

P URDITSIM 2020: Kam bërë versionin 3.0. Bazohet në një rrotë rrotulluese falas duke përdorur një kodues magnetik. Gjithashtu lidhet me motorin tim të fokusit follow, i cili në thelb bëhet një pajisje e dytë bluetooth (ESP32 mbështet lidhje të shumta bluetooth). Videoja e re e demonstron këtë.

Nëse dëshironi të porositni versionin 3, ju lutemi hidhini një sy faqes së internetit të MagicButton

Furnizimet

Çdo modul ESP32 me wifi dhe bluetooth. Kam përdorur TTGO micro32 sepse është i vogël:

Një rrotë fokusi, çdo potenciometër do të bënte. Kam përdorur sa vijon sepse është e vogël: https://www.aliexpress.com/item/32963061806.html? S… Ky lloj ka ndalesa të vështira në kufirin e sipërm dhe të poshtëm. Në një version të ardhshëm do të përdor një kodues rrotullues. Në këtë mënyrë fokusi ose hapja nuk "kërcejnë" në cilësimin aktual të rrotave kur futem në një modalitet.

Një buton rec/mode. Kam përdorur sa vijon: https://www.aliexpress.com/item/32806223591.html? S…

Komponentë të tjerë standardë siç janë rezistorët, kapakët,… (shiko skematik)

Hapi 1: Kodi

Unë përdor aftësinë wifi të ESP32 ose për t'u lidhur me një rrjet të njohur në modalitetin AP, ose, kur jam në fushë, bëhet një stacion (STA) me të cilin mund të lidhem. Në atë mënyrë unë mund të konfiguroj modulin. Unë nuk do të hyj në detaje në seksionin wifi/faqe në internet, mund ta shtoj këtë në një fazë të mëvonshme.

ESP32 lidhet me kamerën dhe bëhet një klient Bluetooth LE. Kodi bluetooth i përfshirë në kuadrin ESP32 të Arduino nuk punon me BMPCC4k. Wakwak-koba na e ka rregulluar. Faleminderit Wakwak-koba! Kam përdorur bibliotekën BLE nga këtu:

github.com/wakwak-koba/arduino-esp32

Sidoqoftë, ai version i libit BLE është ende në zhvillim dhe versioni i fundit i BLEUUID.cpp nuk duket se funksionon në këtë moment, prandaj merrni versionin e mëparshëm të "verifikuar" të këtij skedari.

Për pjesën tjetër, shumica e kodit tim bluetooth është shumë sipas shembujve BLE të përfshirë në kuadrin Arduino:

Disa BLE UUID dhe ndryshore përcakton:

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

shërbimi statik BLEUUID ControlUserUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); BLEUUID statik DevInfoServiceControlUUID ("180A"); BLEUUID statik ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); BLEUUID statik NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); BLEUUID statik ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); BLEUUID statike CamModelcharUUID ("2A24"); BLEScan statik *pBLEScan = BLEDevice:: getScan (); statike BLEAdress *pServerAddress; Pajisja statike BLEAdvertised* myDevice; statike BLERemoteKarakteristike *pControlKarakteristike; statike BLERemoteKarakteristike *pNotifKarakteristike; doConnect statike boolean = 0; boole statike e lidhur = 0; skanim i paqëndrueshëm = 0; volatileuint32_t pinCode;

Skanimi dhe laku kryesor:

klasa MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("Pajisja e Reklamuar e BLE u gjet:"); Serial.println (advertisedDevice.toString (). C_str ()); If (advertisedDevice.getScan ()-> stop (); myDevice = pajisje e re BLEAdvertised (pajisje e shpallur); doConnect = e vërtetë; }}}; skanimi i zbrazëtisë statikeCompleteCB (BLEScanResults scanResults) {Serial.println ("skanimi u krye"); skanimi = false; } lak void (i pavlefshëm) {nëse (! i lidhur && ((uint32_t) (milis () - Kohëmatësi)> BLE_RESCAN_TIME || (! skanimi))) {Serial.println ("skanimi …"); skanimi = i vërtetë; pBLEScan-> fillimi (BLE_SCAN_TIME, scanCompleteCB); Kohëmatësi = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Tani jemi lidhur me serverin BLE."); e lidhur = e vërtetë; } else {Serial.println ("Ne nuk kemi arritur të lidhemi me serverin; nuk ka asgjë më shumë për të bërë."); } doConnect = false; }}

Lidhja me kamerën:

bool connectToServer () {

Serial.print ("Formimi i një lidhje me"); Serial.println (myDevice-> getAddress (). TeString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (MySecurity i ri ()); BLESecurity *pSecurity = new 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 (MyClientCallback i ri ()); pClient-> lidheni (pajisja ime); Serial.println (" - I lidhur me serverin"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN MODEL KAMERA BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Dështoi në marrjen e shërbimit të informacionit të pajisjes"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); dështoj; } Serial.println (" - Leximi i informacionit të pajisjes"); // Merrni një referencë ndaj karakteristikës në shërbimin e serverit të largët BLE. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nuk u gjet modeli i kamerës"); Serial.println (CamModelcharUUID.toString (). C_str ()); dështoj; } // Lexoni vlerën e karakteristikës. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera është"); Serial.println (vlera.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera nuk është BMPCC4k"); dështoj; } // KONTROLLI PBR ARRITJE pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Nuk arriti të marrë shërbimin e kamerës"); Serial.println (ControlserviceUUID.toString (). C_str ()); dështoj; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nuk arriti të marrë karakteristikën e kontrollit"); Serial.println (ControlcharUUID.toString (). C_str ()); dështoj; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - duke u regjistruar në njoftim"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (njoftoCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) treguesOn, 2, true); } kthehu i vërtetë; dështojnë: pClient-> shkëputje (); kthehu i rremë; }

Telefonata e lidhur/shkëputur:

klasa MyClientCallback: public BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Ne jemi lidhur."); } void onDisconnect (BLEClient *pclient) {lidhur = false; klient-> shkëputje (); Serial.println ("Ne u shkëputëm."); }};

Pjesa e kodit pin:

Në versionin tim aktual mund të fus kodin kod përmes ndërfaqes në internet, por këto janë detaje wifi/faqe në internet të cilat mund t'i shtoj më vonë.

klasa MySecurity: public BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (përfundoni me ENTER):"); pinCode = 0; char ch; bëj {ndërsa (! Serial.disponueshëm ()) {vonesë (1); } ch = Serial.read (); nëse (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} ndërsa ((ch! = '\ n')); kodi PIN i kthimit; } void onPassKeyNotify (uint32_t_kalimi) {ESP_LOGE (LOG_TAG, "Numri i njoftimit të çelësit të fjalëkalimit:%d", çelësi i kalimit); } bool onConfirmPIN (uint32_t_kalimi) {ESP_LOGI (LOG_TAG, "Numri i çelësit YES/JO:%d", çelësi i kalimit); vTaskDe vonesë (5000); i kthyeshëm; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Kërkesë sigurie"); i kthyeshëm; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("statusi i palës ="); Serial.println (auth_cmpl.suksesi); }};

Njoftimi BLE:

Kamera njofton klientët e saj BLE për çdo ndryshim të kamerës, përfshirë kur kamera fillon dhe ndalon regjistrimin. Ky kod ndryshon LED -in tim kur fillon/ndalon regjistrimin.

njofto zbrazëti statikeCallback (BLERemoteKarakteristike *pBLERemoteKarakteristike, uint8_t*pData, madhësia_t gjatësia, bool isNotify) {// BMPCC4k Formati i mesazhit BLE: // rec on është 255 9 0 0 10 1 1 2 2 0 64 0 2 // fikja është 255 9 0 0 10 1 1 2 2 0 0 64 0 2if (gjatësia == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } if (pData [8] == 2) {recstatus = 1; }}}

Hapi 2: Kodi Pjesa 2

Kjo është pjesa që në të vërtetë i dërgon komandat kamerës.

Regjistrimi:

uint8_t rekord = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] regjistrimi i pavlefshëm (Regjistrimi boolean) {nëse (! RecOn) regjistroni [8] = 0; tjetër rekord [8] = 2; rekord pControlCharacteristic-> writeValue ((uint8_t*), 16, e vërtetë); }

Duke u fokusuar:

Kamera pret një numër 11 bit, duke filluar nga fokusi i afërt në atë të largët. Unë ju këshilloj të vendosni një filtër në vlerën tuaj ADC, përndryshe fokusi mund të jetë nervoz.

uint8_t fokus = {255, 6, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, 11bit, [8] = LSB, [9] = MSBVoocus Focus (uint16_t val) {// duke shkuar nga një vlerë ADC 12bit në fokusin e vlerës së fokusit 11bit [8] = (uint8_t) ((((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokusi, 12, e vërtetë); }

Hapësira:

Kamera pret një numër 11 bit, duke filluar nga një vlerë e ulët në një hapje të lartë. Unë ju këshilloj të vendosni një filtër në vlerën tuaj ADC, përndryshe vlera e hapjes mund të jetë nervoze.

uint8_t aperture = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// duke shkuar nga një vlerë 12bit ADC në vlerën e aperturës së 11bit [8] = (uint8_t) (((val >> 1) & 0xFF)); aperture [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> vlera e shkrimit ((uint8_t*) hapja, 12, e vërtetë); }

Hapi 3: Qarku

Qarku
Qarku

Unë kam bashkangjitur PDF -në e qarkut tim. Disa fotografi të PCB janë bashkangjitur gjithashtu.

Pllaka mundësohet nga mikro USB.

Pas marrjes së PCB -së vendosa që doja të drejtoja një LED RGB, kështu që lidha dy WS2812B në seri me daljen "Button Led" (që kishte nevojë për disa arna teli në PCB). PCB -të ishin 8USD me OSHPark.com.

Ju mund të shihni disa lidhje të tjera në PCB të tilla si "adc" të cilat unë nuk i përdor dhe të cilat janë hequr nga skemat e bashkangjitura. Plani ishte që të përdorej një rrotë me fokus të jashtëm në të kaluarën, por aktualisht jam plotësisht i kënaqur me rrotën e vogël të gishtit të madh.

Hapi 4: Përfundimi

Shpresoj se kjo ndihmoi.

Unë kam disa përditësime të ardhshme në mendje, të tilla si përdorimi i një koduesi rrotullues pa ndalesa të forta. Kjo do të kërkojë që kontrolluesi të marrë vlerën aktuale të fokusit ose hapjes nga kamera dhe të vazhdojë nga atje. Funksioni "notifyCallback" duhet të përditësohet për këtë ndoshta.

PCB ka nevojë për një përditësim për të siguruar sinjalet për LED -të WS2812B RGB siç duhet.

Kam shpenzuar shumë (një grumbull) kohë për ta bërë këtë punë, veçanërisht pjesën BLE. Nëse kjo ju ndihmoi dhe doni të më blini një pije, kjo është shumë e vlerësuar:) Kjo është një lidhje dhurimi Paypal:

Recommended: