İçindekiler:
Video: Magic Button 4k: 20USD BMPCC 4k (veya 6k) Kablosuz Uzaktan Kumanda: 4 Adım (Resimlerle)
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
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
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:
IRduino: Arduino Uzaktan Kumanda - Kayıp Bir Uzaktan Kumandayı Taklit Etme: 6 Adım
IRduino: Arduino Uzaktan Kumanda - Kayıp Bir Uzaktan Kumandayı Taklit Edin: TV veya DVD oynatıcınızın uzaktan kumandasını kaybettiyseniz, cihazın üzerindeki düğmeleri yürümek, bulmak ve kullanmak zorunda olmanın ne kadar sinir bozucu olduğunu bilirsiniz. Bazen bu düğmeler, uzaktan kumandayla aynı işlevi bile sunmaz.
Arduino İle 2.4Ghz NRF24L01 Modülünü Kullanan Kablosuz Uzaktan Kumanda - Nrf24l01 Quadcopter için 4 Kanal / 6 Kanal Verici Alıcı - Rc Helikopter - Arduino Kullanan Rc Uçak: 5 Adım (Resimlerle)
Arduino İle 2.4Ghz NRF24L01 Modülünü Kullanan Kablosuz Uzaktan Kumanda | Nrf24l01 Quadcopter için 4 Kanal / 6 Kanal Verici Alıcı | Rc Helikopter | Arduino Kullanan Rc Uçak: Bir Rc araba çalıştırmak için | Quadcopter | dron | RC uçak | RC tekne, her zaman bir alıcı ve vericiye ihtiyacımız var, RC QUADCOPTER için 6 kanallı bir verici ve alıcıya ihtiyacımız olduğunu ve bu tür TX ve RX'in çok maliyetli olduğunu varsayalım, bu yüzden bir tane yapacağız
PS2 Kablosuz Uzaktan Kumanda ile Robotik Araç Kiti Montajı ve Kontrolü: 6 Adım
PS2 Kablosuz Uzaktan Kumanda ile Robotik Araç Kiti Montajı ve Kontrolü: Bu proje Robotik dünyasındaki temel adımlar ile ilgilidir, 4WD Robotik araç kitini monte etmeyi, üzerine donanım yerleştirmeyi ve kablosuz PS2 uzaktan kumanda ile kontrol etmeyi öğreneceksiniz
Eskate veya Hydrofoil için Arduino Tabanlı Uzaktan Kumanda: 5 Adım (Resimli)
Eskate veya Hydrofoil için Arduino Tabanlı Uzaktan Kumanda: Bu talimat, ihtiyacınız olan tüm kod ve donanımı içeren bir eskate veya elektrikli hidrofil ile kullanmak için fiziksel bir uzaktan kumandayı nasıl oluşturacağınızı gösterecektir. Çok fazla lehimleme var, ancak yapması da eğlenceli. Uzaktan kumanda ne yapabilir? Ortak
Xfinity HTPC Kablosuz Uzaktan Kumanda: 5 Adım
Xfinity HTPC Kablosuz Uzaktan Kumanda: Bu eğitici, bir Xfinity uzaktan kumandadan nasıl sinyal alacağınızı ve ardından sinyalini kablosuz klavye olarak nasıl kullanacağınızı gösterecektir. Arduino nano'm yoktu, bu yüzden seri verileri bir tuş vuruşuna dönüştürmek için bir python betiği yazmak zorunda kaldım. Ben de Ard'ı kullandım