Inhoudsopgave:

Magic Button 4k: de 20USD BMPCC 4k (of 6k) draadloze afstandsbediening - Ajarnpa
Magic Button 4k: de 20USD BMPCC 4k (of 6k) draadloze afstandsbediening - Ajarnpa

Video: Magic Button 4k: de 20USD BMPCC 4k (of 6k) draadloze afstandsbediening - Ajarnpa

Video: Magic Button 4k: de 20USD BMPCC 4k (of 6k) draadloze afstandsbediening - Ajarnpa
Video: ATEM Mini Tips Marathon — All 16 Tips in One Video! 2024, Juli-
Anonim
Image
Image

Veel mensen hebben me gevraagd om wat details over mijn draadloze controller voor de BMPCC4k te delen. De meeste vragen gingen over de bluetooth-bediening, dus daar zal ik wat details over noemen. Ik ga ervan uit dat je bekend bent met de ESP32 Arduino-omgeving.

Deze versie van de afstandsbediening kan de opname, scherpstelling en diafragma van de camera via bluetooth regelen. Bekijk de video. Het is vrij eenvoudig om meer bedieningsfuncties toe te voegen volgens de Bluetooth-bedieningshandleiding van de BMPCC4k. In principe kan alles in de camera worden bediend, voor zover ik heb gezien.

Het zou een gemakkelijke stap zijn om een LIDAR-module toe te voegen om de afstand van een onderwerp te meten, zodat je een soort autofocussysteem kunt krijgen … Hoewel het de vraag is of je een nauwkeurig genoeg focus kunt krijgen op specifieke gebieden zoals ogen enz …

UPDATE 2020: Ik heb versie 3.0 gemaakt. Het is gebaseerd op een vrij roterend wiel met behulp van een magnetische encoder. Het maakt ook verbinding met mijn follow focus-motor, die in feite een tweede Bluetooth-apparaat wordt (de ESP32 ondersteunt meerdere Bluetooth-verbindingen). De nieuwe video laat dit zien.

Als je versie 3 wilt bestellen, kijk dan op de MagicButton website

Benodigdheden

Elke ESP32-module met wifi en bluetooth. Ik heb de TTGO micro32 gebruikt omdat hij klein is:https://www.banggood.com/LILYGO-TTGO-Micro-32-V2_0…

Een focuswiel, elke potentiometer zou doen. Ik heb het volgende gebruikt omdat het klein is:https://www.aliexpress.com/item/32963061806.html?s…Dit soort heeft harde stops aan de boven- en ondergrens. In een toekomstige versie zal ik een roterende encoder gebruiken. Op deze manier "springt" de focus of het diafragma niet naar de huidige wielinstelling wanneer ik een modus inschakel.

Een rec/mode-knop. Ik heb het volgende gebruikt:

Andere standaard componenten zoals weerstanden, doppen, … (zie schema)

Stap 1: De code

Ik gebruik de wifi-mogelijkheid van de ESP32 om ofwel verbinding te maken met een bekend netwerk in AP-modus, of, als ik in het veld ben, wordt het een station (STA) waarmee ik verbinding kan maken. Op die manier kan ik de module configureren. Ik zal niet in detail treden op de wifi/webpagina-sectie, ik zou dit in een later stadium kunnen toevoegen.

De ESP32 maakt verbinding met de camera en wordt een Bluetooth LE-client. De bluetooth-code in Arduino's ESP32-framework werkt niet met de BMPCC4k. Wakwak-koba heeft het voor ons gerepareerd. Bedankt Wakwak-koba! Ik heb de BLE-bibliotheek van hier gebruikt:

github.com/wakwak-koba/arduino-esp32

Desalniettemin is die versie van de BLE lib nog in ontwikkeling en de laatste versie van BLEUUID.cpp lijkt op dit moment niet te werken, dus neem de eerdere "geverifieerde" versie van dit bestand.

Voor de rest is het grootste deel van mijn bluetooth-code veel volgens de BLE-voorbeelden in het Arduino-framework:

Sommige BLE UUID en variabelen definiëren:

statische BLEUUID BlackMagic ("0000180-0000-1000-8000-00805f9b34fb");

statische BLEUUID ControlserviceUUID("291D567A-6D75-11E6-8B77-86F30CA893D3"); statische BLEUUID DevInfoServiceControlUUID("180A"); statische BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statische BLEUUID NotifcharUUID("B864E140-76A0-416A-BF30-5876504537D9"); statische BLEUUID ClientNamecharUUID("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statisch BLEUUID CamModelcharUUID("2A24"); statisch BLEScan *pBLEScan = BLEDevice::getScan(); statisch BLEAddress *pServerAddress; statisch BLEAdvertisedDevice* myDevice; statisch BLERemoteKarakteristiek *pControlKarakteristiek; statisch BLERemoteKarakteristiek *pNotifKarakteristiek; statisch boolean doConnect =0; statische boolean verbonden =0; vluchtigebool scannen =0; vluchtigeuint32_t pinCode;

De scan- en hoofdlus:

class MyAdvertisedDeviceCallbacks: openbare BLEAdvertisedDeviceCallbacks{

void onResult (BLEAdvertisedDeviceadvertedDevice) {Serial.print("BLE Advertised Device gevonden: "); Serial.println(advertisedDevice.toString().c_str()); if (advertisedDevice.haveServiceUUID() &&advertedDevice.getServiceUUID().equals(BlackMagic)) { Serial.print("Ons apparaat gevonden!"); geadverteerdDevice.getScan()->stop(); myDevice = nieuw BLEAdvertisedDevice(advertisedDevice); doConnect =waar; } } }; statische leegte scanCompleteCB (BLEScanResults scanResults) { Serial.println ("scannen voltooid"); scannen = onwaar; } void loop(void) { if (!connected && ((uint32_t)(millis() - Timer) > BLE_RESCAN_TIME || (!scanning))) { Serial.println("scanning…"); scannen = waar; pBLEScan->start(BLE_SCAN_TIME, scanCompleteCB); Timer = millis(); } if (doConnect ==true) { if (connectToServer()) { Serial.println("We zijn nu verbonden met de BLE Server."); verbonden = waar; } else { Serial.println("We hebben geen verbinding kunnen maken met de server; we kunnen niets meer doen."); } doConnect =false; } }

Aansluiten op de camera:

bool connectToServer(){

Serial.print("Een verbinding maken met "); Serial.println(myDevice->getAddress().toString().c_str()); BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT); BLEDevice::setSecurityCallbacks(nieuwe MySecurity()); BLESecurity *pSecurity = nieuwe 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(nieuwe MyClientCallback()); pClient->verbinden (mijn apparaat); Serial.println(" - Verbonden met server"); BLEDevice::setMTU(BLEDevice::getMTU()); // VERKRIJG CAMERAMODEL BLERemoteService *pRemoteService = pClient->getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) { Serial.print(" - Kan apparaatinfo-service niet ophalen"); Serial.println(DevInfoServiceControlUUID.toString().c_str()); mislukken; } Serial.println(" - Apparaatinfo lezen"); // Verkrijg een verwijzing naar het kenmerk in dienst van de externe BLE-server. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService->getCharacteristic(CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) { Serial.print(" - Kan cameramodel niet vinden"); Serial.println(CamModelcharUUID.toString().c_str()); mislukken; } // Lees de waarde van het kenmerk. std::string waarde = pRemoteCamModelCharacteristic->readValue(); Serial.print("Camera is "); Serial.println(value.c_str()); if (CamModel != value.c_str()) { Serial.print(" - Camera is geen BMPCC4k"); mislukken; } // VERKRIJG CONTROLE pRemoteService = pClient->getService (ControlserviceUUID); if (pRemoteService == nullptr) { Serial.print(" - Kan cameraservice niet ophalen"); Serial.println(ControlserviceUUID.toString().c_str()); mislukken; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService->getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic != nullptr) { pRemoteClientNameCharacteristic->writeValue(MyName.c_str(), MyName.length()); } pControlCharacteristic = pRemoteService->getCharacteristic(ControlcharUUID); if (pControlCharacteristic == nullptr) { Serial.print(" - Kan controlekenmerk niet ophalen"); Serial.println(ControlcharUUID.toString().c_str()); mislukken; } pNotifCharacteristic = pRemoteService->getCharacteristic(NotifcharUUID); if (pNotifCharacteristic != nullptr) // && pNotifCharacteristic->canIndicate()) { Serial.println(" - abonneren op melding"); const uint8_t indicatieOn = {0x2, 0x0}; pNotifCharacteristic->registerForNotify(notifyCallback, false); pNotifCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)indicationOn, 2, true); } retourneer waar; mislukken: pClient->disconnect(); onwaar retourneren; }

De verbonden/niet verbonden terugbellen:

class MyClientCallback: openbare BLEClientCallbacks{

void onConnect(BLEClient *pclient) { Serial.println("We zijn verbonden."); } void onDisconnect(BLEClient *pclient) { connected =false; pclient->verbinding verbreken(); Serial.println("We hebben de verbinding verbroken."); } };

Het pincodegedeelte:

In mijn huidige versie kan ik de pincode invoeren via de webinterface, maar dit zijn wifi/webpagina-details die ik later zou kunnen toevoegen.

class MySecurity: openbare BLESecurityCallbacks

{ uint32_t onPassKeyRequest() { Serial.println("- VOER 6-CIJFERIGE PIN IN (eindig met ENTER): "); pincode =0; char ch; do { while (!Serial.available()) { delay(1); } ch = Serieel.lezen(); if (ch >='0'&& ch <='9') { pinCode = pinCode *10+ (ch -'0'); Serial.print(ch); } } while ((ch !='\n')); retour 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, "Het wachtwoord JA/NEE nummer:%d", pass_key); vTaskDelay (5000); terugkeerwaar; } bool onSecurityRequest() { ESP_LOGI(LOG_TAG, "Security Request"); terugkeerwaar; } void onAuthenticationComplete(esp_ble_auth_cmpl_t auth_cmpl) { Serial.print("pair status = "); Serial.println(auth_cmpl.succes); } };

BLE-melding:

De camera stelt zijn BLE-clients op de hoogte van eventuele camerawijzigingen, ook wanneer de camera begint en stopt met opnemen. Deze code schakelt mijn LED in wanneer deze de opname start/stopt.

statische ongeldige meldingCallback(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE message format:// 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 (lengte ==13&& pData[0] ==255&& pData[1] ==9&& pData[4] ==10&& pData[5] ==1) { if (pData[8] ==0) { herstatus =0; } if (pData[8] ==2) { recstatus =1; } } }

Stap 2: De code deel 2

Dit is het deel dat de commando's daadwerkelijk naar de camera stuurt.

Opname:

uint8_t record = {255, 9, 0, 0, 10, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0=UIT, 2=AAN, [8]void Record (boolean RecOn) { if (!RecOn) record [8] =0; anders opnemen[8] =2; pControlCharacteristic->writeValue((uint8_t*)record, 16, true); }

Focussen:

De camera verwacht een 11 bit-getal, variërend van dichtbij tot veraf. Ik raad wel aan om een filter op je ADC-waarde te zetten, anders kan de focus zenuwachtig gaan trillen.

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) {// gaan van een 12bit ADC-waarde naar 11bit focuswaarde focus[8] = (uint8_t)(((val > >1) &0xFF)); focus[9] = (uint8_t)(((val >>1) &0xFF00) >>8); pControlCharacteristic->writeValue((uint8_t*)focus, 12, true); }

Opening:

De camera verwacht een 11 bit getal, variërend van een lage tot een hoge diafragmawaarde. Ik raad wel aan om een filter op je ADC-waarde te zetten, anders kan de diafragmawaarde nerveus gaan trillen.

uint8_t diafragma = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0.0 … 1.0, [8]=LSB, [9]=MSBvoid Aperture(uint16_t val) {// gaan van een 12-bits ADC-waarde naar een 11-bits diafragmawaarde-opening [8] = (uint8_t)(((val >>1) &0xFF)); diafragma[9] = (uint8_t)(((val >>1) &0xFF00) >>8); pControlCharacteristic->writeValue((uint8_t*)aperture, 12, true); }

Stap 3: Het circuit

Het circuit
Het circuit

Ik heb de PDF van mijn circuit bijgevoegd. Enkele foto's van de PCB zijn ook bijgevoegd.

Het bord wordt gevoed met micro-USB.

Na ontvangst van de print besloot ik dat ik een RGB LED wilde aansturen, dus heb ik twee WS2812B in serie aangesloten op de "Button Led" uitgang (waarvoor wat draadpatches op de print nodig waren). De PCB's waren 8USD bij OSHPark.com.

Op de print zie je nog meer aansluitingen zoals "adc" die ik niet gebruik en die uit de bijgevoegde schema's zijn verwijderd. Het plan was om in het verleden een extern focuswiel te gebruiken, maar ik ben momenteel perfect tevreden met het kleine duimwiel.

Stap 4: Conclusie

Ik hoop dat dit heeft geholpen.

Ik heb enkele toekomstige updates in gedachten, zoals het gebruik van een roterende encoder zonder harde stops. Hiervoor moet de controller de huidige waarde van de focus of het diafragma van de camera ophalen en vanaf daar doorgaan. De functie "notifyCallback" moet daarvoor waarschijnlijk worden bijgewerkt.

De PCB heeft een update nodig om de signalen voor de WS2812B RGB LED's goed te kunnen leveren.

Ik heb veel (heel veel) tijd gestoken in het maken van dit werk, vooral het BLE-gedeelte. Als dit je heeft geholpen en je wilt een drankje voor me kopen, wordt dat zeer op prijs gesteld:) Dit is een Paypal-donatielink:

Aanbevolen: