本帖最後由 hon829 於 2018-4-27 23:50 編輯
有D低價的藝康相機不設快門線,但有IR remote 口. 用B快門時,按一下開,再按一下關;同線控按著就開放手即關的使用不同,故唯有自行DIY件紅外線遙控.
參考了部份網上資源,有說Nikon IR remote code 及程式編碼等...
(參考: https://www.sbprojects.net/projects/nikon/index.php ... )
( 參考: http://www.instructables.com/id/ ... aps-With-ATtiny-85/ ...)
Nikon IR coding:
程式經編修如下:
//Calibartion the internal RC oscillator first!!!
// ATMEL ATTINY85 / ARDUINO
//
// +-\/-+
// Ain0 (D 5) PB5 1| |8 Vcc
// Ain3 (D 3) PB3 2| |7 PB2 (D 2) Ain1
// Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1
// GND 4| |5 PB0 (D 0) pwm0
// +----+
#include <avr/sleep.h> // Sleep Modes
#include <avr/power.h>
#ifndef cbi //Clear Bit in I/O Register
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //BV=Bit Value
#endif
#ifndef sbi //Setting Bits
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
#define InterruptPin 0 //pin 5, key button
#define led 1 //pin 6, led indicate the operation
#define IRledPin 2 //pin 7, connect to IR LED
//pin 1
//pin 2, USB+ PB3
//pin 3, USB- PB4
int Keychanged = 0; //temp value
ISR(PCINT0_vect) { //Interrupt Service Routine
Keychanged = 1;
}
void setup() {
OSCCAL = 0x52; //RC oscillator Calibartion value
pinMode(InterruptPin, INPUT_PULLUP);
pinMode(led, OUTPUT);
pinMode(IRledPin, OUTPUT);
digitalWrite(IRledPin, LOW);
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
Keychanged = 0; //no key pressed
sbi(GIMSK, PCIE);
sbi(PCMSK, PCINT0);
sei();
}
void loop(){
system_sleep(); //sleep for power saving, only wake up when key pressed
while(Keychanged == 0){} //no key pressed <<更正on 27/4 >>
cli();
SendNikonCode(); //emit IR, [137.72mS]
delay(50); //camera mini time limit
while(digitalRead(InterruptPin) == LOW){} //checking key hold
SendNikonCode();
Keychanged = 0;
sei();
}
void system_sleep() {
cbi(ADCSRA,ADEN);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
power_all_disable ();
sleep_mode();
sleep_cpu();
sleep_disable();
power_all_enable();
sbi(ADCSRA,ADEN);
}
void SendNikonCode() { //for Nikon IR control
digitalWrite(led, HIGH);
pulseIR(2000);
delayMicroseconds(26000);
pulseIR(400);
delayMicroseconds(1580);
pulseIR(400);
delayMicroseconds(3500);
pulseIR(400);
delayMicroseconds(59500); //delay 63.2mS
pulseIR(2000); //repeat 1 time
delayMicroseconds(26000);
pulseIR(400);
delayMicroseconds(1580);
pulseIR(400);
delayMicroseconds(3500);
pulseIR(400);
digitalWrite(led, LOW);
}
void pulseIR(long microsecs) { //tuned for 38kHz carrier for IR led ON/OFF
while (microsecs > 0) { // 38 kHz is about 13.1 microseconds high and 13.1 microseconds low
digitalWrite(IRledPin, HIGH);
delayMicroseconds(9);
digitalWrite(IRledPin, LOW);
delayMicroseconds(8);
microsecs -= 26;
}
}
Digispark 用Attiny85 內置振盪器,故做timing 時不太準確,有D數值要修修補補,試完再試!!
用落IR始終沒線控那樣反應爽快,只此令操作可近似些! |