使用 Arduino 製作電子快門線:縮時攝影利器

許多單眼相機都支援快門線,可以幫助攝影師在不晃動相機的情況下按下快門。不過一般的快門線通常只有一個按鈕,分兩段壓下,輕按對焦,重按快門。若須定時壓下快門便需使用電子快門線 — 通常要價不菲。若您剛好有這方面的需求,又不想破費,可以考慮自己做一個電子快門線。

一、材料表

  1. Arduino UNO Board
  2. 16×2 LCD (筆者使用 PVC160203P 14腳無背光)
  3. 可變電阻
  4. 一段式開關
  5. 紅綠LED
  6. 220 ohm 電阻兩只
  7. 紅外線接收器與紅外線遙控器(非必要)
  8. 2.5mm 立體聲耳機接頭 (接頭處兩條黑線, 適用於 Canon 系列單眼)
  9. 繼電器 (可接受5V輸入者即可)
  10. 杜邦排針及杜邦端子若干
  11. 多芯細電線若干
  12. Arduino 電源接頭(圓形) + 9V電池座(或1.5V電池六顆)
  13. 電工膠帶或熱縮管
  14. 塑膠盒或手持鑽孔機(若無可用紙盒+美工刀代替)
  15. 電烙鐵及焊錫

二、製作快門線接頭

如上圖所示,請將 2.5mm 立體聲耳機接頭後端轉開,使用三用電表轉到電阻最小檔,找到三段接頭和後面接點的對應。

相機快門線的運作原理非常簡單,當快門線(1)和地線(3)導通時,快門就會擊發,當對焦線(2)和地線(3)導通時,相機就會對焦(僅限AF自動對焦模式)。

至於快門開啓時間,則是看相機的快門曝光時間而定。筆者在 Canon 600D 相機上實測,無論快門線(1)和地線(3)導通多久,都不會影響相機的快門曝光時間(Tv模式)

請拿三條等長電線,做好記號後與 2.5mm 耳機接頭連接,較長的三條電線可綁成麻花處理,美觀又易收納。

三、連接 Arduino 與各元件

 

1.連接LCD和可變電阻

請參閱LCD隨附的規格表,使用杜邦與杜邦針(如上圖)將LCD的針腳連接到 Arduino 的 Digital I/O上

  • LCD(1) Vss       ->     Arduino GND
  • LCD(2) VDD    ->     Arduino 5V
  • LCD(3) Vo        ->     可變電阻(2)
  • LCD(4) RS        ->     Arduino Digital I/O 12
  • LCD(5) R/W    ->    Arduino GND
  • LCD(6) E          ->    Arduino Digital I/O 11
  • LCD(7-10)        ->    不用接
  • LCD(11-14)       ->    Arduino Digital I/O 7-4
  • 可變電阻(1)      ->    Arduino 5V
  • 可變電阻(3)      ->    Arduino GND

2.連接LED

將 LED 的正極(腳長者)接到 220 ohm 的電阻,再接到 Digital I/O 9 – 10 ,LED負極全部接GND

3.連接紅外線接收器

請參閱下圖,將 VOUT 接到 Digital I/O 8

4.連接開關與電池座

非常簡單,相信各位都會了

5.連接繼電器

通常繼電器有4-5個針腳,請找到兩個針腳(可用3個1.5V電池,碰到會發出「喀」一聲的兩個腳),一個接到 Arduino 5V,一個接到 Digital I/O 2

另外找到常斷的兩隻腳(「喀」一聲時接通),將快門線與地線焊接上去。

6.處理GND和5V不足的問題

如果你沒有 Arudino 擴充版 ( Extension Board ) ,你可能會面臨 5V 和 GND 接頭不夠用的狀況,這時可以將杜邦針上焊接一條垂直的電線,並將下面多餘的杜邦針剪掉,如下圖

四、製作盒子

這步驟純看個人喜好,筆者一開始是用沖泡咖啡紙盒+美工刀挖洞。最近買了一個55元的Project Box加上手持電鑽,經過一番苦功,終於鑽出那幾個洞(記得戴護目鏡+口罩啊,護目鏡在五金行有賣,很便宜)

五、寫入 Arduino 程式

請將你的 Arduino UNO 板接上電腦,並打開 Arduino IDE 貼入以下程式碼

#include <LiquidCrystal.h>
#define SHUTTER_PRESS_INTERVAL 200  // 按下快門時間 (ms)
#define SHUTTER_INTERVAL 5 // 每次快門間隔 (sec)
#define TIMELAPSE_FRAMERATE 24 // 縮時攝影格率 (Frames per sec)

// 宣告 LCD 針腳
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
// 紀錄 LCD 所在行數
bool lcdCurrentLine = 0;

// 宣告 LCD 與繼電器針腳
const int ledPin = 10;
const int cameraPin = 3;

bool down = false;
int captureCount = 0;

void setup()
{
  pinMode( ledPin, OUTPUT );
  pinMode( cameraPin, OUTPUT );

  // 繼電器不導通
  digitalWrite( cameraPin, HIGH );

  // 開啟 LCD
  lcd.begin(16, 2);
}

void capture(bool control)
{
  if( control)
  {
    // 開LED與繼電器
    digitalWrite( cameraPin, LOW );
    digitalWrite( ledPin, HIGH );

    down = true;
    captureCount++;
    delay(SHUTTER_PRESS_INTERVAL);

    // 關LED與繼電器
    digitalWrite( cameraPin, HIGH );
    digitalWrite( ledPin, LOW );
  }
  else
  {
    down = false;
  }
}

void lcdNewLine()
{
  lcdCurrentLine = !lcdCurrentLine;
  lcd.setCursor(0, lcdCurrentLine);
}

void loop()
{
  capture(true);

  int sec,mins,hr,psec,pmin,times;
  for( int i = 0; i < SHUTTER_INTERVAL; i++ )
  {
    lcd.clear();
    lcd.setCursor(0 ,0);
    lcdCurrentLine = 0;

    times = millis() / 1000;

    sec = times ;
    mins = times / 60 ;
    hr = times / 3600 ;

    psec = sec - 60 * mins;
    pmin = mins - 60 * hr;

    // 顯示一般時間
    lcd.print("Time:   ");
    lcd.print(hr);
    lcd.print(":");
    lcd.print(pmin);
    lcd.print(":");
    lcd.print(psec);
    lcdNewLine();

    times = millis() / (TIMELAPSE_FRAMERATE * SHUTTER_INTERVAL * 1000);
    sec = times ;
    mins = times / 60 ;
    hr = times / 3600 ;

    psec = sec - 60 * mins;
    pmin = mins - 60 * hr;

    // 顯示縮時攝影時間
    lcd.print("MVTime: ");
    lcd.print(hr);
    lcd.print(":");
    lcd.print(pmin);
    lcd.print(":");
    lcd.print(psec);

    delay(1000);
  }
}

What’s Next?

以上的程式已經達成縮時攝影的基本需求了,但是並沒有利用到紅外線遙控器與接收器,至於要如何幫這台機器加上遙控快門的功能呢?筆者推薦 IRRemote 這個 Arduino Library,大家可以自己下載試玩,或參考 Cooper Maa 的網站。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s