Inhoudsopgave:
Video: Magic Button 4k: de 20USD BMPCC 4k (of 6k) draadloze afstandsbediening - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:14
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
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:
Aan de slag met draadloze temperatuur- en trillingssensoren met groot bereik: 7 stappen
Aan de slag met draadloze temperatuur- en trillingssensoren met groot bereik: Soms zijn trillingen de oorzaak van ernstige problemen in veel toepassingen. Van machineassen en lagers tot de prestaties van de harde schijf, trillingen veroorzaken schade aan de machine, vroegtijdige vervanging, lage prestaties en veroorzaken een grote aanslag op de nauwkeurigheid. Toezicht houden
Hoe maak je een draadloze Tin-Can-telefoon! (Arduino Walkie Talkie): 7 stappen (met afbeeldingen)
Hoe maak je een draadloze Tin-Can-telefoon! (Arduino Walkie Talkie): Onlangs zat ik midden in een heel belangrijk telefoontje toen mijn bananentelefoon niet meer werkte! Ik was zo gefrustreerd. Dat is de laatste keer dat ik een oproep mis vanwege die stomme telefoon! (Achteraf ben ik misschien een beetje te boos geworden in
Articulerende draadloze vermogenszender: 4 stappen
Articulating Wireless Power Transmitter: Wilt u een scharnierende arm die uw apparaat zinloos volgt om op te laden? Dit is het project. I Wireless Power Transmitter en Receiver combo die uw apparaat zal volgen…..zolang het ongeveer vijf centimeter verwijderd is
TV-afstandsbediening wordt een RF-afstandsbediening -- NRF24L01+ zelfstudie: 5 stappen (met afbeeldingen)
TV-afstandsbediening wordt een RF-afstandsbediening || NRF24L01+ Tutorial: In dit project laat ik je zien hoe ik de populaire nRF24L01+ RF IC heb gebruikt om de helderheid van een ledstrip draadloos aan te passen via drie nutteloze knoppen van een tv-afstandsbediening. Laten we beginnen
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze