2008년 7월 1일 화요일

인터벌 촬영이 안되도 인터벌 촬영하기

지난 포스트에 소개했던 [카메라 셔터 트리거](http://web.suapapa.net:8080/wordpress/?p=269)를 사용해 인터벌 촬영을 시도해 봤습니다.

![](http://commondatastorage.googleapis.com/suapapablog%2Fuploads%2F2008%2F07%2Fbean_seeded.jpg)

- 준비물 : DSLR, 삼각대, Arduino, 셔터트리거, 콩, 흙, 컵, 물

콩에 물을 주며 5일 가량이 지나자 싹이 올라오기 시작했습니다. 삼각대에 카메라를 설치하고 Arduino 셔터 트리거를 연결하여 준비 완료!

아래의 에니메이션 GIF가 그 결과물 입니다.

![쑤~욱~](http://commondatastorage.googleapis.com/suapapablog%2Fuploads%2F2008%2F07%2Fbean_poping.gif)

> 쑤~욱~

7시간 동안 10분 간격으로 촬영한 Raw이미지들을(45장 가량) ufraw-batch를 통해 일괄 변환하고,
GIMP를 사용해 프레임간격을 100ms로 설정하여 에니메이션 GIF로 만들었습니다.

조명을 잘못 생각하고 설치해서 -역광으로- 콩이 너무 까맣게 나왔네요. :(
하지만 인터벌 트리거 기능이 없는 펜탁스 K100D로도 이런게 가능하다는걸 확인할 수 있었습니다. :)

다음의 Arduino 코드를 사용했습니다.

// Arduino Interval Trigger
// Homin Lee
// 6-24-2008
// http://www.suapapa.net

#define GROUND_PIN 4
#define FOCUS_PIN 3
#define SHUTTER_PIN 2
#define LED_PIN 13

// adjust following three values for interval
long INTERVAL_HOUR = 0;
long INTERVAL_MIN = 10;
long INTERVAL_SEC = 0;

long previousMillis = 0;
long interval = 0;

static void do_focus()
{
digitalWrite(FOCUS_PIN, LOW);
delay(800);
digitalWrite(FOCUS_PIN, HIGH);
}

static void do_shutter()
{
digitalWrite(SHUTTER_PIN, LOW);
delay(800);
digitalWrite(SHUTTER_PIN, HIGH);
}

static void count_led(long elaspe)
{
if ((elaspe/1000)%2 == 0)
digitalWrite(LED_PIN, HIGH);
else
digitalWrite(LED_PIN, LOW);
}

void setup()
{
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);

pinMode(GROUND_PIN, OUTPUT);
digitalWrite(GROUND_PIN, LOW);

pinMode(FOCUS_PIN, OUTPUT);
digitalWrite(FOCUS_PIN, HIGH);

pinMode(SHUTTER_PIN, OUTPUT);
digitalWrite(SHUTTER_PIN, HIGH);

previousMillis = 0;
// shutter interval in ms
interval = (INTERVAL_HOUR*60*60 + INTERVAL_MIN*60 + INTERVAL_SEC)*1000;

do_shutter();
}

void loop()
{
long elaspe = millis() - previousMillis;
if (elaspe < 0)
elaspe = elaspe + 2147483647; // long max value; 2,147,483,647

if (elaspe >= interval) {
previousMillis = millis();
do_focus(); // wake up camera
do_shutter(); // take it!
} else {
count_led(elaspe);
}
}

-알려진 문제점 : 인터벌 타임을 체크하기 위해 millis()를 사용했는데 이 함수가 long type의 크기 제한으로 인해 7시간 이후에 오버플로우 되는 현상이 있습니다. 소스 코드의 Todo 부분에 이부분의 처리가 필요합니다.-

다음의 Arduino 012 버젼 부터는 millis의 제한이 4일 정도로 늘어난다고 하네요. long 보다 더 큰 타입을 사용하였거나, millis()의 단위를 수정했지 싶습니다.

하지만, 그와 상관 없이, 오버 플로우 되었을때 long의 최대값을 더해주어 이 문제를 수정했습니다. 위의 소스에 적용됨. 이제 무제한의 기간동안 카메라를 부려 먹을 수 있습니다. 하악하악.

댓글 5개:

  1. 아아.. 이것은 다큐같은데서나 보던 바로 그 고속 재생!!!
    나도 디카하나 살까..

    답글삭제
  2. [...] bootloader being burned on the boards by SparkFun). 새로 나온 아두이노에 대한 지원, 인터벌 셔터 트리거에서 언급했던 millis의 가용 범위 확장, 많이 사용되는 라이브러리들이 기본 [...]

    답글삭제
  3. interval = (INTERVAL_HOUR3600 + INTERVAL_MIN60 + INTERVAL_SEC)*1000;

    이게 맞는 건가요...?
    요즘 인터벌 쉴드 만드려고 노력중입니다..
    항상 많은 도움 받고 있는데.. 염치불구하고 물어봅니다.. ^^;

    답글삭제
  4. 블로그를 업그레이드 하면서 예전에 썼던 포스트들의 포멧이 깨진게 좀 있군요. 지적하신 소스 포함해서 포멧을 수정해 두었습니다.

    답글삭제
  5. suapapa님... 위 소스에서 Stop/Start 버튼 기능을 넣으려면 어떻게 접근해야 하나요...?

    답글삭제