任天堂NDSL掌上型遊戲機+Arduino微電腦=縮時影片拍攝控制器

任天堂NDSL掌上型遊戲機+Arduino微電腦=縮時影片拍攝控制器
文∕趙英傑

大約三年前,HDR Labs採用任天堂NDSL遊戲機充當人機介面,加上一個自製的Arduino微電腦板,製作出一款開放式相機控制器(Open Camera Controller,簡稱OCC)。它可以控制照相機的快門,拍攝縮時攝影、星軌以及HDR高動態範圍相片。因為我使用的Sony NEX-5相機無法接快門線,所以我替它加入紅外線遙控功能(哦,NEX-5R和NEX-6有支援APP下載功能,相機本身即可拍攝縮時影像,我想我大概會等到Sony推出Android版的NEX系列,或者NEX-Xperia才會更換相機吧~)

有興趣的人士可以在HDR Labs網站的OCC網頁下載相關程式(含原始碼)和硬體。

操作NDSL控制單眼相機
(照片取自HDR Labs)

實際連接照相機的是Arduino微電腦板,它被製作成Game Boy遊戲卡匣形式,插接在NDSL主機前方的Game Boy遊戲卡插槽。因此,本文使用的Nintendo DS遊戲機,必須是具備Game Boy遊戲插槽的初代機種,NDSi, NDSLL和3DS等新機種都不行。

插上自製Arduino微電腦板的NDSL
(照片取自HDR Labs)

為了讓NDSL執行自製軟體,還必須額外購買R4卡和micro SD記憶卡。

底下是HDR Labs設計的印刷電路板,讀者可以照著OCC硬體介紹網頁的說明自行蝕刻一片:

自製的Arduino微電腦板
(照片取自HDR Labs)

電路板前方的兩個小IC,是隔離微電腦與相機快門線的電氣訊號的光耦合元件。這個電路跟照相機的廠牌型號無關,可以控制Canon, Nikon, Olympus, Sony, Panasonic, Casio…等廠牌的相機。

然而,不同廠牌與型號的相機快門線設計都不太一樣,這個電路輸出到快門線之間的轉換電路你要自己搞定。像Canon EOS D500單眼相機的快門線只是一個「加上兩個開關的2.5 mm立體耳機線」,所以不用外加任何電路即可使用,但Panasonic的快門線就得加上幾個電阻(請自行Google電路)。

使用《轉轉壞俐歐工坊》遊戲卡匣來包裝Arduino微電腦板

HDR Labs選用《轉轉壞俐歐工坊》(まわる メイドインワリオ)這一款遊戲的卡匣外殼來包裝。因為《轉轉壞俐歐工坊》內建一個陀螺儀感測器(Gyro Sensor),卡匣後面凸出一塊,適合放置轉接線頭:

《轉轉壞俐歐工坊》遊戲卡匣來

這是陀螺儀感測器正面的模樣:

《轉轉壞俐歐工坊》遊戲卡匣內部的陀螺儀感測器

《轉轉壞俐歐工坊》裡面包含200個以上逗趣的休閒小遊戲,遊戲不使用十字鈕操作,完全透過陀螺儀偵測主機傾斜或旋轉的方向來遊玩。這遊戲實在太有趣(看看YouTube上的這個遊戲內容介紹吧),將它拆掉很可惜。如果你不介意電路板裸露在外的話,就不必使用這個卡匣。

改造Game Boy遊戲卡匣

我用不到快門線,而且蝕刻電路板有點麻煩,所以用萬用PCB板(也稱為「洞洞板」)來組裝、焊接元件。但是,萬用PCB板並沒有像遊戲卡匣前面的條紋接點,所以我把一塊不用的Game Boy(簡稱GB)遊戲卡鋸下來。

Game Boy Advanced(簡稱GBA)的遊戲卡匣和GB卡的接點設計是一樣的,下圖左邊是GBA卡,右邊是GB卡:

GBA和GB遊戲卡的印刷電路板

底下是把鋸下來的GB卡與自製的Arduino微電腦板焊接在一起的樣子,最前方的透明LED是紅外線發射二極體

自製的Arduino微電腦板

HDR Labs選用的微處理器是ATmega168,實際上,選用ATmega8型號即可,當然,用ATmega328也行,它們之間的差別主要在於記憶體容量的大小。我在ATmega8微處理器的第15腳(也就是Arduino微電腦板的數位第9腳)焊接一個100Ω電阻和紅外線發射LED。

控制相機快門線的Arduino程式碼

底下是HDR Labs的硬體介紹網頁所刊載的Arduino程式碼,應該是打字錯誤,其中三行有誤:

int FullPressPin = 13;
int HalfPressPin = 12;
int ShutterState=LOW;  // 應該要刪除這一行
int IsShooting=0;
int x = 0;
int HeartbeatPin = 4;
volatile int state = LOW;
/*
上面一行應該改寫成:
volatile int ShutterState = LOW;
*/
void setup()
{
  pinMode(HalfPressPin, OUTPUT);     
  pinMode(FullPressPin, OUTPUT);
  pinMode(HeartbeatPin, OUTPUT);
  attachInterrupt(0, ProcessDSSignalRising, RISING);
  attachInterrupt(1, ProcessDSSignalFalling, FALLING);
  ShutterState=LOW; // de-depress shutter button if it is an unknown state
  digitalWrite(FullPressPin, ShutterState); 
  digitalWrite(HalfPressPin, ShutterState);
  
  //May 2010 Heartbeat code variation
	digitalWrite(HeartbeatPin, HIGH);
	delay(1000);
	digitalWrite(HeartbeatPin, LOW);
	delay(500);
	digitalWrite(HeartbeatPin, HIGH);
	delay(1000);
	digitalWrite(HeartbeatPin, LOW);
	delay(500);
	digitalWrite(HeartbeatPin, HIGH);
	delay(1000);
	digitalWrite(HeartbeatPin, LOW);
}
void loop()                     
{
   if (IsShooting = 0){  // 應該寫成:if (IsShooting == 0){
      ShutterState=LOW;
      digitalWrite(FullPressPin, ShutterState); 
      digitalWrite(HalfPressPin, ShutterState);
   }
}
void ProcessDSSignalRising()
{
   ShutterState=LOW;
   digitalWrite(FullPressPin, ShutterState); 
   digitalWrite(HeartbeatPin, LOW);
   digitalWrite(HalfPressPin, ShutterState);
   IsShooting=0;
}
void ProcessDSSignalFalling()
{
   ShutterState=HIGH;
   // add a delay here to make HalfPress a tad longer
   for (x=0;x< 5; x++){
     digitalWrite(HalfPressPin, ShutterState); 
   }
   digitalWrite(HeartbeatPin, HIGH);
   digitalWrite(FullPressPin, ShutterState);
   IsShooting=1;
}

上面的Arduino程式會接收從任天堂NDSL遊戲機發出的中斷訊號,在中斷訊號的下降階段(FALLING),Arduino將控制快門線的半按以及全按動作;在中斷訊號的上昇階段(RISING),Arduino將釋放快門。

透過Arduino微電腦使用紅外線遙控數位相機

Sebastian Setz開發了一個Arduino數位相機紅外線遙控程式庫”multiCameraIrControl“,能遙控Canon, Nikon, Olympus, Pentax, Sony或Minolta等相機的紅外線程式庫。

Sony NEX-5相機無法外接快門線,所以我透過這個紅外線遙控程式庫,改寫上面的程式,讓Arduino在中斷訊號的上昇階段發射紅外線來控制數位相機,改寫後的程式碼如下:

#include <multiCameraIrControl.h>

const byte FullPressPin = 13;
const byte HalfPressPin = 12;
boolean IsShooting=false;
byte HeartbeatPin = 4;
volatile boolean ShutterState=LOW;

volatile boolean IRState = false;
const byte cameraPin = 9;  // 紅外線遙控LED接在第9腳
Sony NEX(cameraPin);       // 初始化紅外線遙控程式庫

void setup()
{
  pinMode(HalfPressPin, OUTPUT);     
  pinMode(FullPressPin, OUTPUT);
  pinMode(HeartbeatPin, OUTPUT);
  pinMode(cameraPin, OUTPUT);
  attachInterrupt(0, ProcessDSSignalRising, RISING);
  attachInterrupt(1, ProcessDSSignalFalling, FALLING);
  ShutterState=LOW; 
  digitalWrite(FullPressPin, ShutterState); 
  digitalWrite(HalfPressPin, ShutterState);
  
  //May 2010 Heartbeat code variation
	digitalWrite(HeartbeatPin, HIGH);
	delay(1000);
	digitalWrite(HeartbeatPin, LOW);
	delay(500);
	digitalWrite(HeartbeatPin, HIGH);
	delay(1000);
	digitalWrite(HeartbeatPin, LOW);
	delay(500);
	digitalWrite(HeartbeatPin, HIGH);
	delay(1000);
	digitalWrite(HeartbeatPin, LOW);
}
void loop()                     
{
   if (IsShooting == false){
      ShutterState=LOW;
      digitalWrite(FullPressPin, ShutterState); 
      digitalWrite(HalfPressPin, ShutterState);
      digitalWrite(HeartbeatPin, ShutterState);
   } else {
      if (IRState) {
        IRState = false;
        NEX.shutterNow();	// 發射紅外線快門訊號
      }
   }
}
void ProcessDSSignalRising()
{
   ShutterState=LOW;
   digitalWrite(FullPressPin, ShutterState); 
   digitalWrite(HeartbeatPin, LOW);
   digitalWrite(HalfPressPin, ShutterState);
   IsShooting=false;
   IRState = true;        // 設定成「可發射紅外線」
}
void ProcessDSSignalFalling()
{
   ShutterState=HIGH;
   for (byte x=0;x< 5; x++){
     digitalWrite(HalfPressPin, ShutterState); 
   }
   digitalWrite(HeartbeatPin, HIGH);
   digitalWrite(FullPressPin, ShutterState);
   IsShooting=true;
}

編譯並上傳程式以上程式碼到ATmega8微處理器,就可以插入NDSL遊戲機使用了。

用NDSL遊戲機玩縮時攝影

每次操作快門時,電路板上的綠色LED也會跟著閃爍。此電路板安裝在任天堂NDSL遊戲機的模樣如下:

在任天堂NDSL遊戲機安裝自製Arduino板

在任天堂NDSL遊戲機上執行HDR Labs自製的”Intervalometer”縮時攝影程式(可在HDR Labs的軟體網頁下載)的外觀如下,點選底下觸控螢幕Increment後面的數字,可調整拍攝的間隔時間。這個軟體還可讀取NDSL主機的時鐘,讓你設定從某個時間開始拍攝,或者直接按下L和R鍵開始控制相機:

開啟NDSL縮時攝影軟體

附帶一提,底下的縮時影片,是一位名叫Robin Baumgarten的德國佬,使用筆者製作的Android紅外線快門與縮時攝影控制器免費軟體,加上自製的紅外線遙控發射器拍攝的(原文發表於dpreview.com論壇):

延伸閱讀

Posts created 483

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top