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.
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:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Pilot do apartów fotograficznych (lustrzanek) Nikon. | |
* Przetestowany z modelem D40. | |
* | |
* Program wzorowany na projekcie ze strony: | |
* http://majsterkowo.pl/elektronika-dla-artystow-czyli-pilot-ir-do-nikona/ | |
* | |
* Hardware: | |
* - MCU ATtiny 2313 @16MHz | |
* | |
* main.c | |
* | |
* Created on: 2013-05-24 | |
* Author: Rafał Wileczek | |
*/ | |
#include <avr/io.h> | |
#include <util/delay.h> | |
#define OKRES_SGN_38KHZ 26 | |
#define POLOKRES_SGN_38KHZ 13 | |
void wyslij_1(int cykle) | |
{ | |
for (int i = 0; i < cykle; i++) | |
{ | |
PORTB = _BV(PB0); | |
_delay_us(POLOKRES_SGN_38KHZ); | |
PORTB = ~_BV(PB0); | |
_delay_us(POLOKRES_SGN_38KHZ); | |
} | |
} | |
int main(void) | |
{ | |
// PB0 - dioda IR, | |
// PB2 - LED sygnalizująca | |
// PB1 - przycisk wyzwalający, zwierający do masy | |
DDRB = 0x05; | |
PORTB = 0x02; | |
while(1) | |
{ | |
// Naciśnięcie przycisku podłączonego do PB1 zwalnia migawkę. | |
if ((PINB & _BV(PB1)) == 0) { | |
PORTB = _BV(PB2); | |
// Dwukrotne wysłanie sekwencji zwalniającej migawkę | |
// (źródło: j.w. oraz http://www.sbprojects.com/projects/nikon/index.php). | |
for (int i = 0; i < 2; i++) | |
{ | |
wyslij_1(76); | |
_delay_us(1064 * OKRES_SGN_38KHZ); | |
wyslij_1(15); | |
_delay_us(60 * OKRES_SGN_38KHZ); | |
wyslij_1(15); | |
_delay_us(136 * OKRES_SGN_38KHZ); | |
wyslij_1(15); | |
_delay_us(1211 * OKRES_SGN_38KHZ); | |
_delay_us(1212 * OKRES_SGN_38KHZ); | |
_delay_us(1211 * OKRES_SGN_38KHZ); | |
_delay_us(1212 * OKRES_SGN_38KHZ); | |
} | |
_delay_ms(1000); | |
PORTB = ~_BV(PB2); | |
} | |
} | |
} |
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.
Komentarze
Prześlij komentarz