Mundarija:
Video: Sehrli tugma 4k: 20USD BMPCC 4k (yoki 6k) simsiz masofadan boshqarish pulti: 4 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:23
Ko'p odamlar BMPCC4k uchun simsiz boshqaruvchim haqida ba'zi tafsilotlarni aytib berishimni so'rashdi. Ko'p savollar bluetooth boshqaruviga tegishli edi, shuning uchun men bu haqda bir nechta tafsilotlarni aytib o'taman. Menimcha, siz ESP32 Arduino muhiti bilan tanishsiz.
Masofadan boshqarish pultining bu versiyasi bluetooth orqali kameraning yozilishini, fokusini va diafragmasini boshqarishi mumkin. Videoni tomosha qiling. BMPCC4k bluetooth boshqaruv qo'llanmasiga ko'ra, qo'shimcha boshqaruv funktsiyalarini qo'shish juda oson. Men ko'rganimdek, kameradagi hamma narsani boshqarish mumkin.
Ob'ektning masofasini o'lchash uchun LIDAR modulini qo'shish oson bo'lar edi, shuning uchun siz avtofokus tizimiga ega bo'lishingiz mumkin … Agar siz ko'zlar va hokazo kabi aniq sohalarga etarlicha aniq e'tibor qarata olsangiz, bu shubhali.
UPDATE 2020: Men 3.0 versiyasini yaratdim. U magnit kodlovchi yordamida erkin aylanadigan g'ildirakka asoslangan. U, shuningdek, ikkinchi bluetooth qurilmasiga aylanadigan (ESP32 bir nechta bluetooth ulanishlarini qo'llab -quvvatlaydigan) asosiy fokusli motorimga ulanadi. Yangi video buni ko'rsatadi.
Agar siz 3 -versiyaga buyurtma bermoqchi bo'lsangiz, iltimos MagicButton veb -saytiga qarang
Ta'minotlar
Wi -Fi va bluetooth bilan har qanday ESP32 moduli. Men TTGO micro32-dan foydalandim, chunki u kichkina:
Fokus g'ildiragi, har qanday potansiyometr. Men kichkina bo'lgani uchun quyidagilarni qo'lladim: https://www.aliexpress.com/item/32963061806.html? S… Bu tur yuqori va pastki chegaralarda qiyin to'xtash joylariga ega. Kelgusi versiyada men aylanadigan kodlovchi ishlataman. Shunday qilib, men rejimga kirganimda fokus yoki diafragma g'ildirakning joriy holatiga o'tmaydi.
Qayta tiklash rejimi tugmasi. Men quyidagilarni ishlatardim: https://www.aliexpress.com/item/32806223591.html? S …
Rezistorlar, qopqoqlar kabi boshqa standart komponentlar … (sxemaga qarang)
1 -qadam: Kod
Men ESP32 -ning Wi -Fi imkoniyatidan AP rejimida ma'lum tarmoqqa ulanish uchun foydalanaman, yoki men dalada bo'lganimda, u ulanadigan stantsiyaga (STA) aylanadi. Shunday qilib, men modulni sozlashim mumkin. Men Wi -Fi/veb -sahifa bo'limiga batafsil to'xtalmayman, buni keyingi bosqichda qo'shishim mumkin.
ESP32 kameraga ulanadi va Bluetooth LE mijoziga aylanadi. Arduino ESP32 tizimiga kiritilgan bluetooth kodi BMPCC4k bilan ishlamaydi. Vakvak-koba buni biz uchun tuzatdi. Rahmat sizga Vakvak-koba! Men bu erdan BLE kutubxonasidan foydalandim:
github.com/wakwak-koba/arduino-esp32
Shunga qaramay, BLE lib versiyasi hali ishlab chiqilmagan va BLEUUID.cpp -ning so'nggi versiyasi hozircha ishlamayapti, shuning uchun ushbu faylning oldingi "tasdiqlangan" versiyasini oling.
Qolganlari uchun, mening bluetooth kodimning ko'p qismi Arduino tizimiga kiritilgan BLE misollariga ko'ra juda ko'p:
Ba'zi BLE UUID va o'zgaruvchilar quyidagilarni aniqlaydi:
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 BLEAddress *pServerAddress; statik BLEAdvertisedDevice* myDevice; statik BLERemoteCharacteristic *pControlCharacteristic; statik BLERemoteCharacteristic *pNotifCharacteristic; statik boolean doConnect = 0; statik boolean ulangan = 0; uchuvchi asboblarni skanerlash = 0; volatileuint32_t pinCode;
Tekshirish va asosiy tsikl:
MyAdvertisedDeviceCallbacks klassi: ommaviy BLEAdvertisedDeviceCallbacks {
void onResult (BLEAdvertisedDevice reklamaedDevice) {Serial.print ("BLE e'lon qilingan qurilma topildi:"); Serial.println (adsedDevice.toString (). C_str ()); if (adsedDevice.haveServiceUUID () && adsedDevice.getServiceUUID (). teng (BlackMagic)) {Serial.print ("Qurilmamiz topildi!"); reklama qilinganDevice.getScan ()-> to'xtatish (); myDevice = yangi BLEAdvertisedDevice (adsedDevice); doConnect = rost; }}}; statik bo'shliqni tekshirishCompleteCB (BLEScanResults scanResults) {Serial.println ("skanerlash tugallandi"); skanerlash = noto'g'ri; } void loop (void) {if (! ulangan && ((uint32_t) (millis () - Taymer)> BLE_RESCAN_TIME || (! skanerlash))) {Serial.println ("skanerlash …"); skanerlash = rost; pBLEScan-> boshlash (BLE_SCAN_TIME, scanCompleteCB); Taymer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Biz hozir BLE Serverga ulandik."); ulangan = rost; } else {Serial.println ("Biz serverga ulana olmadik; bundan boshqa hech narsa qilmaymiz."); } doConnect = noto'g'ri; }}
Kameraga ulanish:
bool connectToServer () {
Serial.print ("Aloqani yaratish"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (yangi MySecurity ()); BLESecurity *pSecurity = yangi 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 (yangi MyClientCallback ()); pClient-> ulanish (myDevice); Serial.println (" - Serverga ulangan"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN KAMERA MODELI BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Qurilma haqida ma'lumot olish mumkin bo'lmadi"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); muvaffaqiyatsiz bo'lishi kerak; } Serial.println (" - Qurilma ma'lumotlarini o'qish"); // Masofaviy BLE server xizmatidagi xarakteristikaga havola oling. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kamera modelini topib bo'lmadi"); Serial.println (CamModelcharUUID.toString (). C_str ()); muvaffaqiyatsizlikka uchradi; } // Xarakteristikaning qiymatini o'qing. std:: string qiymati = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera bu"); Serial.println (qiymat.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kamera BMPCC4k emas"); muvaffaqiyatsizlikka uchradi; } // OBTAIN NAZORAT pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Kamera xizmatidan foydalanib bo'lmadi"); Serial.println (ControlserviceUUID.toString (). C_str ()); muvaffaqiyatsizlikka uchradi; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Boshqaruv xarakteristikasi olinmadi"); Serial.println (ControlcharUUID.toString (). C_str ()); muvaffaqiyatsizlikka uchradi; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - xabarnomaga obuna bo'lish"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) ko'rsatkichiOn, 2, rost); } rost qaytarish; muvaffaqiyatsiz: pClient-> ajratish (); noto'g'ri qaytarish; }
Qayta ulangan/uzilgan:
MyClientCallback klassi: ochiq BLEClientCallbacks {
void onConnect (BLEClient *pclient) {Serial.println ("Biz bog'langanmiz."); } void onDisconnect (BLEClient *pclient) {ulangan = noto'g'ri; pclient-> ajratish (); Serial.println ("Biz aloqani uzdik."); }};
PIN kod qismi:
Mening joriy versiyamda veb -interfeys orqali pin kodini kiritishim mumkin, lekin bu keyinroq qo'shishim mumkin bo'lgan wifi/veb -sahifa tafsilotlari.
MySecurity klassi: ommaviy BLESecurityCallbacks
{uint32_t onPassKeyRequest () {Serial.println ("- ILTIMOSI 6 Raqamli PIN kodni kiriting (ENTER bilan tugaydi):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); agar (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Ketma -ket chop etish (ch); }} vaqt ((ch! = '\ n')); pinCode -ni qaytarish; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Parolni xabarnoma raqami:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Yo'q, kalit raqami:%d", pass_key); vTaskDelay (5000); qaytish; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Xavfsizlik so'rovi"); qaytish; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("juftlik holati ="); Serial.println (auth_cmpl.success); }};
BLE xabarnomasi:
Kamera o'z BLE mijozlariga kameraning har qanday o'zgarishi, shu jumladan, kamera yozishni boshlagan va to'xtatgan paytda xabar beradi. Bu kod yozishni boshlaganda/to'xtatganda LEDni o'zgartiradi.
statik void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE xabar formati: // 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 (uzunlik == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 va& pData [5] == 1) {if (pData [8] == 0) { holat = 0; } if (pData [8] == 2) {recstatus = 1; }}}
2 -qadam: Kod 2 -qism
Bu kameraga buyruqlarni yuboradigan qism.
Yozish:
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; else yozish [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) yozuvi, 16, rost); }
Fokuslash:
Kamera 11 bitli raqamni kutadi, u fokusdan yaqingacha. Men sizning ADC qiymatingizga filtr qo'yishni maslahat beraman, aks holda diqqat asabiylashishi mumkin.
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) {// 12 bitli ADC qiymatidan 11 bitli fokus qiymatiga [8] = (uint8_t) (((val> > 1) & 0xFF)); diqqat [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, rost); }
Diafragma:
Kamera diafragmaning pastdan balandgacha bo'lgan 11 bitli raqamini kutadi. Men sizning ADC qiymatingizga filtr qo'yishni maslahat beraman, aks holda diafragma qiymati asabiylashishi mumkin.
uint8_t diafragma = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid diafragma (uint16_t val) {// 12 bitli ADC qiymatidan diafragmaning 11 bitli diafragmasiga [8] = (uint8_t) (((val >> 1)) Va 0xFF)); diafragma [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) diafragma, 12, rost); }
3 -qadam: O'chirish davri
Men o'z davramning PDF -ni biriktirdim. PCB ning ba'zi rasmlari ham ilova qilingan.
Kengash micro USB bilan quvvatlanadi.
PCBni olganimdan so'ng, men RGB LEDini boshqarishni xohladim, shuning uchun ikkita WS2812B ni "tugmachali LED" chiqishiga uladim (bu PCB uchun simli yamaqlar kerak edi). PCH OSHPark.com bilan 8USD edi.
Siz PCB -da "adc" kabi boshqa ulanishlarni ko'rishingiz mumkin, va ular biriktirilgan sxemalardan olib tashlangan. Reja o'tmishda tashqi fokus g'ildiragidan foydalanish edi, lekin men hozirda bosh barmog'imdan juda mamnunman.
4 -qadam: Xulosa
Umid qilamanki, bu yordam berdi.
Menda kelajakda ba'zi yangilanishlar bor, masalan, aylanuvchi kodlovchi yordamida to'xtovsiz. Bu tekshiruvchidan kameradan fokus yoki diafragmaning joriy qiymatini olishini va u erdan davom ettirishini talab qiladi. Buning uchun "notifyCallback" funksiyasini yangilash kerak.
PCB WS2812B RGB LEDlari signallarini to'g'ri etkazib berish uchun yangilanishga muhtoj.
Men bu ishni, ayniqsa BLE qismini yaratish uchun ko'p vaqt sarfladim. Agar bu sizga yordam bergan bo'lsa va siz menga ichimlik sotib olmoqchi bo'lsangiz, bu juda qadrlanadi:) Bu PayPal -ning xayriya havolasi:
Tavsiya:
LoRa asosidagi masofadan boshqarish pulti - Katta masofadan asboblarni boshqarish: 8 qadam
LoRa asosidagi masofadan boshqarish pulti | Katta masofadan asboblarni boshqarish: Hey, nima bo'ldi, bolalar! Bu loyihada biz LEDlar, motorlar kabi turli xil asboblarni boshqarish uchun ishlatilishi mumkin bo'lgan masofadan boshqarish pultini yaratmoqchimiz yoki agar biz kundalik hayotimiz haqida gapiradigan bo'lsak, biz o'z uy dasturchimizni boshqaramiz.
IRduino: Arduino masofadan boshqarish pulti - yo'qolgan masofadan boshqarish pultiga taqlid: 6 qadam
IRduino: Arduino masofadan boshqarish pulti - Yo'qotilgan masofadan boshqarish pultiga taqlid qiling: Agar siz televizor yoki DVD pleer uchun masofadan boshqarish pultini yo'qotib qo'ysangiz, qurilmaning o'zi tugmachalarini bosib o'tish, topish va ulardan foydalanish qanchalik achinarli ekanligini bilasiz. Ba'zida bu tugmalar masofadan boshqarish pulti bilan bir xil funktsiyalarni taklif qilmaydi. Qabul qilish
Masofadan boshqarish pulti yoki shlyuzli IoT RC avtomobili: 8 qadam (rasmlar bilan)
Masofadan boshqarish pulti yoki shlyuzli IoT RC avtomashinasi: Bir -biriga bog'liq bo'lmagan loyiha uchun, men uyimda MiLight aqlli lampalari va masofadan boshqarish pultlari bilan gaplashish uchun Arduino kodini yozgan edim. Men sinov uchun kichik RC avtomashinasini yasashga qaror qildim
Taymer funktsiyasi bilan televizorni masofadan boshqarish pulti yordamida uy jihozlarini qanday boshqarish mumkin: 7 qadam (rasmlar bilan)
Uy asbob -uskunalarini masofadan boshqarish pulti bilan taymer funktsiyasi yordamida qanday boshqarish mumkin: Iste'mol bozoriga 25 yil kirganidan keyin ham, infraqizil aloqa so'nggi kunlarda juda dolzarb bo'lib qolmoqda. Bu sizning 55 dyuymli 4K televizoringiz yoki avtomobilingizning ovoz tizimidan qat'i nazar, hamma narsaga javob berish uchun IQ masofadan boshqarish pulti kerak
Oddiy masofadan boshqarish pulti to'rt kanalli RC o'yinchoqli masofadan boshqarish pultiga aylantirildi: 4 qadam
Oddiy masofadan boshqarish pulti to'rt kanalli RC o'yinchoqli masofadan boshqarish pultiga aylantirildi: 如何 通用 遥控 器 套件 的 的.方法 非常 简单。 只需