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);
}
}