Innehållsförteckning:
Video: Magic Button 4k: 20USD BMPCC 4k (eller 6k) trådlös fjärrkontroll: 4 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:37
Många har bett mig att dela några detaljer om min trådlösa handkontroll för BMPCC4k. De flesta frågor handlade om bluetooth -kontrollen, så jag nämner några detaljer om det. Jag antar att du är bekant med ESP32 Arduino -miljön.
Denna version av fjärrkontrollen kan styra inspelning, fokus och bländare på kameran via bluetooth. Ta en titt på videon. Det är ganska enkelt att lägga till fler kontrollfunktioner enligt bluetooth -kontrollhandboken för BMPCC4k. I princip kan allt i kameran styras, vad jag har sett.
Det skulle vara ett enkelt steg att lägga till en LIDAR -modul för att mäta avståndet till ett motiv, så att du kan få ett slags autofokussystem … Även om det är tveksamt om du kan få tillräckligt noggrant fokus på specifika områden som ögon osv …
UPPDATERING 2020: Jag gjorde version 3.0. Det är baserat på ett fritt roterande hjul med en magnetisk kodare. Den ansluter också till min följfokusmotor, som i princip blir en andra Bluetooth -enhet (ESP32 stöder flera Bluetooth -anslutningar). Den nya videon visar detta.
Om du vill beställa version 3 kan du titta på MagicButtons webbplats
Tillbehör
Alla ESP32 -moduler med wifi och bluetooth. Jag använde TTGO micro32 eftersom den är liten:
Ett fokushjul, vilken potentiometer som helst skulle göra. Jag använde följande eftersom det är litet: https://www.aliexpress.com/item/32963061806.html? S … Denna typ har hårda stopp vid den övre och nedre gränsen. I en framtida version använder jag en roterande kodare. På så sätt hoppar inte fokus eller bländare till den aktuella hjulinställningen när jag går in i ett läge.
En inspelningsknapp. Jag använde följande: https://www.aliexpress.com/item/32806223591.html? S …
Andra standardkomponenter som motstånd, lock, … (se schemat)
Steg 1: Koden
Jag använder ESP32: s wifi -kapacitet för att antingen ansluta till ett känt nätverk i AP -läge, eller, när jag är i fältet, blir det en station (STA) som jag kan ansluta till. På så sätt kan jag konfigurera modulen. Jag kommer inte att gå in på detaljerna i wifi/webbsidan, jag kan lägga till detta i ett senare skede.
ESP32 ansluter till kameran och blir en Bluetooth LE -klient. Bluetooth -koden som ingår i Arduinos ESP32 -ram fungerar inte med BMPCC4k. Wakwak-koba har fixat det åt oss. Tack Wakwak-koba! Jag använde BLE -biblioteket härifrån:
github.com/wakwak-koba/arduino-esp32
Ändå är den versionen av BLE lib fortfarande under utveckling och den senaste versionen av BLEUUID.cpp verkar inte fungera just nu, så ta den tidigare "verifierade" versionen av filen.
För resten är det mesta av min bluetooth -kod mycket enligt BLE -exemplen som ingår i Arduino -ramverket:
Några BLE UUID och variabler definierar:
statisk BLEUUID BlackMagic ("00001800-0000-1000-8000-00805f9b34fb");
statisk BLEUUID ControlserviceUUID ("291D567A-6D75-11E6-8B77-86F30CA893D3"); statisk BLEUUID DevInfoServiceControlUUID ("180A"); statisk BLEUUID ControlcharUUID ("5DD3465F-1AEE-4299-8493-D2ECA2F8E1BB"); statisk BLEUUID NotifcharUUID ("B864E140-76A0-416A-BF30-5876504537D9"); statisk BLEUUID ClientNamecharUUID ("FFAC0C52-C9FB-41A0-B063-CC76282EB89C"); statisk BLEUUID CamModelcharUUID ("2A24"); statisk BLEScan *pBLEScan = BLEDevice:: getScan (); statisk BLEAddress *pServerAddress; statisk BLEAdvertisedDevice* myDevice; statisk BLERemoteCharacteristic *pControlCharacteristic; statisk BLERemoteCharacteristic *pNotifCharacteristic; statisk boolsk doConnect = 0; statisk boolean ansluten = 0; volatilebool -skanning = 0; volatileuint32_t pinCode;
Skanning och huvudslinga:
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.print ("BLE Advertised Device found:"); Serial.println (annonseradDevice.toString (). C_str ()); if (advertisedDevice.haveServiceUUID () && advertisedDevice.getServiceUUID (). equals (BlackMagic)) {Serial.print ("Hittade vår enhet!"); advertisedDevice.getScan ()-> stop (); myDevice = new BLEAdvertisedDevice (advertisedDevice); doConnect = true; }}}; static void scanCompleteCB (BLEScanResults scanResults) {Serial.println ("skanning klar"); skanning = falskt; } void loop (void) {if (! connected && ((uint32_t) (millis () - Timer)> BLE_RESCAN_TIME || (! scanning))) {Serial.println ("scanning …"); skanning = sant; pBLEScan-> start (BLE_SCAN_TIME, scanCompleteCB); Timer = millis (); } if (doConnect == true) {if (connectToServer ()) {Serial.println ("Vi är nu anslutna till BLE -servern."); ansluten = sann; } else {Serial.println ("Vi misslyckades med att ansluta till servern; det finns inget mer vi kommer att göra."); } doConnect = false; }}
Anslutning till kameran:
bool connectToServer () {
Serial.print ("Skapa en anslutning till"); Serial.println (myDevice-> getAddress (). ToString (). C_str ()); BLEDevice:: setEncryptionLevel (ESP_BLE_SEC_ENCRYPT); BLEDevice:: setSecurityCallbacks (new MySecurity ()); BLESecurity *pSecurity = ny BLESecurity (); pSecurity-> setKeySize (); pSecurity-> setAuthenticationMode (ESP_LE_AUTH_REQ_SC_MITM_BOND); pSäkerhet-> setCapability (ESP_IO_CAP_IN); pSecurity-> setRespEncryptionKey (ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); BLEClient *pClient = BLEDevice:: createClient (); pClient-> setClientCallbacks (nya MyClientCallback ()); pClient-> connect (myDevice); Serial.println (" - Ansluten till server"); BLEDevice:: setMTU (BLEDevice:: getMTU ()); // OBTAIN CAMERA MODEL BLERemoteService *pRemoteService = pClient-> getService (DevInfoServiceControlUUID); if (pRemoteService == nullptr) {Serial.print (" - Det gick inte att hämta enhetsinfotjänst"); Serial.println (DevInfoServiceControlUUID.toString (). C_str ()); gå fel; } Serial.println (" - Läsenhetsinformation"); // Skaffa en referens till egenskapen i tjänsten för den avlägsna BLE -servern. BLERemoteCharacteristic *pRemoteCamModelCharacteristic = pRemoteService-> getCharacteristic (CamModelcharUUID); if (pRemoteCamModelCharacteristic == nullptr) {Serial.print ("Det gick inte att hitta kameramodellen"); Serial.println (CamModelcharUUID.toString (). C_str ()); gå fel; } // Läs värdet på egenskapen. std:: string value = pRemoteCamModelCharacteristic-> readValue (); Serial.print ("Kamera är"); Serial.println (värde.c_str ()); if (CamModel! = value.c_str ()) {Serial.print (" - Kameran är inte BMPCC4k"); gå fel; } // OBTAIN CONTROL pRemoteService = pClient-> getService (ControlserviceUUID); if (pRemoteService == nullptr) {Serial.print (" - Det gick inte att få kameratjänst"); Serial.println (ControlserviceUUID.toString (). C_str ()); gå fel; } BLERemoteCharacteristic *pRemoteClientNameCharacteristic = pRemoteService-> getCharacteristic (ClientNamecharUUID); if (pRemoteClientNameCharacteristic! = nullptr) {pRemoteClientNameCharacteristic-> writeValue (MyName.c_str (), MyName.length ()); } pControlCharacteristic = pRemoteService-> getCharacteristic (ControlcharUUID); if (pControlCharacteristic == nullptr) {Serial.print (" - misslyckades med att få kontrollkarakteristik"); Serial.println (ControlcharUUID.toString (). C_str ()); gå misslyckas; } pNotifCharacteristic = pRemoteService-> getCharacteristic (NotifcharUUID); if (pNotifCharacteristic! = nullptr) // && pNotifCharacteristic-> canIndicate ()) {Serial.println (" - prenumerera på avisering"); const uint8_t indicionOn = {0x2, 0x0}; pNotifCharacteristic-> registerForNotify (notifyCallback, false); pNotifCharacteristic-> getDescriptor (BLEUUID ((uint16_t) 0x2902))-> writeValue ((uint8_t*) indikationOn, 2, true); } återvända sant; misslyckas: pClient-> koppla bort (); return falsk; }
Den anslutna/frånkopplade återuppringningen:
class MyClientCallback: public BLEClientCallbacks {
void onConnect (BLEClient *pclient) {Serial.println ("Vi är anslutna."); } void onDisconnect (BLEClient *pclient) {connected = false; pclient-> koppla bort (); Serial.println ("Vi kopplades bort."); }};
PIN -kodens del:
I min nuvarande version kan jag ange pinkoden via webbgränssnittet men det här är wifi/webbsida som jag kan lägga till senare.
klass MySecurity: public BLESecurityCallbacks
{uint32_t onPassKeyRequest () {Serial.println ("- Vänligen ange 6 siffrors PIN-kod (sluta med ENTER):"); pinCode = 0; char ch; gör {while (! Serial.available ()) {delay (1); } ch = Serial.read (); if (ch> = '0' && ch <= '9') {pinCode = pinCode *10+ (ch -'0 '); Serial.print (ch); }} medan ((ch! = '\ n')); retur pinCode; } void onPassKeyNotify (uint32_t pass_key) {ESP_LOGE (LOG_TAG, "The password key Notify number:%d", pass_key); } bool onConfirmPIN (uint32_t pass_key) {ESP_LOGI (LOG_TAG, "Lösenordet YES/NO nummer:%d", pass_key); vTaskDelay (5000); återvändande; } bool onSecurityRequest () {ESP_LOGI (LOG_TAG, "Säkerhetsbegäran"); återvändande; } void onAuthenticationComplete (esp_ble_auth_cmpl_t auth_cmpl) {Serial.print ("pair status ="); Serial.println (auth_cmpl.success); }};
BLE -meddelande:
Kameran meddelar sina BLE -klienter om eventuella kameraändringar, inklusive när kameran startar och slutar spela in. Denna kod växlar min lysdiod när den startar/stoppar inspelningen.
static void notifyCallback (BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t*pData, size_t length, bool isNotify) {// BMPCC4k BLE meddelandeformat: // rec on är 255 9 0 0 10 1 1 2 2 0 64 0 2 // rec off är 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) { rekstatus = 0; } if (pData [8] == 2) {recstatus = 1; }}}
Steg 2: Koden Del 2
Detta är den del som faktiskt skickar kommandona till kameran.
Inspelning:
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 (boolean RecOn) {if (! RecOn) record [8] = 0; annars post [8] = 2; pControlCharacteristic-> writeValue ((uint8_t*) post, 16, true); }
Fokus:
Kameran förväntar sig ett 11 -bitars tal, allt från nära till långt fokus. Jag rekommenderar att du sätter ett filter på ditt ADC -värde, annars kan fokus bli nervöst skakande.
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) {// går från ett 12 bitars ADC -värde till 11 bitars fokusvärdesfokus [8] = (uint8_t) (((val> > 1) & 0xFF)); fokus [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) fokus, 12, true); }
Öppning:
Kameran förväntar sig ett 11 -bitars tal, allt från ett lågt till ett högt bländarvärde. Jag rekommenderar att du sätter ett filter på ditt ADC -värde, annars kan bländarvärdet bli nervöst skakande.
uint8_t bländare = {255, 6, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0}; // 0,0… 1,0, [8] = LSB, [9] = MSBvoid Aperture (uint16_t val) {// går från ett 12 bitars ADC -värde till 11 bitars bländarvärde bländare [8] = (uint8_t) (((val >> 1) & 0xFF)); bländare [9] = (uint8_t) (((val >> 1) & 0xFF00) >> 8); pControlCharacteristic-> writeValue ((uint8_t*) bländare, 12, true); }
Steg 3: Kretsen
Jag har bifogat PDF: en för min krets. Några bilder på kretskortet bifogas också.
Kortet drivs med mikro -USB.
Efter att ha mottagit kretskortet bestämde jag mig för att jag ville köra en RGB -LED, så jag kopplade två WS2812B i serie till "Button Led" -utgången (som behövde några trådplåster på kretskortet). Kretskortet var 8USD med OSHPark.com.
Du kan se några fler anslutningar på kretskortet, till exempel "adc" som jag inte använder och som togs bort från den bifogade schemat. Planen var att använda ett externt fokushjul tidigare men jag är för närvarande helt nöjd med det lilla tumhjulet.
Steg 4: Slutsats
Jag hoppas att detta hjälpte.
Jag har några framtida uppdateringar i åtanke, till exempel att använda en roterande kodare utan hårda stopp. Detta kräver att regulatorn får det aktuella värdet för fokus eller bländare från kameran och fortsätter därifrån. "NotifyCallback" -funktionen måste förmodligen uppdateras för det.
Kretskortet behöver en uppdatering för att ge signalerna för WS2812B RGB -lysdioderna korrekt.
Jag spenderade mycket (en loooot) tid på att få detta att fungera, särskilt BLE -delen. Om detta hjälpte dig och du vill köpa mig en drink, är det mycket uppskattat:) Detta är en Paypal -donationslänk:
Rekommenderad:
IoT RC -bil med smart lampa fjärrkontroll eller gateway: 8 steg (med bilder)
IoT RC Car With Smart Lamp Remote or Gateway: För ett icke -relaterat projekt hade jag skrivit lite Arduino -kod för att prata med MiLight smarta lampor och lampfjärrkontroller som jag har i mitt hem. Efter att jag lyckats fånga upp kommandon från de trådlösa fjärrkontrollerna, Jag bestämde mig för att göra en liten RC -bil för att testa
Trådlös fjärrkontroll med 2,4 GHz NRF24L01 -modul med Arduino - Nrf24l01 4 -kanals / 6 -kanals sändarmottagare för Quadcopter - Rc helikopter - RC -plan med Arduino: 5 steg (med bilder)
Trådlös fjärrkontroll med 2,4 GHz NRF24L01 -modul med Arduino | Nrf24l01 4 -kanals / 6 -kanals sändarmottagare för Quadcopter | Rc helikopter | Rc -plan med Arduino: Att driva en Rc -bil | Quadcopter | Drone | RC -plan | RC -båt, vi behöver alltid en mottagare och sändare, antag att för RC QUADCOPTER behöver vi en 6 -kanals sändare och mottagare och den typen av TX och RX är för dyr, så vi kommer att göra en på vår
Konvertera din IR -fjärrkontroll till RF -fjärrkontroll: 9 steg (med bilder)
Konvertera din IR -fjärrkontroll till RF -fjärrkontroll: I dagens Instructable visar jag dig hur du kan använda en generisk RF -modul utan en mikrokontroller som så småningom kommer att leda oss till att bygga ett projekt där du kan konvertera en IR -fjärrkontroll från vilken enhet som helst till en RF Avlägsen. Den största fördelen med att konvertera en
Styr dina elektriska apparater med din fjärrkontroll för fjärrkontroll (IR -fjärrkontroll) med temperatur- och luftfuktighetsdisplay: 9 steg
Styr dig elektriska apparater med din TV -fjärrkontroll (ir -fjärrkontroll) med temperatur- och luftfuktighetsdisplay: hej jag är Abhay och det är min första blogg om Instructables och idag ska jag visa dig hur du styr dina elektriska apparater med din fjärrkontroll genom att bygga detta enkelt projekt. tack till atl lab för stöd och tillhandahållande av materialet
Hacka en trådlös dörrklocka till en trådlös larmströmbrytare eller strömbrytare: 4 steg
Hacka en trådlös dörrklocka till en trådlös larmströmbrytare eller strömbrytare: Jag byggde nyligen ett larmsystem och installerade det i mitt hus. Jag använde magnetbrytare på dörrarna och kopplade dem via vinden. Fönstren var en annan historia och hårda kablar var inte ett alternativ. Jag behövde en trådlös lösning och det här är