Mündəricat:

Magic Button 4k: 20USD BMPCC 4k (və ya 6k) Simsiz Uzaqdan İdarəetmə: 4 Addım (Şəkillərlə)
Magic Button 4k: 20USD BMPCC 4k (və ya 6k) Simsiz Uzaqdan İdarəetmə: 4 Addım (Şəkillərlə)

Video: Magic Button 4k: 20USD BMPCC 4k (və ya 6k) Simsiz Uzaqdan İdarəetmə: 4 Addım (Şəkillərlə)

Video: Magic Button 4k: 20USD BMPCC 4k (və ya 6k) Simsiz Uzaqdan İdarəetmə: 4 Addım (Şəkillərlə)
Video: MagicButton4k: super handy bmpcc4k bluetooth remote 2024, Iyul
Anonim
Image
Image

Bir çox insan BMPCC4k üçün simsiz idarəedicim haqqında bəzi detalları paylaşmağımı istədi. Sualların çoxu bluetooth nəzarəti ilə bağlı idi, buna görə də bununla bağlı bir neçə detalı qeyd edəcəyəm. ESP32 Arduino mühiti ilə tanış olduğunuzu düşünürəm.

Pultun bu versiyası bluetooth vasitəsi ilə kameranın qeydini, fokuslanmasını və diyaframını idarə edə bilir. Videoya bir baxın. BMPCC4k bluetooth idarəetmə təlimatına uyğun olaraq daha çox nəzarət funksiyası əlavə etmək olduqca asandır. Gördüyüm qədər kamerada olan hər şeyi idarə etmək olar.

Bir mövzunun məsafəsini ölçmək üçün bir LIDAR modulu əlavə etmək asan bir addım olardı, buna görə də bir növ avtofokus sistemi əldə edə bilərsiniz … Gözlər və s.

YENİLƏNİŞ 2020: 3.0 versiyasını hazırladım. Maqnit kodlayıcıdan istifadə edərək sərbəst fırlanan təkər üzərində qurulub. Əsasən ikinci bir bluetooth cihazı olan ESP32 çoxlu Bluetooth əlaqələrini dəstəkləyir. Yeni video bunu göstərir.

3 -cü versiyanı sifariş etmək istəyirsinizsə, MagicButton veb saytına baxın

Təchizat

WiFi və bluetooth ilə hər hansı bir ESP32 modulu. Kiçik olduğu üçün TTGO micro32-dən istifadə etdim:

Hər hansı bir potensiometr fokus çarxı edər. Kiçik olduğu üçün aşağıdakılardan istifadə etdim: https://www.aliexpress.com/item/32963061806.html? S… Bu növün yuxarı və aşağı sərhəddə çətin dayanacaqları var. Gələcək bir versiyada bir döner kodlayıcı istifadə edəcəyəm. Bu şəkildə fokus və ya diyafram bir rejimə girəndə cari təkər parametrinə "atlamır".

Rec/mode düyməsi. Aşağıdakıları istifadə etdim: https://www.aliexpress.com/item/32806223591.html? S…

Rezistorlar, qapaqlar kimi digər standart komponentlər … (sxematik bax)

Addım 1: Kod

ESP32 -nin wifi qabiliyyətindən ya AP rejimində tanınmış bir şəbəkəyə qoşulmaq üçün istifadə edirəm, ya da tarlada olduğum zaman qoşula biləcəyim bir stansiyaya (STA) çevrilir. Bu şəkildə modulu konfiqurasiya edə bilərəm. Wifi/veb səhifəsinin detallarına girməyəcəyəm, bunu sonrakı mərhələdə əlavə edə bilərəm.

ESP32 kameraya qoşulur və Bluetooth LE müştəri olur. Arduinonun ESP32 çərçivəsinə daxil olan bluetooth kodu BMPCC4k ilə işləmir. Wakwak-koba bunu bizim üçün düzəltdi. Təşəkkür edirəm Wakwak-koba! Buradan BLE kitabxanasından istifadə etdim:

github.com/wakwak-koba/arduino-esp32

Buna baxmayaraq, BLE lib versiyası hələ inkişaf mərhələsindədir və BLEUUID.cpp -in son versiyası hazırda işləmir, buna görə də bu faylın əvvəlki "təsdiqlənmiş" versiyasını götürün.

Qalanları üçün, bluetooth kodumun çoxu Arduino çərçivəsinə daxil olan BLE nümunələrinə görə çoxdur:

Bəzi BLE UUID və dəyişən müəyyən edir:

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

statik BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statik BLEUUID DevInfoServiceControlUUID ("180A"); statik BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statik BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statik BLEUUID MüştəriNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statik BLEUUID CamModelcharUUID ("2A24"); statik BLEScan *pBLEScan = BLEDevice:: getScan (); statik BLEAddress *pServerAddress; statik BLEAdvertisedDevice* myDevice; statik BLERemoteCharacteristic *pControlCharacteristic; statik BLERemoteCharacteristic *pNotifCaracteristic; statik boolean doConnect = 0; statik boolean bağlı = 0; volatilebool tarama = 0; volatileuint32_t pinCode;

Tarama və əsas döngə:

sinif MyAdvertisedDeviceCallbacks: ümumi BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice adsedDevice) {Serial.print ("BLE Reklam Edilmiş Cihaz tapıldı:"); Serial.println (adsedDevice.toString (). C_str ()); əgər (adsedDevice.haveServiceUUID () && adsedDevice.getServiceUUID (). bərabərdir (BlackMagic)) {Serial.print ("Cihazımız tapıldı!"); adsedDevice.getScan ()-> dayandır (); myDevice = yeni BLEAdvertisedDevice (reklam edilmişDevice); doConnect = doğru; }}}; statik boş taramaCompleteCB (BLEScanResults scanResults) {Serial.println ("tarama tamamlandı"); tarama = yalan; } void loop (void) {if (! bağlı && ((uint32_t) (milis () - Zamanlayıcı)> BLE_RESCAN_TIME || (! tarama))) {Serial.println ("tarama…"); tarama = doğru; pBLEScan-> başlanğıc (BLE_SCAN_TIME, scanCompleteCB); Taymer = milis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("İndi BLE Serverinə qoşulmuşuq."); bağlı = doğru; } else {Serial.println ("Serverə qoşula bilmədik; bundan sonra edəcəyimiz başqa heç nə yoxdur."); } doConnect = yanlış; }}

Kameraya qoşulma:

bool connectToServer () {

Serial.print ("ilə əlaqə yaratmaq"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (yeni MySecurity ()); BLESecurity *pSecurity = yeni 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 (yeni MyClientCallback ()); pClient-> qoşul (myDevice); Serial.println (" - Serverə qoşuldu"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN KAMERA MODELİ BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Cihaz məlumat xidməti alınmadı"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); uğursuz olmaq; } Serial.println (" - Cihaz məlumatı oxunur"); // Uzaqdakı BLE serverinin xidmətindəki xarakteristikaya istinad alın. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kamera modeli tapılmadı"); Serial.println (CamModelcharUUID.toString (). C_str ()); uğursuz olmaq; } // Xüsusiyyətin dəyərini oxuyun. std:: string dəyəri = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera budur"); Serial.println (dəyər.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera BMPCC4k deyil"); uğursuz olmaq; } // OBTAIN KONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Kamera xidməti alınmadı"); Serial.println (ControlserviceUUID.toString (). C_str ()); uğursuz olmaq; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nəzarət xarakteristikası alınmadı"); Serial.println (ControlcharUUID.toString (). C_str ()); uğursuz olmaq; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - bildirişə abunə olmaq"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) göstəricisiOn, 2, doğru); } doğru qayıt; uğursuz: pClient-> disconnect (); saxta qayıtmaq; }

Bağlı/əlaqəsiz geri zəng:

sinif MyClientCallback: ümumi BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Bağlıyıq."); } void onDisconnect (BLEClient *pclient) {bağlı = yanlış; pclient-> ayırın (); Serial.println ("Əlaqəmiz kəsildi."); }};

Pin kodu hissəsi:

Mövcud versiyamda veb interfeysi vasitəsi ilə pin kodu daxil edə bilərəm, ancaq bunlar daha sonra əlavə edə biləcəyim wifi/veb səhifəsi detallarıdır.

sinif MySecurity: ictimai BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- LÜTFƏN 6 Rəqəmli PIN daxil edin (ENTER ilə bitin):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); əgər (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial. çap (ch); }} isə ((ch! = '\ n')); pinCode qaytarın; } etibarsız onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Şifrənin bildiriş nömrəsi:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Şifrə YES/NO nömrəsi:%d", pass_key); vTaskDelay (5000); geri dönüş; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Təhlükəsizlik İstəyi"); geri dönüş; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE bildirişi:

Kamera, BLE müştərilərinə kameranın hər hansı bir dəyişikliyi, o cümlədən kameranın yazmağa başladığı və dayandırdığı zaman məlumat verir. Bu kod yazmağa başladıqda/dayandırdıqda LEDimi dəyişir.

statik void notifyCallback (BLERemoteCharacteristic *pBLERemoteCaracteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE mesaj formatı: // rec 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off 255 9 0 0 10 1 1 2 0 0 64 0 2if (uzunluq == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {əgər (pData [8] == 0) { vəziyyət statusu = 0; } if (pData [8] == 2) {recstatus = 1; }}}

Addım 2: Kod 2 -ci hissə

Bu, əslində kameraya əmrləri göndərən hissədir.

Qeyd:

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; başqa qeyd [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) qeyd, 16, doğru); }

Diqqət:

Kamera yaxından uzaq fokusa qədər 11 bitlik bir rəqəm gözləyir. ADC dəyərinizə bir filtr qoymağı məsləhət görürəm, əks halda diqqət əsəbi şəkildə titrəyə bilər.

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) {// 12bit ADC dəyərindən 11bit fokus dəyər fokusuna [8] = (uint8_t) (((val> > 1) & 0xFF)); diqqət [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, doğru); }

Diyafram:

Kamera, aşağıdan yüksək diyafram dəyərinə qədər 11 bitlik bir rəqəm gözləyir. ADC dəyərinizə bir filtr qoymağı məsləhət görürəm, əks halda diyafram dəyəri əsəbi şəkildə sarsıla bilər.

uint8_t diyafram = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid Diyafram (uint16_t val) {// 12 bit ADC dəyərindən 11 bit diyafram dəyər diyaframına [8] = (uint8_t) (((dəyər >> 1)) & 0xFF)); diyafram [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) diyafram, 12, doğru); }

Addım 3: Dövrə

Dövrə
Dövrə

Dövrümün PDF'sini əlavə etdim. PCB -nin bəzi şəkilləri də əlavə olunur.

Lövhə mikro USB ilə təchiz edilmişdir.

PCB aldıqdan sonra bir RGB LED idarə etmək istədiyimə qərar verdim və buna görə də iki WS2812B -ni "Button Led" çıxışına bağladım (PCB -də bəzi tel yamaqları lazım idi). PCB -lər OSHPark.com ilə 8USD idi.

PCB -də istifadə etmədiyim və əlavə edilmiş sxemlərdən çıxarılan "adc" kimi bir neçə əlaqəni görə bilərsiniz. Plan keçmişdə xarici fokus çarxı istifadə etmək idi, amma hazırda kiçik baş barmağımdan çox məmnunam.

Addım 4: Nəticə

Ümid edirəm bu kömək etdi.

Gələcəkdə bir neçə yeniləmə var, məsələn, dayanmadan dönən bir kodlayıcıdan istifadə etmək. Bu, nəzarətçidən fokusun və ya diyaframın cari dəyərini kameradan almasını və oradan davam etməsini tələb edəcək. Bunun üçün "notifyCallback" funksiyasını yeniləmək lazımdır.

PCB, WS2812B RGB LEDləri üçün siqnalları düzgün şəkildə təmin etmək üçün bir yeniləməyə ehtiyac duyur.

Bu işi, xüsusən BLE hissəsini hazırlamaq üçün çox vaxt sərf etdim. Bu sizə kömək etsəydi və mənə bir içki almaq istəsəniz, bu çox təqdir olunur:) Bu Paypal bağış linkidir:

Tövsiyə: