İçindekiler:

Magic Button 4k: 20USD BMPCC 4k (veya 6k) Kablosuz Uzaktan Kumanda: 4 Adım (Resimlerle)
Magic Button 4k: 20USD BMPCC 4k (veya 6k) Kablosuz Uzaktan Kumanda: 4 Adım (Resimlerle)

Video: Magic Button 4k: 20USD BMPCC 4k (veya 6k) Kablosuz Uzaktan Kumanda: 4 Adım (Resimlerle)

Video: Magic Button 4k: 20USD BMPCC 4k (veya 6k) Kablosuz Uzaktan Kumanda: 4 Adım (Resimlerle)
Video: Новости с IBC-2023 2024, Temmuz
Anonim
Image
Image

Birçok kişi benden BMPCC4k için kablosuz denetleyicim hakkında bazı ayrıntıları paylaşmamı istedi. Soruların çoğu bluetooth kontrolü ile ilgiliydi, bu yüzden bununla ilgili birkaç ayrıntıdan bahsedeceğim. ESP32 Arduino ortamına aşina olduğunuzu varsayıyorum.

Uzaktan kumandanın bu versiyonu, bluetooth üzerinden kameranın kaydını, odağını ve diyaframını kontrol edebilir. Videoya bir göz atın. BMPCC4k'nin bluetooth kontrol kılavuzuna göre daha fazla kontrol işlevi eklemek oldukça kolaydır. Temelde, gördüğüm kadarıyla kameradaki her şey kontrol edilebilir.

Bir öznenin mesafesini ölçmek için bir LIDAR modülü eklemek kolay bir adım olurdu, böylece bir çeşit otomatik odaklama sistemi elde edebilirsiniz… Gözler gibi belirli alanlara yeterince doğru bir odaklama yapıp yapamayacağınız şüpheli olsa da…

GÜNCELLEME 2020: 3.0 sürümünü yaptım. Manyetik kodlayıcı kullanan serbest dönen bir tekerleğe dayanmaktadır. Ayrıca, temelde ikinci bir bluetooth cihazı haline gelen takip odak motoruma da bağlanır (ESP32, birden fazla bluetooth bağlantısını destekler). Yeni video bunu gösteriyor.

Sürüm 3'ü sipariş etmek isterseniz, lütfen MagicButton web sitesine bakın.

Gereçler

Wifi ve bluetooth ile herhangi bir ESP32 modülü. TTGO micro32'yi küçük olduğu için kullandım:https://www.banggood.com/LILYGO-TTGO-Micro-32-V2_0…

Bir odak tekerleği, herhangi bir potansiyometre yapardı. Küçük olduğu için şunu kullandım:https://www.aliexpress.com/item/32963061806.html?s…Bu türün üst ve alt sınırlarında sert duruşları vardır. Gelecekteki bir sürümde döner kodlayıcı kullanacağım. Bu şekilde, bir moda girdiğimde odak veya diyafram geçerli tekerlek ayarına "atlamıyor".

Bir kayıt/mod düğmesi. Aşağıdakileri kullandım:https://www.aliexpress.com/item/32806223591.html?s…

Dirençler, kapaklar, … gibi diğer standart bileşenler (şemaya bakın)

Adım 1: Kod

ESP32'nin wifi özelliğini AP modunda bilinen bir ağa bağlanmak için kullanıyorum veya sahadayken bağlanabileceğim bir istasyon (STA) oluyor. Bu şekilde modülü yapılandırabilirim. Wifi/web sayfası bölümünün detayına girmeyeceğim, bunu daha sonraki bir aşamada ekleyebilirim.

ESP32, kameraya bağlanır ve bir Bluetooth LE istemcisi olur. Arduino'nun ESP32 çerçevesine dahil edilen bluetooth kodu, BMPCC4k ile çalışmıyor. Wakwak-koba bizim için düzeltti. Teşekkürler Wakwak-koba! BLE kütüphanesini buradan kullandım:

github.com/wakwak-koba/arduino-esp32

Bununla birlikte, BLE lib'in bu sürümü hala geliştirme aşamasındadır ve BLEUIID.cpp'nin en son sürümü şu anda çalışmıyor gibi görünmektedir, bu nedenle bu dosyanın önceki "doğrulanmış" sürümünü alın.

Geri kalanı için, bluetooth kodumun çoğu, Arduino çerçevesindeki BLE örneklerine göre çok fazla:

Bazı BLE UUID ve değişken tanımları:

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 ClientNamecharUUID("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statik BLEUUID CamModelcharUUID("2A24"); statik BLEScan *pBLEScan = BLEDevice::getScan(); statik BLAddress *pServerAddress; statik BLEAdvertisedDevice* myDevice; statik BLERuzaktanKarakteristik *pKontrolKarakteristik; statik BLERuzaktanKarakteristik *pNotifKarakteristik; statik boole doConnect = 0; statik boole bağlı =0; volatilebool taraması =0; volatileuint32_t pinCode;

Tarama ve ana döngü:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks{

void onResult(BLEAdvertisedDevice reklamı yapılanDevice) { Serial.print("BLE Reklamı Yapılan Cihaz bulundu: "); Serial.println(advertisedDevice.toString().c_str()); if (advertisedDevice.haveServiceUUID() && reklamlıDevice.getServiceUUID().equals(BlackMagic)) { Serial.print("Cihazımızı bulduk!"); reklamı yapılanDevice.getScan()->stop(); myDevice = new BLEAdvertisedDevice(advertisedDevice); doConnect =doğru; } } }; static void scanCompleteCB(BLEScanResults scanResults) { Serial.println("tarama tamamlandı"); tarama =yanlış; } void loop(void) { if (!connected && ((uint32_t)(millis() - Zamanlayıcı) > BLE_RESCAN_TIME || (!tarama))) { Serial.println("tarama…"); tarama =doğru; pBLEScan->start(BLE_SCAN_TIME, scanCompleteCB); Zamanlayıcı = millis(); } if (doConnect ==true) { if (connectToServer()) { Serial.println("Artık BLE Sunucusuna bağlıyız."); bağlı =doğru; } else { Serial.println("Sunucuya bağlanamadık, yapacağımız başka bir şey yok."); } doConnect =yanlış; } }

Kameraya bağlanma:

bool connectToServer(){

Serial.print("Bir bağlantı kuruluyor"); Serial.println(myDevice->getAddress().toString().c_str()); BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT); BLEDevice::setSecurityCallbacks(new MySecurity()); 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(yeni MyClientCallback()); pClient->connect(myDevice); Serial.println(" - Sunucuya bağlandı"); BLEDevice::setMTU(BLEDevice::getMTU()); // KAMERA MODELİNİ AL BLERemoteService *pRemoteService = pClient->getService(DevInfoServiceControlUUID); if (pRemoteService == nullptr) { Serial.print(" - Cihaz bilgi servisi alınamadı"); Serial.println(DevInfoServiceControlUUID.toString().c_str()); başarısız ol; } Serial.println(" - Cihaz bilgisi okunuyor"); // Uzak BLE sunucusunun hizmetindeki özelliğe bir referans alın. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService->getCharacteristic(CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) { Serial.print(" - Kamera modeli bulunamadı"); Serial.println(CamModelcharUUID.toString().c_str()); başarısız ol; } // Karakteristiğin değerini okuyun. std::string değer = pRemoteCamModelCharacteristic->readValue(); Serial.print("Kamera "); Serial.println(değer.c_str()); if (CamModel != value.c_str()) { Serial.print(" - Kamera BMPCC4k değil"); başarısız ol; } // KONTROLÜ ELDE EDİN pRemoteService = pClient->getService(ControlserviceUUID); if (pRemoteService == nullptr) { Serial.print(" - Kamera hizmeti alınamadı"); Serial.println(ControlserviceUUID.toString().c_str()); başarısız ol; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService->getCharacteristic(ClientNamecharUUID); if (pRemoteClientNameCharacteristic != nullptr) { pRemoteClientNameCharacteristic->writeValue(MyName.c_str(), MyName.length()); } pControlCharacteristic = pRemoteService->getCharacteristic(ControlcharUUID); if (pControlCharacteristic == nullptr) { Serial.print(" - Kontrol karakteristiği alınamadı"); Serial.println(ControlcharUUID.toString().c_str()); başarısız ol; } pNotifCharacteristic = pRemoteService->getCharacteristic(NotifcharUUID); if (pNotifCharacteristic != nullptr) // && pNotifCharacteristic->canIndicate()) { Serial.println(" - bildirime abone olmak"); const uint8_t göstergesiOn = {0x2, 0x0}; pNotifCharacteristic->registerForNotify(notifyCallback, false); pNotifCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)indicationOn, 2, true); } true döndür; başarısız: pClient->bağlantıyı kes(); yanlış döndür; }

Bağlı/bağlantısı kesilmiş geri arama:

class MyClientCallback: genel BLEClientCallbacks{

void onConnect(BLEClient *pclient) { Serial.println("Bağlıyız."); } void onDisconnect(BLEClient *pclient) { bağlı =yanlış; pclient->bağlantıyı kes(); Serial.println("Bağlantımız kesildi."); } };

Pin kodu kısmı:

Mevcut sürümümde pin kodunu web arayüzü üzerinden girebiliyorum ancak bunlar daha sonra ekleyebileceğim wifi/web sayfası detayları.

sınıf MySecurity: public BLESecurityCallbacks

{ uint32_t onPassKeyRequest() { Serial.println("- LÜTFEN 6 HANELİ PİN GİRİN (ENTER ile biter): "); pinKodu =0; karakter ch; do { while (!Serial.available()) { delay(1); } ch = Seri.read(); if (ch >='0'&& ch <='9') { pinCode = pinCode *10+ (ch -'0'); Seri.baskı(ch); } } while ((ch !='\n')); pinCode'u döndür; } void onPassKeyNotify(uint32_t pass_key) { ESP_LOGE(LOG_TAG, "Parola Bildirim numarası:%d", pass_key); } bool onConfirmPIN(uint32_t pass_key) { ESP_LOGI(LOG_TAG, "Parola EVET/HAYIR numarası:%d", pass_key); vTaskDelay(5000); geri dönüş; } bool onSecurityRequest() { ESP_LOGI(LOG_TAG, "Güvenlik Talebi"); geri dönüş; } void onAuthenticationComplete(esp_ble_auth_cmpl_t auth_cmpl) { Serial.print("çift durum = "); Serial.println(auth_cmpl.success); } };

BLE bildirimi:

Kamera, BLE istemcilerine, kameranın kaydı başlatıp durdurması da dahil olmak üzere tüm kamera değişikliklerini bildirir. Bu kod, kaydı başlattığında/durdurduğunda LED'imi değiştirir.

static void notifyCallback(BLERuzaktanKarakteristik *pBLERUzaktanKarakteristik, uint8_t*pData, size_t uzunluk, bool isNotify) { // BMPCC4k BLE mesaj formatı:// kayıt 255 9 0 0 10 1 1 2 2 0 64 0 2// kayıt kapalı 255 9 0 0 10 1 1 2 0 0 64 0 2if (uzunluk ==13&& pData[0] ==255&& pData[1] ==9&& pData[4] ==10&& pData[5] ==1) { if (pData[8] ==0) { yeniden durum =0; } if (pData[8] ==2) { recstatus =1; } } }

Adım 2: Kod Bölüm 2

Bu aslında komutları kameraya gönderen kısımdır.

Kayıt:

uint8_t kaydı = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0=KAPALI, 2=AÇIK, [8]void Record(boolean RecOn) { if (!RecOn) record[8] =0; başka kayıt[8] =2; pControlCharacteristic->writeValue((uint8_t*)record, 16, true); }

Odaklanma:

Kamera, yakın ve uzak odak arasında değişen 11 bitlik bir sayı bekler. ADC değerinize bir filtre koymanızı tavsiye ederim, aksi takdirde odak sinir bozucu olabilir.

uint8_t odak = {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 değerinden 11bit odak değerine geçiş odak[8] = (uint8_t)(((val > >1) &0xFF)); odak[9] = (uint8_t)(((val >>1) &0xFF00) >>8); pControlCharacteristic->writeValue((uint8_t*)odak, 12, doğru); }

Diyafram:

Kamera, düşükten yüksek diyafram değerine kadar değişen 11 bitlik bir sayı bekler. ADC değerinize bir filtre koymanızı tavsiye ederim, aksi takdirde diyafram değeri gergin bir şekilde titreyebilir.

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) { //12bit ADC değerinden 11bit diyafram değerine geçiş[8] = (uint8_t)(((val >>1) &0xFF)); diyafram[9] = (uint8_t)(((val >>1) &0xFF00) >>8); pControlCharacteristic->writeValue((uint8_t*)aperture, 12, true); }

Adım 3: Devre

Devre
Devre

Devremin PDF'sini ekledim. PCB'nin bazı resimleri de eklenmiştir.

Anakart mikro USB ile güçlendirilmiştir.

PCB'yi aldıktan sonra bir RGB LED sürmek istediğime karar verdim, bu yüzden iki WS2812B'yi seri olarak "Buton Led" çıkışına bağladım (bu, PCB üzerinde bazı kablo yamalarına ihtiyaç duyuyordu). PCB'ler OSHPark.com ile 8 USD idi.

PCB üzerinde kullanmadığım ve ekli şemalardan kaldırılan "adc" gibi bazı bağlantılar görebilirsiniz. Plan geçmişte harici bir odak tekerleği kullanmaktı ama şu anda küçük başparmak tekerleğinden tamamen memnunum.

4. Adım: Sonuç

Umarım bu yardımcı olmuştur.

Kesintisiz bir döner kodlayıcı kullanmak gibi gelecekte bazı güncellemeler var. Bu, denetleyicinin kameradan mevcut odak veya diyafram değerini almasını ve oradan devam etmesini gerektirir. Bunun için muhtemelen "notifyCallback" işlevinin güncellenmesi gerekiyor.

PCB'nin, WS2812B RGB LED'lerine doğru şekilde sinyal sağlamak için bir güncellemeye ihtiyacı var.

Bu işi, özellikle de BLE kısmını yapmak için çok (çok fazla) zaman harcadım. Bu size yardımcı olduysa ve bana bir içki ısmarlamak istiyorsanız, bu çok minnettarım:) Bu bir Paypal bağış bağlantısı:

Önerilen: