Мазмуну:

Magic Button 4k: 20USD BMPCC 4k (же 6k) Wireless Remote Control: 4 Steps (Сүрөттөр менен)
Magic Button 4k: 20USD BMPCC 4k (же 6k) Wireless Remote Control: 4 Steps (Сүрөттөр менен)

Video: Magic Button 4k: 20USD BMPCC 4k (же 6k) Wireless Remote Control: 4 Steps (Сүрөттөр менен)

Video: Magic Button 4k: 20USD BMPCC 4k (же 6k) Wireless Remote Control: 4 Steps (Сүрөттөр менен)
Video: MagicButton4k 2.0: super handy bmpcc 4k bluetooth remote, with FF motor control 2024, Ноябрь
Anonim
Image
Image

Көп адамдар BMPCC4k үчүн зымсыз контроллерим жөнүндө кээ бир деталдар менен бөлүшүүнү суранышты. Көпчүлүк суроолор bluetooth көзөмөлү жөнүндө болгон, ошондуктан мен бул тууралуу бир нече деталдарды айтам. Сиз ESP32 Arduino чөйрөсү менен таанышсыз деп ойлойм.

Алыстан башкаруунун бул версиясы bluetooth аркылуу камеранын жазуусун, фокусун жана диафрагмасын башкара алат. Видеону карап көрүңүз. BMPCC4kтин bluetooth башкаруу колдонмосуна ылайык, көбүрөөк башкаруу функцияларын кошуу оңой. Негизинен мен көргөндөй камеранын ичиндеги бардык нерсени көзөмөлдөсө болот.

LIDAR модулун предметтин алыстыгын өлчөө үчүн кошуу оңой кадам болмок, андыктан сиз кандайдыр бир автофокус тутумун ала аласыз … Көздүн ж.б сыяктуу белгилүү бир аймактарга жетишерлик так фокусту ала алсаңыз, бул күмөн жаратат …

UPDATE 2020: Мен 3.0 версиясын жасадым. Бул магниттик коддогучту колдонгон эркин айлануучу дөңгөлөккө негизделген. Ал ошондой эле менин кийинки фокус моторума туташат, ал негизинен экинчи Bluetooth түзмөгү болуп калат (ESP32 бир нече Bluetooth байланышын колдойт). Жаңы видео муну көрсөтүп турат.

Эгерде сиз 3 -версияга заказ кылгыңыз келсе, анда MagicButton веб -сайтын карап көрүңүз

Жабдуулар

WiFi жана bluetooth менен каалаган ESP32 модулу. Мен TTGO micro32ди колдондум, анткени ал кичинекей:

Фокустук дөңгөлөк, каалаган потенциометр болмок. Мен кичинекей болгондуктан, төмөнкүлөрдү колдондум: https://www.aliexpress.com/item/32963061806.html? S… Бул түрдүн жогорку жана төмөнкү чек араларында оор токтоолору бар. Келечектеги версияда мен айлануучу коддогучту колдоном. Ошентип, мен режимге киргенде фокус же диафрагма учурдагы дөңгөлөк параметрлерине "секирбейт".

Rec/mode баскычы. Мен төмөнкүлөрдү колдондум: https://www.aliexpress.com/item/32806223591.html? S…

Башка стандарттык компоненттер, мисалы, резисторлор, капкактар, … (схеманы карагыла)

1 -кадам: Код

Мен ESP32дин WiFi мүмкүнчүлүгүн AP режиминде белгилүү тармакка туташуу үчүн колдоном, же мен талаада жүргөндө, мен туташа турган станцияга (СТА) айланат. Ошентип мен модулду конфигурациялай алам. Мен wifi/webpage бөлүмүн майда -чүйдөсүнө чейин түшүндүрбөйм, муну кийинки этапта кошуп коюшум мүмкүн.

ESP32 камерага туташып, Bluetooth LE кардары болуп калат. Arduino ESP32 алкагына кирген Bluetooth коду BMPCC4k менен иштебейт. Ваквак-коба аны биз үчүн оңдоп койду. Рахмат Ваквак-коба! Мен бул жерден BLE китепканасын колдондум:

github.com/wakwak-koba/arduino-esp32

Ошого карабастан, BLE libдин бул версиясы дагы эле иштелип жатат жана BLEUUID.cppтин акыркы версиясы азыр иштебей жатат, андыктан бул файлдын мурунку "текшерилген" версиясын алыңыз.

Калганында, менин bluetooth кодумдун көбү Arduino алкагына кирген BLE мисалдарына ылайык келет:

Кээ бир BLE UUID жана өзгөрмө аныктайт:

статикалык BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");

статикалык BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); статикалык BLEUUID DevInfoServiceControlUUID ("180A"); статикалык BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); статикалык BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); статикалык BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); статикалык BLEUUID CamModelcharUUID ("2A24"); статикалык BLEScan *pBLEScan = BLEDevice:: getScan (); статикалык BLEAddress *pServerAddress; статикалык BLEAdvertisedDevice* myDevice; статикалык BLERemoteCharacteristic *pControlCharacteristic; статикалык BLERemoteCharacteristic *pNotifCharacteristic; статикалык логикалык doConnect = 0; статикалык логикалык туташкан = 0; volatilebool сканерлөө = 0; volatileuint32_t pinCode;

Сканерлөө жана негизги цикл:

класс MyAdvertisedDeviceCallbacks: коомдук BLEAdvertisedDeviceCallbacks {

void onResult (BLEAdvertisedDevice adsedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (adsedDevice.toString (). C_str ()); if (adsedDevice.haveServiceUUID () && adsedDevice.getServiceUUID (). барабар (BlackMagic)) {Serial.print ("Биздин түзмөк табылды!"); adsedDevice.getScan ()-> токтотуу (); myDevice = жаңы BLEAdvertisedDevice (adsedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("сканерленди"); сканерлөө = жалган; } void loop (void) {if (! туташкан && ((uint32_t) (миллис () - Таймер)> BLE_RESCAN_TIME || (! сканерлөө))) {Serial.println ("скандоо…"); сканерлөө = чындык; pBLEScan-> баштоо (BLE_SCAN_TIME, scanCompleteCB); Таймер = миллис (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Биз азыр BLE Серверине туташтык."); туташкан = чындык; } else {Serial.println ("Биз серверге туташа алган жокпуз; мындан башка эч нерсе кыла албайбыз."); } doConnect = false; }}

Камерага туташуу:

bool connectToServer () {

Serial.print ("Байланыш түзүү"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (жаңы MySecurity ()); BLESecurity *pSecurity = жаңы 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 ()); pClient-> туташтыруу (myDevice); Serial.println (" - Серверге туташты"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN CAMERA MODEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Түзмөк маалымат кызматы алынбай калды"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); ийгиликке жетүү; } Serial.println (" - Түзмөктүн маалыматын окуу"); // Алыскы BLE серверинин кызматындагы мүнөздөмөгө шилтеме алыңыз. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Камера модели табылган жок"); Serial.println (CamModelcharUUID.toString (). C_str ()); ийгиликке жетүү; } // Мүнөздөмөнүн маанисин окуңуз. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Камера"); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Камера BMPCC4k эмес"); ийгиликке жетүү; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Камера кызматы алынбай калды"); Serial.println (ControlserviceUUID.toString (). C_str ()); ийгиликке жетүү; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Башкаруу мүнөздөмөсү алынбай калды"); Serial.println (ControlcharUUID.toString (). C_str ()); ийгиликке жетүү; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - билдирүүгө жазылуу"); const uint8_t indicationOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902)))-> writeValue ((uint8_t*) көрсөткүчүOn, 2, true); } true true; ийгиликсиз: pClient-> disconnect (); жалган кайтаруу; }

Байланышкан/ажыратылган кайра чалуу:

MyClientCallback класс: ачык BLEClientCallbacks {

void onConnect (BLEClient *pclient) {Serial.println ("Биз туташканбыз."); } void onDisconnect (BLEClient *pclient) {туташкан = жалган; pclient-> ажыратуу (); Serial.println ("Биз ажыратылдык."); }};

PIN коддун бөлүгү:

Учурдагы версиямда мен пин -кодду веб -интерфейс аркылуу киргизе алам, бирок бул Wi -Fi/веб -баракчанын маалыматы, кийинчерээк кошо алам.

MySecurity классы: коомдук BLESecurityCallbacks

{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE 6 DIGIT PIN (end with ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} while ((ch! = '\ n')); pinCode кайтаруу; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Өткөрүүчү билдирменин номери:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Өткөөл ачкыч Ооба/Жок номер:%d", pass_key); vTaskDelay (5000); кайтаруу; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Коопсуздук сурамы"); кайтаруу; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};

BLE билдирүүсү:

Камера BLE кардарларына камеранын өзгөрүүсү жөнүндө, анын ичинде камера жазууну баштаганда жана токтоткондо кабарлайт. Бул код жазууну баштаганда/токтоткондо менин LEDди алмаштырат.

static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE билдирүүсүнүн форматы: // rec on 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 (length == 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; }}}

2 -кадам: Код 2 -бөлүк

Бул камерага буйруктарды жөнөтүүчү бөлүк.

Жаздыруу:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = OFF, 2 = ON, [8] void Record (логикалык RecOn) {if (! RecOn) record [8] = 0; else рекорд [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) жазуу, 16, туура); }

Фокус:

Камера жакынкыдан алыскы фокуска чейин 11 битти күтөт. Мен сиздин ADC маанисиңизге чыпка коюуну кеңеш кылам, антпесе көңүл фокустук болуп калышы мүмкүн.

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 бит ADC маанисинен 11 бит фокус мааниси фокусуна [8] = (uint8_t) (((val> > 1) & 0xFF)); фокус [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) фокус, 12, туура); }

Диафрагма:

Камера төмөндөн жогорку диафрагмага чейин 11 битти күтөт. Мен ADC маанисиңизге чыпка коюуну сунуштайм, антпесе диафрагманын мааниси нервтенип кетиши мүмкүн.

uint8_t диафрагма = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// 12 бит ADC маанисинен 11bit диафрагма диафрагмасына өтөт [8] = (uint8_t) (((val >> 1)) & 0xFF)); диафрагма [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) диафрагма, 12, чындык); }

3 -кадам: Circuit

Circuit
Circuit

Мен тегерегимдин PDF файлын тиркеп койдум. ПХБнын кээ бир сүрөттөрү да тиркелет.

Такта микро USB менен иштейт.

ПХБны алгандан кийин, мен RGB светодиодун айдагым келди деп чечтим, ошондуктан эки WS2812B сериясын "Button Led" чыгаруусуна туташтырдым (бул ПХБда кээ бир зым тактар керек болчу). ПХБнын OSHPark.com менен 8USD болгон.

Сиз PCBде мен колдонбогон жана тиркелген схемалардан алынып салынган "adc" сыяктуу дагы башка байланыштарды көрө аласыз. Планда мурун тышкы фокустук дөңгөлөктү колдонуу болгон, бирок мен кичинекей бармак дөңгөлөгүнө абдан кубанычтамын.

4 -кадам: Жыйынтык

Бул жардам берди деп үмүттөнөм.

Менде келечектеги жаңыртуулар бар, мисалы, токтобостон айлануучу коддогучту колдонуу. Бул контроллерден фокустун же диафрагманын учурдагы маанисин камерадан алып, ошол жерден улантуусун талап кылат. Балким, "notifyCallback" функциясын жаңыртуу керек.

PCB WS2812B RGB LEDлеринин сигналдарын туура берүү үчүн жаңыртууга муктаж.

Мен бул чыгарманы, айрыкча BLE бөлүгүн жасоого көп убакыт бөлдүм. Эгерде бул сизге жардам берсе жана сиз мага суусундук сатып алууну кааласаңыз, бул абдан бааланат:) Бул Paypal тартуунун шилтемеси:

Сунушталууда: