Sisukord:
Video: Maagiline nupp 4k: 20USD BMPCC 4k (või 6k) juhtmevaba kaugjuhtimispult: 4 sammu (piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:46
Paljud inimesed on palunud mul jagada mõningaid üksikasju oma traadita kontrolleri kohta BMPCC4k jaoks. Enamik küsimusi oli bluetooth -juhtimise kohta, nii et mainin selle kohta mõned üksikasjad. Eeldan, et olete ESP32 Arduino keskkonnaga tuttav.
See kaugjuhtimispuldi versioon saab Bluetoothi kaudu juhtida kaamera salvestamist, fookust ja ava. Vaadake videot. BMPCC4k Bluetoothi juhtimisjuhendi kohaselt on üsna lihtne lisada rohkem juhtimisfunktsioone. Põhimõtteliselt saab kaameras kõike juhtida, niipalju kui olen näinud.
Oleks lihtne samm lisada objekti kauguse mõõtmiseks LIDAR -moodul, et saaksite hankida mingisuguse autofookussüsteemi … Kuigi on küsitav, kas suudate piisavalt täpselt keskenduda teatud piirkondadele, nagu silmad jne …
UPDATE 2020: tegin versiooni 3.0. See põhineb vabalt pöörleval rattal, mis kasutab magnetkooderit. Samuti ühendatakse see minu fookusmootoriga, millest saab põhimõtteliselt teine bluetooth -seade (ESP32 toetab mitut Bluetooth -ühendust). Uus video näitab seda.
Kui soovite tellida versiooni 3, vaadake palun MagicButtoni veebisaiti
Tarvikud
Kõik ESP32 moodulid, millel on wifi ja bluetooth. Kasutasin TTGO micro32, sest see on pisike:
Fookusratas, iga potentsiomeeter sobiks. Kasutasin järgmist, sest see on pisike: https://www.aliexpress.com/item/32963061806.html? S … Sellel liigil on ülemise ja alumise piiri juures raskeid peatusi. Tulevases versioonis kasutan pöördkooderit. Nii ei hüppa fookus ega ava režiimi sisenedes ratta praeguse seadistuse juurde.
Rec/mode nupp. Kasutasin järgmist: https://www.aliexpress.com/item/32806223591.html? S…
Muud standardkomponendid, nagu takistid, mütsid,… (vt skeemi)
Samm: kood
Kasutan ESP32 WiFi -ühendust, et luua ühendus AP -režiimis teadaoleva võrguga või kui olen selles valdkonnas, saab sellest jaam (STA), millega saan ühenduse luua. Nii saan mooduli konfigureerida. Ma ei süvene wifi/veebilehe jaotise üksikasjadesse, võib -olla lisan selle hiljem.
ESP32 ühendub kaameraga ja muutub Bluetooth LE kliendiks. Arduino ESP32 raamistikus sisalduv bluetooth -kood ei tööta BMPCC4k -ga. Wakwak-koba on selle meie jaoks parandanud. Aitäh Wakwak-koba! Kasutasin siit BLE raamatukogu:
github.com/wakwak-koba/arduino-esp32
Sellegipoolest on see BLE libi versioon alles väljatöötamisel ja uusim versioon BLEUUID.cpp ei tundu praegu töötavat, seega võtke selle faili varasem "kinnitatud" versioon.
Ülejäänud osas on enamik minu bluetooth -koodist Arduino raamistikus sisalduvate BLE -näidete järgi palju:
Mõned BLE UUID ja muutuja määratlevad:
staatiline BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");
staatiline BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); staatiline BLEUUID DevInfoServiceControlUUID ("180A"); staatiline BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); staatiline BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); staatiline BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); staatiline BLEUUID CamModelcharUUID ("2A24"); staatiline BLEScan *pBLEScan = BLEDevice:: getScan (); staatiline BLEaadress *pServerAddress; staatiline BLEAdvertisedDevice* myDevice; staatiline BLERemoteCharacteristic *pControlCharacteristic; staatiline BLERemoteCharacteristic *pNotifCharacteristic; staatiline loogiline doConnect = 0; staatiline boolean ühendatud = 0; lenduvate ainete skaneerimine = 0; volatileuint32_t pinCode;
Skaneerimine ja peamine silmus:
klass MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("Leiti BLE reklaamitud seade:"); Serial.println (AdvertisedDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). võrdub (BlackMagic)) {Serial.print ("Leidsime meie seadme!"); AdvertisedDevice.getScan ()-> stop (); myDevice = uus BLEAdvertisedDevice (reklaamitud seade); doConnect = tõsi; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skaneerimine tehtud"); skaneerimine = vale; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! skaneerimine))) {Serial.println ("scaning …"); skaneerimine = tõsi; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Taimer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Oleme nüüd ühendatud BLE -serveriga."); ühendatud = tõene; } else {Serial.println ("Meil ei õnnestunud serveriga ühendust luua; me ei tee enam midagi."); } doConnect = vale; }}
Kaameraga ühendamine:
bool connectToServer () {
Serial.print ("Ühenduse loomine"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (uus MySecurity ()); BLESecurity *pSecurity = uus 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 (uus MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - ühendatud serveriga"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // SAADA KAAMERAMUDEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Seadme infoteenuse hankimine ebaõnnestus"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); ebaõnnestub; } Serial.println (" - Seadme teabe lugemine"); // Hankige viide karakteristikule BLE -serveri teenuses. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Kaamera mudeli leidmine ebaõnnestus"); Serial.println (CamModelcharUUID.toString (). C_str ()); ebaõnnestub; } // Tunnuse väärtuse lugemine. std:: stringi väärtus = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kaamera on"); Serial.println (value.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kaamera ei ole BMPCC4k"); ebaõnnestub; } // OTA KONTROLL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Kaamerateenuse hankimine ebaõnnestus"); Serial.println (ControlserviceUUID.toString (). C_str ()); ebaõnnestub; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MinuNimi.c_str (), MinuNimi.pikkus ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Juhtimisomaduste hankimine ebaõnnestus"); Serial.println (ControlcharUUID.toString (). C_str ()); ebaõnnestub; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - märguande tellimine"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (teate tagasikutsumine, vale); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) märgeOn, 2, true); } return true; ebaõnnestumine: pClient-> katkesta ühendus (); tagastama vale; }
Ühendatud/katkestatud tagasihelistamine:
klassi MyClientCallback: avalik BLEClientCallbacks {
void onConnect (BLEClient *pclient) {Serial.println ("Oleme ühendatud."); } void onDisconnect (BLEClient *pclient) {ühendatud = vale; pclient-> katkesta ühendus (); Serial.println ("Saime ühenduse katkestada."); }};
Pin -koodi osa:
Praeguses versioonis saan sisestada PIN -koodi veebiliidese kaudu, kuid need on wifi/veebilehe üksikasjad, mille võin hiljem lisada.
klassi MySecurity: avalik BLESecurityCallbacks
{uint32_t onPassKeyRequest () {Serial.println ("- PALUN SISESTA 6 DIGIT PIN-koodi (lõpeta 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')); tagasta pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "Parooli märguande number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Parool YES/NO number:%d", pass_key); vTaskDelay (5000); tagasipöördumine; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Turvalisus"); tagasipöördumine; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("paari olek ="); Serial.println (auth_cmpl.success); }};
BLE teatis:
Kaamera teavitab oma BLE kliente kõigist kaamera muudatustest, sealhulgas siis, kui kaamera alustab ja lõpetab salvestamise. See kood lülitab minu LED -i sisse, kui see alustab/lõpetab salvestamise.
staatiline tühine teadeCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t pikkus, bool isNotify) {// BMPCC4k BLE sõnumi vorming: // rec on is 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off is 255 9 0 0 10 1 1 2 0 0 64 0 2if (pikkus == 13 && pData [0] == 255 && pData [1] == 9 && pData [4] == 10 && pData [5] == 1) {if (pData [8] == 0) { recstatus = 0; } kui (pData [8] == 2) {recstatus = 1; }}}
2. etapp: koodi 2. osa
See on osa, mis tegelikult saadab käsklused kaamerale.
Salvestamine:
uint8_t kirje = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = VÄLJAS, 2 = SEES, [8] tühine kirje (boolean RecOn) {if (! RecOn) kirje [8] = 0; muu rekord [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) kirje, 16, true); }
Teravustamine:
Kaamera ootab 11 -bitist numbrit, mis ulatub lähedalt kuni kaugele. Soovitan siiski ADC väärtusele filtri panna, muidu võib fookus närviliselt väriseda.
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) {// üleminek 12 -bitiselt ADC -lt 11 -bitisele fookusväärtusele [8] = (uint8_t) (((val> > 1) & 0xFF)); fookus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fookus, 12, true); }
Ava:
Kaamera ootab 11 -bitist numbrit, ulatudes madalast kuni suure ava väärtuseni. Soovitan ADC väärtusele filtri panna, vastasel juhul võib ava väärtus närviliselt väriseda.
uint8_t ava = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid -ava (uint16_t val) {// üleminek 12 -bitiselt ADC -lt 11 -bitisele ava väärtusele [8] = (uint8_t) ((((val >> 1) & 0xFF)); ava [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) ava, 12, true); }
3. samm: vooluring
Lisasin oma vooluringi PDF -faili. Lisatud on ka mõned PCB pildid.
Tahvli toiteallikaks on mikro -USB.
Pärast trükkplaadi saamist otsustasin, et tahan juhtida RGB LED -i, nii et ühendasin kaks WS2812B järjestikku väljundiga "Button Led" (mis vajas PCB -l mõningaid juhtmepaiku). PCB -d olid 8 USD USA OSHPark.com -iga.
PCB -l on näha veel mõned ühendused, näiteks "adc", mida ma ei kasuta ja mis eemaldati lisatud skeemidelt. Plaan oli varem kasutada välist fookusratast, kuid praegu olen väikese pöidlarattaga täiesti rahul.
4. samm: järeldus
Loodan, et see aitas.
Mul on mõned tulevased uuendused meeles, näiteks pöörleva kodeerija kasutamine ilma peatusteta. Selleks on vaja, et kontroller saaks kaamerast fookuse või ava praeguse väärtuse ja jätkaks sealt. Tõenäoliselt tuleb funktsiooni "teate kutsumine" värskendada.
PCB vajab värskendamist, et anda WS2812B RGB LED -ide signaalide nõuetekohane edastamine.
Kulutasin selle töö tegemisele palju (loooot) aega, eriti BLE osa. Kui see aitas teid ja soovite mulle jooki osta, on see väga teretulnud:) See on Paypali annetuse link:
Soovitan:
Ujuv nutikas maagiline peegel vanast sülearvutist Alexa häältuvastusega: 6 sammu (piltidega)
Ujuv nutikas maagiline peegel vanast sülearvutist Alexa häältuvastusega: registreeruge minu kursusele „Elektroonika lühidalt” siin: https://www.udemy.com/electronics-in-a-nutshell/?couponCode=TINKERSPARK Vaadake ka minu lehte YouTube'i kanal siit, et saada rohkem projekte ja elektroonikaõpetusi: https://www.youtube.com/channel/UCelOO
"Maagiline" küülik mütsiga fototrikk: 7 sammu (koos piltidega)
"Maagiline" küülik mütsiga fototrikk: Nii et siin on " maagia " trikk. Jääst valmistatud jänes istub mustkunstniku mütsi peal. Jääjänes sulab ära ja on igaveseks kadunud … või on see nii. Kuna mustkunstniku mütsi sees selgub, et küüliku foto on justkui
LittleBits maagiline marmorist sorteerimismasin: 11 sammu (piltidega)
LittleBits maagiline marmorist sorteerimismasin: kas olete kunagi tahtnud marmorit sorteerida? Siis saate selle masina ehitada. Teil pole enam kunagi vaja marmorikotti läbi segada! See on maagiline marmorist sorteerimismasin, mis kasutab Adafruit, TCS34725 tüüpi värvisensorit ja Leonardo Arduino firmast
Maagiline muusikaline kell: 8 sammu (piltidega)
Maagiline muusikaline kell: Me kõik armastame muusikalisi kellasid. Heli paneb meid unistama ja on hea tunne see üles keerata ja lasta tal mõnusaid helisid esitada. Seal on veebisait, kus on palju neid mehaanilisi imesid, mis lubavad mul unistada. Kuid muusikakellad on kallid ja mitte eriti paindlikud
Arduino -põhine kaugjuhtimispult Eskate või tiiburlaeva jaoks: 5 sammu (piltidega)
Arduino -põhine kaugjuhtimispult Eskate või tiiburlaeva jaoks: see juhend näitab teile, kuidas ehitada füüsiline kaugjuhtimispult eskate või elektrilise tiiburiga, sealhulgas kogu vajalik kood ja riistvara. Seal on palju jootmist, kuid seda on ka lõbus teha. Mida saab kaugjuhtimispult teha? Kaas