Arduino jako pilot podczerwieni do Nikona

Wysyłanie sygnałów za pomocą Arduino i diody typu IR [infrared light-emitting diode] nie jest rzeczą bardzo prostą. Rozgryzam temat, póki co udało mi się zbudować prosty układ wyzwalający sygnałem podczerwonym migawkę w moim D90.

Połączenia:

IR_NIKON_connections

Potrzebne części:
R1 – 220R
R2 – 470R
Dioda IR
Dioda LED
mikrowłącznik

Pomysł pochodzi ze strony majsterkowo. Trochę zmodyfikowałem kod. Dodałem podwójny warunek ze zmienną lastButtonState. Wyrzuciłem też jeden delay. Z moim Nikon D90 chodzi świetnie, chociaż muszę popracować nad odległością. Pewnie dodam tranzystor. Oto schemat połączeń:

IR_D90_yar_sch1

Na zdjęciu moment wysyłania kodu IR i uruchamiania migawki. Zdjęcie zrobione aparatem Nikon D90. Pamiętajcie o ustawieniu wyzwalania za pomocą zdalnego pilota w aparacie.

IR_D90_yar

Kod:

int diodaIR = 8; // PIN diody IR
int diodaLED = 9; // PIN diody LED
int button = 5;

int buttonState = 1; //bieżący stan przycisku
int lastButtonState = 0; //poprzedni stan przycisku

const int okres_sygn_38kHz = 26; // okres trwania 1 taktu sygnału o częstotliwości 38kHz [mikrosek.] (T=1/f)

// Funkcja opisująca działanie pojedynczego taktu sygnału
void sygnal_38kHZ(){
 digitalWrite(diodaIR, HIGH);
 delayMicroseconds(okres_sygn_38kHz / 2); // połowa okresu => współczynnik wypełnienia = 0,5
 digitalWrite(diodaIR, LOW);
 delayMicroseconds(okres_sygn_38kHz / 2); 
}

// Funkcja opisująca stan niski
void stan_1(int ilosc_cykli){
 for(int i = 0; i < ilosc_cykli; i++)
 sygnal_38kHZ();
}

// Funkcja opisująca stan wysoki
void stan_0(int ilosc_cykli){
 delayMicroseconds(ilosc_cykli * okres_sygn_38kHz);
}

// Funkcja generująca sygnał wyzwalający Nikon
void zrobZdjecie(){
 digitalWrite(diodaLED, HIGH); // sygnalizacja LED wykonywania zdjęcia
 for (int i=0; i < 2; i++) { // sygnał wzrocowy ma być powtórzony 2x
 stan_1(76); // 76 cykli "1"
 stan_0(1064); // 1064 cykli "0"
 stan_1(15); // 15 cykli "1"
 stan_0(60); // 60 cykli "0"
 stan_1(15); // 15 cykli "1"
 stan_0(136); // 136 cykli "0"
 stan_1(15); // 15 cykli "1"
 stan_0(2423*2); // 2423 cykli "0"
 }
 delay(100); //trzeba było przedłużyć, gdyż czas wysyłania 
 //informacji do aparatu był za krótki
 digitalWrite(diodaLED, LOW);
}


void setup() { 
 Serial.begin(9600);
 pinMode(button, INPUT_PULLUP); 
 pinMode(diodaIR, OUTPUT); 
 pinMode(diodaLED, OUTPUT); 
} 

void loop(){ 
 buttonState=digitalRead(button);
 if (buttonState == lastButtonState && buttonState == LOW){ 
 zrobZdjecie();
 Serial.println(F("ROBIE ZDJECIE")); 
 digitalWrite(diodaLED, HIGH);
 lastButtonState = buttonState;
 
 }
 else
 { 
 Serial.println(buttonState); 
 digitalWrite(diodaLED, LOW); 
 }
 
}

Dodaj komentarz