piątek, 24 maja 2013

Pilot do lustrzanek Nikona - przeróbka projektu z serwisu Majsterkowo.pl

Jeden z moich ulubionych serwisów (dla którego wyłączam AdBlocka ;-)), czyli majsterkowo.pl, zamieścił na swoich wirtualnych łamach jakiś czas temu artykuł prezentujący projekt pilota do lustrzanek Nikona, wykonany w oparciu o Arduino (http://majsterkowo.pl/elektronika-dla-artystow-czyli-pilot-ir-do-nikona/). Autor tego projektu wykorzystał zapewne opis sekwencji zwalniającej migawkę, umieszczony pod tym adresem: http://www.sbprojects.com/projects/nikon/index.php (reverse engineering rządzi, nie ma co).
W każdym razie artykuł i opis projektu jest świetny i rzeczywiście program bardzo dobrze działa na moim Leonardo. Idąc jednak w kierunku wskazanym przez autora, postanowiłem zaimplementować jego rozwiązanie na czymś prostszym i tańszym. I możliwie mobilnym. Ze względu na szalenie nieskomplikowany charakter programu i małą jego zasobożerność, wybrałem do implementacji malutki mikrokontroler, jeden z moich ulubionych, ATtiny 2313.
Początkowe próby napisania odpowiedniego wsadu w BASCOM-ie, zarówno przy taktowaniu zegarem wewnętrznym 8MHz, jak i z zastosowaniu oscylatora zewnętrznego 16MHz, niewiele dały. Z jednej strony wywołania funkcji (procedur, podprogramów) w BASCOM-ie wprowadziły potężny narzut czasowy, z drugiej strony - po uproszczeniu programu - okazało się, że i tak procesor nie jest w stanie wygenerować odpowiedniej nośnej (czyli o odpowiedniej częstotliwości; nie chodzi bynajmniej o to, że układ nie wyrabia). Jedyną - na pocieszenie - zaletą użycia BASCOM-a było uzyskanie niewielkiego kodu wynikowego w porównaniu do tego, który wygenerował kompilator C...
Właśnie... Postanowiłem wyjątkowo zamienić BASCOM-a na C, przynajmniej dla tego projektu. Szybko się okazało, że elegancki program, w którym w szkolny wręcz sposób powtarzające się fragmenty kodu zostały ubrane w funkcje (prawie jak w oryginale), dał w wyniku kompilacji monstrualnych rozmiarów kod wynikowy. Nawet przy odpowiednio skonfigurowanej optymalizacji. Zminimalizowałem więc liczbę zdefiniowanych funkcji do jednej, resztę kodu umieszczając w funkcji main() - nagle kod wynikowy stał się bez mała dziesięciokrotnie mniejszy... W takiej postaci program oczywiście działa i można nawet pomyśleć o jego rozbudowie, mając jednak na uwadze ciągle skromne zasoby wybranego przeze mnie mikrokontrolera.
Oto więc kod źródłowy programu:



Zamiast schematu, krótki opis połączeń. Otóż zasilamy układ i podłączamy kwarc z kondensatorami według wskazań dokumentacji, dalej do pinu 0 portu B podłączamy przez rezystor ok. 220Ω diodę IR (nadawczą), do pinu 1 tego samego portu dołączamy mikrostyk zwierający do masy i na koniec do pinu 2 - diodę LED, oczywiście przez rezystor również ok. 220Ω.
Wgrywamy program i możemy robić zdjęcia na odległość :)

Ciągle jednak nie daje mi spokoju BASCOM. Muszę znaleźć istotę problemu częstotliwości sygnału nośnego - co prawda funkcje realizujące opóźnienia nie są najszczęśliwszym rozwiązaniem, a jednak avr-gcc daje radę. Ciekawe, w czym tkwi problem? Tym bardziej, że nie przeoczyłem żadnego ważnego elementu związanego z konfiguracją. Być może trzeba będzie odmierzać czas w tym programie za pomocą sprzętowego timera?

A na koniec uwaga: konstruowanie pilota do Nikona z funkcjonalnością li i tylko robienia zdjęcia, pomijając trening umysłu i aspekt ciekawostki, nie ma większego sensu. Zgrabny pilot do lustrzanek Nikona, zasilany bateryjką CR2025, można nabyć za około 15zł (wraz z kosztem wysyłki). Warto więc dodać kilka ekstra ficzerów - do czego zresztą zachęcał autor oryginalnego artykułu.