大塚実の取材日記

記事で書ききれなかったことなどを補足していこうと思ってます

リモートカメラで打上げを撮る!~H-IIAロケット15号機の巻(中編)

2009年12月29日 23時03分24秒 | ロボット
○では実際に作ってみる

サーボモーターのカメラへの取り付けは、近所のホームセンターで購入したクランプと金具を組み合わせることで、簡単にできた。サーボモーターは、余っていた「KRS-788HV」を使用した。トルクはそれほど必要ないので、これで十分。カメラはパナソニックの「DMC-FZ3」を使っている。

最初に、土台となる金具をクランプでしっかり固定 その上に、シャッターの位置にあわせてサーボを取り付ける


リレーはパナソニック電工のフォトMOSリレー「AQZ102」を購入。ちょっと高い(といっても700円くらいだが)ので、使い回しができるようにソケットも利用した。これを、KCB-1のデジタル出力から制御して、外部バッテリからカメラに電源を供給する。カメラ側の電源スイッチをONにしておけば、供給開始と同時にカメラを起動できる。

フォトMOSリレーのほか、ケース、コネクタ、ピンヘッダ、基板なども購入 システム構成。マイコンで、サーボの動作と、カメラの電源供給を制御する


開発したプログラムはこちら。原因は良く分からないが、タイマーの誤差が結構大きく、1時間で実際よりも12秒ほど早く動作してしまう。ただし、この誤差はランダムではなく、毎回一定なので、運用でなんとかできる感じだ。

remote.c
#include <led.h>
#include <pwm.h>
#include <wait_timer.h>
#include <pio.h>

#define target_hour 24	//システム起動(時)
#define target_min  50	//システム起動(分)

#define start_hour  03	//タイマー始動(時)
#define start_min   45	//タイマー始動(分)

void main(void)
{
	cpu_init();			//CPU初期化
	ledgrn_on();		//緑LED点灯
	
	wait_timer_init();				//タイマー初期化
	pwm8_init(PIO0, PWM_F8, 77);	//PWM初期化
	
	ledred_on();		//動作確認用の点滅
	wait_timer_sec(1);
	ledred_off();
	wait_timer_sec(1);
	ledred_on();
	wait_timer_sec(1);
	ledred_off();
	
	//指定時間だけ待機
	wait_timer_min(target_hour*60+target_min-start_hour*60-start_min);
	
	//カメラ電源投入
	pio_out(6, HIGH);
	
	//カメラ起動待ち
	wait_timer_sec(10);
	
	//撮影開始	
	pwm_start(PIO0);	//PWM出力開始

	pwm_out(PIO0, 38);
	wait_timer_sec(1);

	pwm_out(PIO0, 42);
	wait_timer_sec(1);
	
	pwm_out(PIO0, 38);

	//指定時間だけ撮影
	wait_timer_min(30);
	
	//撮影終了
	pwm_out(PIO0, 42);
	wait_timer_sec(1);
	
	pwm_out(PIO0, 38);
	wait_timer_sec(1);
}


wait_timer.h
#include <timer.h>

_Bool			flg_timer;
unsigned long	cnt_timer;

void wait_timer_init(void);
void wait_timer_ms(unsigned long);
void wait_timer_sec(unsigned long);
void wait_timer_min(unsigned long);
void wait_timer_hour(unsigned long);
void wait_timer_day(unsigned long);

// タイマー初期化
void wait_timer_init()
{
	cpu_int_set();
	ta0_set(FQ10Hz);
}

// 指定時間(ms)だけ待つ関数 ※最小単位は100ms
void wait_timer_ms(unsigned long ms)
{
	cnt_timer = ms / 100;
	flg_timer = TRUE;

	ta0_start();
	
	while(flg_timer) {};
	
	ta0_stop();
}

// 指定時間(秒)だけ待つ関数
void wait_timer_sec(unsigned long sec)
{
	wait_timer_ms(sec*1000);
}

// 指定時間(分)だけ待つ関数
void wait_timer_min(unsigned long mi)
{
	wait_timer_ms(mi*60000);
}

// 指定時間(時間)だけ待つ関数
void wait_timer_hour(unsigned long h)
{
	wait_timer_ms(h*3600000);
}

// 指定時間(日)だけ待つ関数
void wait_timer_day(unsigned long d)
{
	wait_timer_hour(d*24);
}

// 割り込みルーチン
#pragma INTERRUPT /B ta0_int(vect=21)
void ta0_int()
{
	if (--cnt_timer==0) flg_timer=FALSE;
}



動作のテスト。指定時間にカメラの電源が入り、起動を待ってから、10秒後にシャッターを押す

後編に続く。


最新の画像もっと見る