リモートカメラで打上げを撮る!~H-IIAロケット15号機の巻(中編)
○では実際に作ってみる
サーボモーターのカメラへの取り付けは、近所のホームセンターで購入したクランプと金具を組み合わせることで、簡単にできた。サーボモーターは、余っていた「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秒後にシャッターを押す
後編に続く。