Sterowanie aparatem fotograficznym (canon)

Wspomaganie dla astrofotografii ma być jedną z funkcji mojej podstawy dla teleskopu. Podstawa ma nakierować się na obiekt, wykonać zdjęcie, przesunąć tubę teleskopu dostosowując się do ruchu Ziemi, zrobić zdjęcie – i tak do zadanej ilości klatek. Będzie to dość skomplikowane Najlepiej więc zacząć od rzeczy trochę prostszych… Na pierwszy ogień poszła sama koncepcja sterowania migawką aparatu z kontrolera. A może by to zrobić zdalnie, np. przez BLE? Trochę z boku, do tego co robię, ale nie mogłem się oprzeć:)

UWAGA: przedstawione tu eksperymenty mogą być niebezpieczne dla Waszego aparatu. Mogą go uszkodzić lub zniszczyć. Zalecam korzystanie wyłącznie z akcesoriów dostarczanych (lub zaakceptowanych) przez producenta aparatu. Eksperymenty przedstawione w tym tekście mają jedynie charakter pokazowy, edukacyjny. Nie biorę żadnej odpowiedzialności za ich rezultaty przeprowadzone na podstawie tego tekstu (zwłaszcza te negatywne). Straty materialne, zdrowotne – za żadne z nich nie odpowiadam. Ryzykuję uszkodzeniem własnego sprzętu, Wy używacie na własne ryzyko. 

Tutaj znajdziecie indeks tekstów na temat budowy podstawy teleskopu

Big thank you to Jozsef Ferencz:  your work inspired me a lot: https://dreamaxjoe.wixsite.com/fjphoto/single-post/2018/02/12/microbit-DSLR-remote-control.

W sprzedaży znajdziecie dedykowane piloty do wyzwalania migawki. Na popularnym portalu aukcyjnym kosztują od 100PLN, oryginalnych producentów aparatu – znacznie więcej. Właściwie oferują potrzebną mi funkcjonalność (ilość zdjęć, czas naświetlania itp.) – niektóre są nawet bezprzewodowe. Mnie jednak interesuje integracja z kontrolerem podstawy teleskopu. Gotowe rozwiązania nie przydadzą mi się.

Okazuje się jednak, że wyzwolenie migawki lustrzanki wcale nie jest skomplikowane. Nikon, Canon, Olympus – wszystkie mają dodatkowe wejście pozwalające na podłączenie pilota. Zasada działania jest bardzo podobna u każdego z producentów: 1 pin to masa, drugi to ustawianie fokusu, ostatni – otwarcie migawki. Aparaty posługują się zazwyczaj logiką 3.3v (upewnijcie się). Zwarcie pinu migawki do masy otwiera ją – wypuszczenie: zamyka. Działa to trochę jakby podłączyć zwykły przycisk. Teraz wystarczy ustawić odpowiednią sekwencję – i gotowe. Oczywiście aparat musi być ustawiony w tryb manualny (MF) i długość naświetlania BULB.

Ja akurat mam Canon 450d. Firma Canon była tak miła, że w tym modelu użyto 2.5mm jacka stereo – którego możecie dostać w każdym sklepie elektronicznym za kilka złotych. Do tego potrzebny jest kabeł 3-żyłowy (lub np. 2 żyły i oplot do masy). No i jakiś kontroler.

Koncepcja

Teraz w kwestii kontrolera… W podstawie mam ESP32. Mogę podłączyć wężyk spustowy bezpośrednio do niego. Pewnie tak ostatecznie zrobię. Tutaj zdecydowałem się jednak na bardziej uniwersalne rozwiązanie:

  • Na aparacie zainstaluję micro:bit (z bateriami), podłączę go do gniazda migawki,
  • Na micro:bit wystartuję usługę BLE, która będzie wystawiać możliwość zdefiniowania ilości klatek, czasu naświetlania itp.
  • Na telefon z androidem napiszę aplikację w MIT App Inventor, która tą usługę użyje.

 W ten sposób będę mógł wyzwalać zdjęcia zdalnie po BLE niezależnie od obudowy teleskopu.

Obudowa już używa połączenia do Thingy (ściąganie kierunku i podniesienia tuby). Ciekawe, czy mogę mieć 2 klientów jednocześnie? Do sprawdzenia.

Oczywiście zamiast micro:bit możecie użyć dowolny mały kontroler – taki, który można zasilać bateryjnie. Użyłem zasobnika z dwoma bateriami AAA. Dodatkowo podoba się wbudowana matryca 25x LED, której użyłem do sygnalizacji postępów serii zdjęć. Ja łączę się po BLE, Wy możecie zrobić to ze zwykłym Bluetooth lub WiFi. ESP8266, ESP32 – cokolwiek.

Przygotowanie micro:bit

Okazuje się, że micro:bit można programować nie tylko bloczkami MakeCode, ale pythonem (wersja micro) oraz… z poziomu Arduino IDE. Szczegółowy poradnik jest na Adafruit. Ja użyłem wersji  Arduino IDE 1.8.12 pod Linux Mint. Wystarczy postępować zgodnie z poradnikiem. Dodatkowo musiałem uzupełnić reguły udev (specyficzne dla linuxa):

Uzupełnienie softdevice

SoftDevice odpowiada za zarządzanie chipsetem do komunikacji. Najprawdopodobniej u Was jest on już wgrany – ale jeżeli micro:bit dziwnie się zachowuje, warto go odświeżyć. Ja już trochę kombinowałem z micro:bit, więc musiałem to zrobić. Domyślna wersja SoftDevice to 110.  Instalacja:

  • Opis wgrania SoftDevice na micro:bit https://github.com/sandeepmistry/arduino-nRF5 – ale samo repo nie zawiera binarki softdevice, trzeba je dograć,
  • Ściągnijcie softDevice z Nordica i wkopiujcie je do sciezki
    ~/.arduino15/packages/sandeepmistry/hardware/nRF5/0.6.0/cores/nRF5/SDK/components/softdevice/s110/hex/s110_nrf51_8.0.1_softdevice.hex (czy co tam jest na Windows :))
  • Pamiętajcie o ustawieniu płyty jako „BBC micro:bit”, Softdevice S110, i ustawieniu portu
  • Dopiero teraz użyłem instalatora z Tools/nRF5 Flash SoftDevice.

Jeżeli powyższe nie zadziała, spróbujcie po prosu przekopiować softdevice (plik hex) na dysk, który otworzy się po podłączeniu micro:bit do komputera.

Schemat

Wtyczka 2.5 mm jack stereo (3 pola):

Masę podłączyłem do masy micro:bit. Ostatni segment wtyku (shutter) podłączyłem do pinu 2 (jeden z tych dużych okrągłych).

Oprogramowanie – krok 1: podstawy

Kod możecie obejrzeć sobie na githubie; https://github.com/arekmerta/dobsonMotorizedBase/tree/master/experimental/microbit/eosShutter. Większość miejsca zajmuje ogarnięcie wyświetlacza i mierzenie czasu. Dla pstryknięcia zdjęcia kluczowe są 2 metody:

triggerShot() otwiera migawkę zapisując „0” do portu analogowego. stopShot() – puszcza ją, kończąc zdjęcie.

Jeżeli chodzi o zabawę ledami:

  • Wszystkie diody migają: czekam albo skończyłem,
  • Klawisz „A” – zacznij serię zdjęć,
  • Górne 4 rzędy diod:
    • Świeci ciągle: zdjęcie czeka do wykonania,
    • Zgaszone: zdjęcie wykonane,
    • Migające: zdjęcie w trakcie naświetlania
  • Ostatni rząd diod:
    • Dwudziestki zdjęć, np. 3 zapalone: 40+ zdjęć, 1 zapalona: ostatnie 20 zdjęć
  • Ostatnia dioda dolna:
    • Zapalona: przerwa między zdjęciami.

Oprogramowanie – krok 2: BLE

Skoro powyższe zadziałało, przyglądnijmy się teraz wersji z BLE.  Właściwie wszystko macie w przykładach biblioteki BLEPeripheral. Cały mój kod znajdziecie tuaj: https://github.com/arekmerta/dobsonMotorizedBase/tree/master/experimental/microbit/eosShutterBLE. Kluczowe są linijki:

  • Deklaracja urządzenia, usługi i charakterystyk (sekwencja kluczowa to 0100, 0101, 0102):
  • Dodanie  urządzenia:
  • Polling i sprawdzenie stanu:
  • Odświeżenie stanu charakterystyki z notyfikacją – pamiętajcie o 'poll':

UWAGA: microbit.begin() musi być wywołane po blePeripheral.begin();

Testy BLE

Po załadowaniu kodu, przeskanowałem urządzenia BLE:

Fajnie, micro:bit się znalazł. Sprawdźmy, jakie ma usługi.

Charakterystyki 2f937084- to te, które zadeklarowałem – pozostałe to systemowe. Kolejno:

  • 0101: shooterConfigCharacteristic, w której ustawia się ilość zdjęć do wykonania i czas otwrcia migawki,
  • 0102: shooterProgressCharacteristic, która notyfikuje klientów o rozpoczętym zdjęciu i stanie (np. 3 to koniec sesji).

UUID dla charakterystyk wygenerowałem za pomocą narzędzia: https://www.uuidgenerator.net/version4.

Klient na telefonie

Tutaj poszedłem na łatwiznę i użyłem MIT App Inventor. Do obsługi BLE będziecie potrzebowali dodatkowego rozszerzenia. Pobierzcie je z http://iot.appinventor.mit.edu/#/bluetoothle/bluetoothleintro i dodajcie do projektu.

Bloczki znajdziecie tutaj: http://ai2.appinventor.mit.edu/#4827855079211008 (wymagane konto google) oraz na github https://github.com/arekmerta/dobsonMotorizedBase/experimental/microbit.

Kilka wyjaśnień:

  • Używam funkcji log do wyświetlania informacji na dolnym polu tekstowym,
  • Adres mojego micro:bit jest zaszyty na stałe w zmiennej: „mac” – jeżeli chcecie użyć tego kodu to albo zmieńcie jej wartość (na podstawie np. wyników 'hcitool lescan'), albo dodajcie własną procedurę skanowania i wyboru urządzeń. Mi ten krok nie był potrzebny – więc poszedłem na skróty,
  • Podobnie zmienne przechowujące adres usługi i charakterystyk: „shutterService”, „shutterConfig”, „shutterStatus”; też ustawiłem je na sztywno odpowiednio do kodu micro:bit,
  • Zauważcie, że BLEPeripheral (na której to bibliotece oparłem kod dla micro:bit) inaczej zapisuje UUID serwisu i charakterystyk niż MIT APP Inventor; App Inventor używa postaci z myślnikami. To jest ten sam UUID, po prostu inaczej zapisany,
  • Zauważcie w kodzie micro:bit funkcję BLEPeripheral:poll() – musicie ją wywołać po każdym zapisie do charakterystyki; inaczej apka na telefonie nie „wyczuje” zmiany jej wartości.
  • Po wykonaniu sekwencji klient odłącza się od usługi. Wciśnięcie przycisku „Start” zaczyna się od połączenia do urządzenia BLE.

Zbudujcie APK z menu Build/App (save .apk to my computer) i zainstalujcie na telefonie. Będzie wymagać pozwolenia na zainstalowanie zewnętrznych aplikacji przez system plików.

Podstawka (3D)

Całość – micro:bit z zasobnikiem 2xAAA zamontowałem na stopce aparatu. Do micro:bit znalazłem jakieś sprytne okładki. Zadanie ograniczyło się wtedy do wpasowania  okładek z bateriami w obudowę i dorobienia wtyku do stopki aparatu. Projekt podstawki wyglądał tak:

To-to na środku to wkomponowana stopka aparatu. Wydruk:

I stopka:

Zlutowany wtyk do micro, zasobnik na 2 baterie AAA oraz wyłącznik szczebelkowy:

A tu już z bateriami w podstawce:

Adapter do kabla – w 3D

Dodatkowo wydrukowałem adapter do kabla (oparte na projekcie: https://www.thingiverse.com/thing:3586901):

I real-life: dół micro:bit okleiłem izolacją tak, żeby mi się nic przypadkiem nie zwarło:

Przewody od wtyku przykręciłem na śrubki:

Podstawa i aplikator razem:

Galeria

Wersja ostateczna na canon 450d / Rebel XSi.

 

I jeszcze filmik z działania:

Obserwacje

Problemy, jakie zauważyłe

  • konieczność włączenia gadżeciku przed włączeniem aparatu. Inaczej aparat wyczuwa stan niski (micro:bit nie zasilony) i od razu po włączeniu zaczyna pstrykać zdjęcie.
  • dla canon 450, w trybie bulb minimalny czas naświetlania to 1/20s (50ms). Poniżej tej wartości migawka nie reaguje,

Cały kod znajdziecie na github: https://github.com/arekmerta/dobsonMotorizedBase/experimental/microbit.

Ostatnie zmiany

  • 24.05.2020: dodanie elapse – ustawianie czasu między zdjęciami (kod micro:bit i klient android);

Źródła

  • https://blog.mclemon.io/hacking-the-canon-dslr-trigger-release-using-arduino
  • http://www.martyncurrey.com/activating-the-shutter-release/
  • https://github.com/kalanda/photoduino
  • http://www.doc-diy.net/photo/eos_wired_remote/
  • https://dreamaxjoe.wixsite.com/fjphoto/single-post/2018/02/12/microbit-DSLR-remote-control
  • https://developer.android.com/guide/topics/connectivity/bluetooth-le
  • https://www.uuidgenerator.net/version4
  • http://appinventor.mit.edu/explore/ai2/setup-device-wifi
  • https://www.thingiverse.com/thing:3586901