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:
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ń:
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.
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); } }