Tartalomjegyzék:
Videó: Magic Button 4k: a 20USD BMPCC 4k (vagy 6k) vezeték nélküli távirányító: 4 lépés (képekkel)
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:39
Sokan kérték, hogy osszak meg néhány részletet a BMPCC4k vezeték nélküli vezérlőjéről. A legtöbb kérdés a bluetooth vezérlésre vonatkozott, ezért megemlítek néhány részletet ezzel kapcsolatban. Feltételezem, hogy ismeri az ESP32 Arduino környezetet.
A távirányító ezen verziója Bluetooth -on keresztül vezérelheti a fényképezőgép felvételét, fókuszát és rekeszét. Nézd meg a videót. A BMPCC4k bluetooth vezérlő kézikönyve szerint nagyon könnyű több vezérlőfunkciót hozzáadni. A kamerában alapvetően bármit lehet vezérelni, amennyire én láttam.
Könnyű lépés lenne egy LIDAR modul hozzáadása a téma távolságának méréséhez, így valamilyen autofókusz rendszert kaphat … Bár kérdéses, hogy képes -e elég pontosan fókuszálni bizonyos területekre, például a szemekre stb.
FRISSÍTÉS 2020: Megcsináltam a 3.0 -s verziót. Ez egy szabadon forgó kerékre épül, mágneses kódoló segítségével. Csatlakozik a követési fókuszmotoromhoz is, amely alapvetően egy második Bluetooth -eszközzé válik (az ESP32 több Bluetooth -kapcsolatot támogat). Az új videó ezt bizonyítja.
Ha szeretné megrendelni a 3 -as verziót, nézze meg a MagicButton weboldalát
Kellékek
Bármilyen ESP32 modul wifivel és bluetooth -al. A TTGO micro32-t használtam, mert apró:
Egy fókuszkerék, bármilyen potenciométer megteszi. Az alábbiakat használtam, mert kicsi: https://www.aliexpress.com/item/32963061806.html? S… Ez a fajta keményen megáll a felső és az alsó határnál. Egy későbbi verzióban forgó kódolót fogok használni. Így a fókusz vagy a rekesz nem "ugrik" az aktuális kerékbeállításra, amikor módba lépek.
Rec/mód gomb. A következőt használtam: https://www.aliexpress.com/item/32806223591.html? S…
Egyéb szabványos alkatrészek, például ellenállások, kupakok,… (lásd az ábrát)
1. lépés: A kód
Az ESP32 wifi -képességét használva csatlakozom egy ismert hálózathoz AP módban, vagy ha a terepen vagyok, akkor ez lesz az állomás (STA), amelyhez csatlakozhatok. Így konfigurálhatom a modult. Nem részletezem a wifi/weboldal részt, lehet, hogy ezt később hozzáadom.
Az ESP32 csatlakozik a fényképezőgéphez, és Bluetooth LE ügyfélgé válik. Az Arduino ESP32 keretrendszerébe tartozó bluetooth kód nem működik a BMPCC4k -vel. A Wakwak-koba javította nekünk. Köszönöm Wakwak-koba! Innen használtam a BLE könyvtárat:
github.com/wakwak-koba/arduino-esp32
Ennek ellenére a BLE lib verziója még fejlesztés alatt áll, és úgy tűnik, hogy a BLEUUID.cpp legújabb verziója jelenleg nem működik, ezért vegye a fájl korábbi "ellenőrzött" verzióját.
A többiben a legtöbb Bluetooth -kódom sok az Arduino keretrendszerben szereplő BLE példák szerint:
Néhány BLE UUID és változó meghatározza:
statikus BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");
statikus BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statikus BLEUUID DevInfoServiceControlUUID ("180A"); statikus BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statikus BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statikus BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statikus BLEUUID CamModelcharUUID ("2A24"); statikus BLEScan *pBLEScan = BLEDevice:: getScan (); statikus BLEAddress *pServerAddress; statikus BLEAdvertisedDevice* myDevice; statikus BLERemoteCharacteristic *pControlCharacteristic; statikus BLERemoteCharacteristic *pNotifCharacteristic; statikus logikai doConnect = 0; statikus logikai összefüggés = 0; volatilebool szkennelés = 0; volatileuint32_t pinCode;
A szkennelés és a fő hurok:
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult (BLEAdvertisedDevice AdvertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (hirdetettDevice.toString (). C_str ()); if (AdvertisedDevice.haveServiceUUID () && AdvertisedDevice.getServiceUUID (). egyenlő (BlackMagic)) {Serial.print ("Megtaláltuk eszközünket!"); AdvertisedDevice.getScan ()-> stop (); myDevice = új BLEAdvertisedDevice (hirdetett eszköz); doConnect = igaz; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("szkennelés kész"); szkennelés = hamis; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! szkennelés))) {Serial.println ("szkennelés…"); szkennelés = igaz; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Időzítő = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Most csatlakoztunk a BLE szerverhez."); csatlakoztatva = igaz; } else {Serial.println ("Nem sikerült csatlakozni a szerverhez; nincs más dolgunk."); } doConnect = hamis; }}
Csatlakozás a kamerához:
bool connectToServer () {
Serial.print ("Kapcsolat létrehozása"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (új MySecurity ()); BLESecurity *pSecurity = új 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 (új MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Csatlakoztatva a szerverhez"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // KAMERAModell beszerzése BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Nem sikerült lekérni az eszközinformációs szolgáltatást"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); goto fail; } Serial.println (" - Eszközadatok olvasása"); // Hivatkozás beszerzése a karakterisztikára a távoli BLE szerver szolgáltatásában. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print (" - Nem sikerült megtalálni a kamera modelljét"); Serial.println (CamModelcharUUID.toString (). C_str ()); goto fail; } // Olvassa el a jellemző értékét. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("A kamera"); Soros.println (érték.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - A kamera nem BMPCC4k"); goto fail; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Nem sikerült lekérni a kameraszolgáltatást"); Serial.println (ControlserviceUUID.toString (). C_str ()); goto fail; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (SajátNév.c_str (), SajátNév.hossz ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - Nem sikerült lekérni az ellenőrzési jellemzőt"); Serial.println (ControlcharUUID.toString (). C_str ()); goto fail; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - feliratkozás az értesítésre"); const uint8_t indicOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (alertCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) jelzésOn, 2, true); } return true; sikertelen: pClient- >connect (); hamis visszatérés; }
A csatlakoztatott/leválasztott visszahívás:
class MyClientCallback: public BLEClientCallbacks {
void onConnect (BLEClient *pclient) {Serial.println ("Kapcsolatban vagyunk."); } void onDisconnect (BLEClient *pclient) {csatlakoztatva = hamis; pclient-> szétkapcsolás (); Serial.println ("Megszakadt a kapcsolatunk."); }};
A PIN kód része:
A jelenlegi verziómban megadhatom a PIN -kódot a webes felületen keresztül, de ezek a wifi/weboldal részletei, amelyeket később hozzáadhatok.
osztály MySecurity: nyilvános BLESecurityCallbacks
{uint32_t onPassKeyRequest () {Serial.println ("- PLEASE ENTER 6 DIGIT PIN (end ENTER):"); pinCode = 0; char ch; do {while (! Serial.available ()) {delay (1); } ch = Sorozat.olvasás (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Soros.nyomat (ch); }} while ((ch! = '\ n')); return pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "The passkey Notify number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "A jelszó YES/NO szám:%d", pass_key); vTaskDelay (5000); visszatérő; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Biztonsági kérés"); visszatérő; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};
BLE értesítés:
A kamera értesíti BLE ügyfeleit minden kameraváltozásról, beleértve azt is, amikor a kamera elindítja és leállítja a felvételt. Ez a kód kapcsolja a LED -et, amikor elindítja/leállítja a felvételt.
static void alertCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE üzenetformátum: // 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 (hossz == 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. lépés: A kód 2. része
Ez az a rész, amely ténylegesen elküldi a parancsokat a kamerának.
Felvétel:
uint8_t rekord = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0 = KI, 2 = BE, [8] void Record (boolean RecOn) {if (! RecOn) rekord [8] = 0; else rekord [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) rekord, 16, igaz); }
Összpontosítás:
A kamera 11 bites számot vár, közelről távoli fókuszra. Azt tanácsolom, hogy tegyen szűrőt az ADC értékére, különben a fókusz idegesen izgulhat.
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 bites ADC értékről 11 bites fókuszértékre állítva [8] = (uint8_t) (((val> > 1) & 0xFF)); fókusz [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fókusz, 12, igaz); }
Nyílás:
A kamera 11 bites számot vár, az alacsony és a nagy rekeszérték között. Azt tanácsolom, hogy tegyen szűrőt az ADC értékére, különben a rekesznyílás idegesen remeghet.
uint8_t rekesz = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0… 1.0, [8] = LSB, [9] = MSBvoid rekesz (uint16_t val) {// 12 bites ADC értékről 11 bites rekesznyílás értékre megy át [8] = (uint8_t) ((((val >> 1) & 0xFF)); rekesz [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) rekesz, 12, igaz); }
3. lépés: Az áramkör
Csatoltam az áramköröm PDF -jét. Néhány képet a NYÁK -ról is mellékelünk.
A tábla micro USB -ről működik.
Miután megkaptam a nyomtatott áramköri lapot, úgy döntöttem, hogy RGB LED -et szeretnék vezetni, ezért két WS2812B -t sorba kötöttem a "Button Led" kimenettel (ehhez szükség volt néhány huzalfoltra a PCB -n). A NYÁK 8 USD volt az OSHPark.com webhelyen.
Láthat még néhány csatlakozást a NYÁK -on, például az "adc" -t, amelyet nem használok, és amelyet eltávolítottak a mellékelt rajzokból. A terv az volt, hogy korábban egy külső fókuszkereket használtam, de jelenleg tökéletesen elégedett vagyok a kis hüvelykujjával.
4. lépés: Következtetés
Remélem ez segített.
Gondolkoztam néhány jövőbeli frissítésen, például egy forgó kódoló használata ellenállás nélkül. Ehhez a vezérlőnek meg kell kapnia a fókusz vagy a rekesznyílás aktuális értékét a fényképezőgépről, és onnan kell folytatnia. Valószínűleg frissíteni kell az "értesítési visszahívás" funkciót.
A NYÁK -nak frissítésre van szüksége ahhoz, hogy megfelelően jelezze a WS2812B RGB LED -eket.
Nagyon sok időt töltöttem ezzel a munkával, különösen a BLE részével. Ha ez segített rajtad, és vásárolni akarsz nekem egy italt, akkor nagyon örülök:) Ez egy Paypal adományozási link:
Ajánlott:
Vezeték nélküli Arduino robot a HC12 vezeték nélküli modul használatával: 7 lépés
Vezeték nélküli Arduino robot a HC12 vezeték nélküli modul használatával: Hé srácok, üdv újra. Korábbi hozzászólásomban elmagyaráztam, hogy mi az a H -híd áramkör, az L293D motorvezérlő IC, a malackalapú L293D motorvezérlő IC a nagyáramú motorvezérlők vezetéséhez, és hogyan tervezheti meg és készítheti el saját L293D motorvezérlő tábláját
Távirányítású autó - Vezeték nélküli vezeték nélküli Xbox 360 vezérlővel: 5 lépés
Távirányítású autó - vezérelhető a vezeték nélküli Xbox 360 vezérlő használatával: Ezek az utasítások saját távirányítású autó létrehozásához, vezeték nélküli Xbox 360 vezérlővel vezérelhetők
Ötven méter hatótávolságú vezeték nélküli hozzáférési pont TP Link WN7200ND USB vezeték nélküli adapterrel Raspbian Stretch -en: 6 lépés
Ötven méter hatótávolságú vezeték nélküli hozzáférési pont TP Link WN7200ND USB vezeték nélküli adapterrel a Raspbian Stretch -en: A Raspberry Pi kiválóan alkalmas biztonságos vezeték nélküli hozzáférési pontok létrehozására, de nem rendelkezik jó hatótávolsággal, TP Link WN7200ND USB vezeték nélküli adaptert használtam annak kiterjesztéséhez. Szeretném megosztani, hogyan kell csinálniMiért akarok málna pi -t használni router helyett? T
DIY vezeték nélküli mikrofon vezeték nélküli gitárrendszerhez: 4 lépés
DIY Wireless Mic to Wireless Guitar System: Néztem néhány videót és néhány zenekart, és szinte közülük vezeték nélküli rendszert használ a gitáron. Megőrülök, mozogok, sétálok, és azt csinálok, amit akarnak, anélkül, hogy a zsinórt használnám, ezért arról álmodozom, hogy lesz egy .. De .. nekem ez most túl drága, ezért erre jutottam
Hackeljen be egy vezeték nélküli kaputelefont egy vezeték nélküli riasztókapcsolóba vagy be/ki kapcsolóba: 4 lépés
Hackeljen be egy vezeték nélküli kaputelefont egy vezeték nélküli riasztókapcsolóba vagy be/ki kapcsolóba: Nemrég építettem egy riasztórendszert, és telepítettem a házamba. Mágneses kapcsolókat használtam az ajtókon, és bekötöttem a padláson. Az ablakok egy másik történet, és a kemény huzalozás nem volt lehetőség. Szükségem volt egy vezeték nélküli megoldásra, és ez