Zrób to sam – zdalne sterowanie aparatem cz. 1 (chyba, ogólny opis)
Ewentualnie „żadne rynkowe rozwiązanie nie było zadowalające, więc zrobiłem własne, a teraz się chwalę”. Oraz w razie zainteresowanie bliższymi szczegółami jak to działa, będzie kolejna część.
Po co?
Z kilku powodów, zdarza mi się często focić pioruny, często – znaczy jak tylko jest ku temu okazja zwana dalej burzą. Przy burzach wykorzystuje się albo krótkie czasy migawek + sprzęt, który wykrywa pioruny albo po prostu ustawia się aparat na najdłuższy możliwy czas i czeka na to co się złapie. Wole drugą opcję. Ale aparaty fotograficzne mają w tym zakresie ograniczenia, maksymalny automatyczny czas otwarcia migawki to maks 30s. Jeśli chcemy dłuższy, musimy użyć zewnętrznych urządzeń albo stopera (dusząc spust migawki jakiś określony czas). Wolimy urządzenia zewnętrzne, bo raz że jesteśmy leniwi, dwa, że trzymanie spustu aparatu powoduje jakieś tam drgania aparatu, a to przekłada się na ostrość zdjęć. Szczęśliwie tanie lustra Canona (a takie mam) mają wejście wężyka spustowego w postaci jacka 2,5mm. Podłączenie tego jacka jest banalnie proste, mamy trzy piny – masę wyzwolenie migawki i ustawienie ostrości. Aby wyzwolić migawkę/ustawić ostrość wystarczy zewrzeć odpowiedni pin do masy. Więc wystarczy jakiś układ czasowy zwierający styki na określony czas.
Ale jam jest Kaw…
A to oznacza, że opcja „prosty układ czasowy” nie jest opcją. :D Skonstruowany prototyp ma:
- Regulowane opóźnienie do pierwszego zdjęcia;
- Regulowane odstępy miedzy zdjęciami;
- Regulowany odstęp między „focus” a „shutter release”;
- Regulowany czas trzymania migawki;
- Port USB;
- Układ ładowania swojego akumulatora;
- Układ komunikacji radiowej (aby można było używać wyzwalacza zdalnego i wyzwalać zdalnie lampy);
- Buzzer i ledy, ot tak dla satusu widzenia;
- 128x64px wyświetlacz LCD z podświetleniem;
- 5 przycisków do zabawy;
- Dodatkowo, projekt drugiego prototypu posiada kontroler Host-USB (do sterowania aparatem przez protokół PTP);
Sercem układu jest układ Atmela, XMEGA pracująca z maksymalna częstotliwością 32MHz. ATXMEGA128A3U. Dlaczego ten? Bo ma > 2kiB pamięci SRAM (sam bufor ramki dla wyświetlacza to 1024B), przerwania na wszystkich portach, wbudowany transciver USB (ot dla wygodnej aktualizacji firmware). I jego wyjścia mogą być ustawione jako Wired-AND. Poza tym, z potrzebnych nam rzeczy – moduł SPI do komunikacji z radiem i wyświetlaczem, 2kiB EEPROMu i duuużo GPIO.
Układ zasilania i ładowania
System zasilany jest z jednego akumulatora 18650 o napięciu nominalny 3.7V i pojemności 2200mAh. Wystarcza na jakieś 40‑120h ciągłej pracy. Napięcie oryginalnie stabilizował LM1117, LDO. Regulatory tego typu działają w praktyce jako regulowany rezystor, zamieniają w ciepło różnice napięć wejściowego i wyjściowego, nie są zbyt sprawne, ale jak mamy do czynienia z niskimi prądami i małymi różnicami napięć – nadają się bardziej do stabilizacji napięcia niż regulatory impulsowe. Bo w praktyce potrzebują do poprawnej pracy tylko 2 kondensatorów. Niestety okazało się, że wspomniany LM1117 ma spadek napięcia rzędu 1.1V. 3.7V-1.1V=2.6V a my do poprawnej pracy potrzebujemy 3V3, a tu płytka już gotowa i poskładana… no to się zrobi mały hack i podmieni 1117 na LM3965 – ten ma tylko 50mV spadku i wszystko na nim działa poprawnie. Akumulator może być wyjęty i naładowany w dedykowanej ładowarce (pełno tego na allegro) jak i za pomocą MAX1811 ładowany przez port USB. To jak aku jest ładowany jest kontrolowane przez CPU, ładowanie z zewnątrz może być włączone lub nie, bo może akurat połączyliśmy sobie układ do telefonu i nie chcemy wyssać z niego energii. Maksymalny prąd ładowania dla tego kontrolera – 500mA, naładowanie akumulatora od zera do 100% zajmuje około 4h.
Połączenie z aparatem
Oryginalnie między CPU a aparatem były zainstalowane optoizolatory (PC817), ot tak aby galwanicznie oddzielić całą elektronikę aparatu (i jej poziomy zasilania) od układu sterownika. W praktyce mają one pewną wadę, diody LED w nich ssą sporo (jak na pobór prądu całego układu) prądu, ~2x10mA. Można wstawić transoptory z wyjściem darlingtonowym (mają bardzo duże wzmocnienie, więc w praktyce wystarczy do LEDów 1‑2mA), ale skoro mój Canon i tak działa na 3V3 jak i sterownik, prościej będzie je wywalić, a w razie potrzeby zainstalować je między sterownikiem a aparatem. Kabelek nie jest wmontowany na stałe, wszystkie interesujące rzeczy wyprowadzone są na złączu RJ45. Zasilanie, dwie końcówki CPU, TWI i dwa przerwania. Jedno przerwanie do podłączenia do gorącej stopki, aby kontroler wiedział kiedy faktycznie aparat zrobił zdjęcie i mógł te informacje rozesłać do lamp a drugie – jakbym chciał w adapter wstawić jakiś układ wykorzystujący komunikację po I2C, i ten by chciał coś przekazać sterownikowi. Końcówki do sterowania spustem są ustawione jako Wired-AND, co znaczy że mogą tylko ciągnąć napięcie w dół. Pamiętamy, aby wyzwolić migawkę trzeba połączyć jeden z pinów do masy – CPU robi dokładnie to. Dlatego właśnie kontrolerem jest XMEGA a nie MEGA (mają tylko wyjścia totem-pole). Totem-pole działa tak – jak ustawiasz bit w porcie na 1, układ zwiera ten pin z zasilaniem, jak ustawiasz go na 0 to układ zwiera go z masą. W wired-AND pin można tylko zewrzeć do masy, układ nie utrzymuje na nim napięcia w stanie wysokim (w stanie wysokim jest „nieobecny”). Jakby utrzymywał to no… port aparatu jest już w stanie wysokim do tego stan wysoki z naszego układu i w wypadku różnic napięć obu układów można coś uszkodzić. A tak nasz kontroler jest w stanie obsługiwać dowolne napięcia do 3V3 w logice ujemnej (gdzie zwarcie do masy = aktywny). A gdyby było coś innego potrzebne, to zawsze można wstawić dodatkowy układ miedzy kontroler a aparat. Końcówki MCU na wszelki wypadek zabezpieczone diodami zenera. Więc jeśli jakimś cudem napięcie przekroczy 3V6 to dioda zewrze nóżkę do masy, i pewnie sama się przy okazji spali bo nie dałem rezystorów ograniczających prąd. No ale lepiej spalić diodę niż MCU.
USB (Host)
XMEGA ma wbudowany port USB 2.0 Full Speed. Pracuje jako port szeregowy i umożliwia zmianę parametrów pracy naszego urządzenia, a poza tym podmianę firmware. Nic o czym można by się rozpisywać, rozwiązanie wykorzystanie bo akurat było obecne w MCU, nie mogło więc leżeć odłogiem. Ale projekt numer dwa zawiera dodatkowy układ MAX3421, który jest kontrolerem USB ale nie device tylko host. Dodany jako druga forma kontroli aparatu, która dodatkowo umożliwia automatyczną zmianę parametrów zdjęć (o ile aparat obsługuje protokół PTP). Po co? Po HDR na przykład. Z automatyka aparatu mogę zrobić maksymalnie 3 zdjęcia +‑2EV. A tak nie mam takiego ograniczenia. Znaczy, nie będę miał bo układ obecny w drugim projekcie, ale jego brata MX3420 stosowałem w moim dodatku do RPI dodającym mu zegar RTC z bateryjnym podtrzymaniem, port USB device, dwa kanały PWM do sterowania LEDami, kanał do sterowania głośnikami i level-shifter I2C. Po co? Bo mogę. ;P
Radio
Układ komunikacji radiowej to RFM22B-S2, poza tym nie napisałem do jego obsługi jeszcze kodu więc jest ale nie działa. Więcej o tym będzie w kolejnej części, pewnie z większą ilością opisu „jak działa soft”.
Przyciski
5 przycisków, podłączone bezpośrednio do CPU. 4 w bezpośrednim sąsiedztwie wyświetlacza, dzięki czemu można na nim pokazywać jaką funkcję aktualnie pełnią. Jako pull-up wykorzystywane tylko rezystory MCU, aktywne w stanie niskim. To co to pull-up… to takie coś co pozwala zmienić stan nieustalony w ustalony. Bo to jest tak, można podłączyć przycisk jedną stroną do zasilania lub masy, a druga do CPU. Kiedy wciśniesz taki przycisk, konkretny pin zmieni stan na wysoki lub niski. Tylko w jakim jest wtedy stanie kiedy nie jest wciśnięty? No właśnie, w żadnym. Może być w wysokim, może w niskim, może być w takim stanie jak pin obok, pływa sobie i skacze i robi generalnie dziwne rzeczy. I do tego stosujemy pull-up albo pull-down, jakiś względnie duży rezystor, który łączy nasze wejście z masą (down) lub zasilaniem (up) – i co za tym idzie ustala jakiś jego konkretny stan kiedy „nic się nie dzieje”. Ale wracając do przycisków, ostatni przycisk jest specjalny, po podłączony do asynchronicznego przerwania. Przerwania synchroniczne od asynchronicznych różnią się w AVR tym, że aby działały potrzebny jest włączony zegar taktujący peryferia MCU. Kiedy MCU śpi/jest w stanie „power down” tego zegara nie ma, i tylko asynchroniczne przerwania mogą go z tego stanu wybudzić. Znaczy – ostatni przycisk jest tez włącznikiem/wyłącznikiem.
Wyświetlacz
LCD, z gigantycznym czasem reakcji ale za to z dużym kontrastem, nie wymaga podświetlenia w dzień. Choć w ciemnościach się ono przydaje (dlatego jest obecne). Ma jakieś 3 cale i całe 128x64px, rozdzielczości (czyli piksel wielkości około 0,5mm). Do poprawnej pracy potrzebuje 9 kondensatorów i magistrali SPI. Niestety nie da się z niego odczytywać danych, można tylko zapisywać (stąd przydatny framebuffer w RAM). Ah i tylko dwa kolory. Sterownik ST7565R. Do którego jest w sieci przynajmniej kilka bibliotek, i masa dokumentacji. A jak używamy ASF (takie biblioteki do procesorów Atmela) to tam też sterownik do tegoż znajdziemy.
I tyle na dziś, efekt (nie) końcowy jest taki:
Software się jeszcze trochę musi porozwijać (bo brak kontroli nad radiem i kilku pomniejszych funkcji jak ręczne sterowanie migawką). A jak będziecie grzeczni to mogę jeszcze napisać co trzeba skompletować, na co uważać i jaką fortunę wydać aby zbudować sobie drona:
No i oczywiście, że nie takiego "ze sklepu" bo ma kompletnie customowy odbiornik RC, dzięki czemu ma sterowanie dualshockiem i telemetrię. ;)