キーワードから探す

※スペースで区切って複数検索が可能です。

カテゴリで絞り込む

よく検索されるキーワード

ID:297
作成日: 2022/09/30

ボード間同期撮像を行いたいです。AIPToolやプログラムで設定するにはどうすればよいですか?

カテゴリ SDK-AcapLib2 AIPTool
対象製品 APX-3302シリーズ APX-3323シリーズ 
※APX-3324A、APX-3326Aはボード間同期撮像の機能が存在しませんのでご注意ください。

カメラの設定が、ランダムシャッタモード(※)に設定されていることが前提条件となりますが、
以下の方法でボード間で同期撮像を行うことが可能です。

※ボードから出力されるCC信号に同期して露光するモードです。
CC信号については「CC信号とは何ですか?なぜCC信号が必要なのですか?」を参照ください。


[AIPToolでボード間同期を行う場合]
○エリアセンサを使用する場合の設定
○ラインセンサを使用する場合の設定

[プログラムでボード間同期を行う場合]
○プログラム例
※エリアセンサ/ラインセンサの判別はプログラム内で条件分岐しています。




[AIPToolでボード間同期を行う場合]

1 Setupボタンをクリックし、「Use the CC?」をYesに設定します。
2 Step3 - CC / Strobe Setupが表示されるのでDetailをクリックします。
エリアセンサ、ラインセンサ使用される際に設定が異なるので以下の表を参考に設定を行ってください。

なお、これらの設定が終わったら、スレーブボード→マスターボードの順番で撮像を開始してください。


○エリアセンサを使用する場合の設定

設定項目 マスターボード設定 スレーブボード設定
Use The CC? Yes
Exposure 任意の値を設定します。
ただしCycleより小さい値を設定してください。
Cycle 任意の値を設定します。 以下の条件を満たした値を設定して下さい。
・カメラの制限を超えない範囲で、可能な限り早い周期であること
・マスターボードのCycle(CC信号周期)より早い周期であること。
Sync LT チェックは不要です。 チェックを付けます。
CC Stop チェックを付けます。
Use the External Trigger? No TTL
Mode 設定不要です。 CC 1Shot


・AIPToolのマスターボード設定例(エリアセンサ使用時)

エリアセンサボード間同期 / マスター設定  

・AIPToolのスレーブボード設定例(エリアセンサ使用時)

エリアセンサボード間同期 / マスター設定




○ラインセンサを使用する場合の設定


設定項目 マスターボード設定 スレーブボード設定
Use The CC? Yes
Exposure 任意の値を設定します。
ただしCycleより小さい値を設定してください。
Cycle 任意の値を設定します。 以下の条件を満たした値を設定して下さい。
・カメラの制限を超えない範囲で、可能な限り早い周期であること
・マスターボードのCycle(CC信号周期)より早い周期であること。
Sync LT チェックは不要です。 チェックを付けます。
CC Stop チェックを付けます。
Use the External Trigger? No TTL
Mode ※Step4 設定不要です。 CC 1Shot

Use the External Encoder? No Yes
Mode ※Step5 設定不要です。 Relative
※Absoluteでは動作しないのでご注意ください。
Start Mode 設定不要です。 CC 1Shot




・AIPToolのマスターボード設定例(ラインセンサ使用時)

AIPToolマスターボード設定例



・AIPToolのスレーブボード設定例 (ラインセンサ使用時)

AIPToolスレーブボード設定例



[プログラムでボード間同期を行う場合]

以下にプログラムでボード間同期を行う場合の例を記述します。
なお、エラー処理は行っていませんのでご注意ください。

○プログラム例

	int nBoardID_0 = 0; 	// ボードID 0
	int nBoardID_1 = 1; 	// ボードID 1
	int ch_1 = 1; 		// ch1
	int CCCycle_us = 30000; // CC 出力周期
	int CCWidth_us = 15000; // CC 出力幅
	int nRet = 0; 		// 戻り値
	int CamType = 0;	// カメラタイプ
	

	//マスターボード、スレーブボードをそれぞれオープンします。(ここではAPX-3302を使用します)
	HANDLE hDev_Master = AcapOpen("APX-3302", nBoardID_0, ch_1);
	HANDLE hDev_Slave = AcapOpen("APX-3302", nBoardID_1, ch_1);
	
	// ini ファイルで基本部分の初期設定
	nRet = AcapSelectFile(hDev_Master, ch_1, ".\\camera_ch1.ini", 0);
	nRet = AcapSelectFile(hDev_Slave, ch_1, ".\\camera_ch2.ini", 0);


	///////////////////////////////////////////////////////////////////////////////////// 
	// 
	// ○スレーブボードのCC 出力周期設定は
	//   カメラの制限を超えない範囲で、できるだけ短い周期に設定します。
	//   また、必ずマスターボードのCC 出力周期より早い周期を設定してください。
	// ○CC 信号を出力する場合、周期も出力幅も1 以上に設定しなければいけません。
	//   0 に設定した場合、CC 信号が出力されません。
	// ○CC 信号の周期は出力幅より大きく設定します。
	// ○CC 信号を出力してから、CC 信号出力周期期間が終わるまで
	//   次の同期要求を受けられません。
	// 
	///////////////////////////////////////////////////////////////////////////////////// 


	// マスターボードのCC 出力設定
	CCCycle_us = 100 * 1000;	// 100[ms]
	CCWidth_us = 20 * 1000;		// 20[ms]
	nRet = AcapSetInfo(hDev_Master, ch_1, ACL_EXP_CYCLE, -1, CCCycle_us);
	nRet = AcapSetInfo(hDev_Master, ch_1, ACL_EXPOSURE, -1, CCWidth_us);
	
	// スレーブボードのCC 出力設定
	nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_EXP_CYCLE, -1, (CCCycle_us - 1000));
	nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_EXPOSURE, -1, CCWidth_us);
	
	// CC 出力を有効
	nRet = AcapSetInfo(hDev_Master, ch_1, ACL_EXP_EN, -1, 1);
	nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_EXP_EN, -1, 1);
	
	
	
	///////////////////////////////////////////////////////////////////////////////////// 
	// 
	// ○ラインセンサの場合、
	//   センサの飽和を避けるため取り込み停止中でもCC 信号が出力されています。
	//   この状態でチャンネル間同期を行った場合、
	//   マスターボードが取り込み停止しているにも関わらず
	//   スレーブボードがマスターボードのSYNCLT に同期してCC 信号を出力してしまい
	//   先に取り込みを行ってしまいますので、必ずCC 信号は停止してください。
	// 
	///////////////////////////////////////////////////////////////////////////////////// 

	// センサの種類を取得
	nRet = AcapGetInfo(hDev_Master, ch_1, ACL_SCAN_SYSTEM, 0, &CamType);
	
	if(CamType == 0){
		// エリアセンサと接続している場合、ローリングシャッタを有効にします。
		nRet = AcapSetInfo(hDev_Master, ch_1, ACL_ROLLING_SHUTTER, -1, 1);
		nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_ROLLING_SHUTTER, -1, 1);
	}else{
		// ラインセンサと接続している場合、取り込み開始前にCC信号を停止します。
		nRet = AcapSetInfo(hDev_Master, ch_1, ACL_CC_STOP, -1, 1);
		nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_CC_STOP, -1, 1);
		
		// スレーブボードの外部トリガ(SyncLT)を一致パルスとして使用する
		nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_ENC_EN, -1, 1);
		nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_ENC_START, -1, 2);
	}
	
	

	///////////////////////////////////////////////////////////////////////////////////// 
	// 
	// ○AcapSetInfo の第4 引数を-1 にして設定の反映を保留にしておき、
	//   全ての設定が終わった後AcapReflectParam 関数で一括して設定を反映させます。
	//   (毎回設定の反映を行うと処理時間の無駄が発生します)
	// 
	///////////////////////////////////////////////////////////////////////////////////// 

	// スレーブボードの外部トリガを有効にする
	nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_EXT_EN, -1, 1);
	
	// スレーブボードのCC出力方法を外部トリガによる単発起動にする
	nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_EXT_MODE, -1, 0);
	
	// スレーブボードのSyncLTを有効にする
	nRet =AcapSetInfo(hDev_Slave, ch_1, ACL_SYNC_LT, -1, 1);
	
	//設定を反映
	nRet = AcapReflectParam(hDev_Master, ch_1);
	nRet = AcapReflectParam(hDev_Slave, ch_1);



	// イベント登録
	nRet = AcapSetEvent(hDev_Master, ch_1, ACL_INT_GRABEND, TRUE);
	nRet = AcapSetEvent(hDev_Slave, ch_1, ACL_INT_GRABEND, TRUE);
	
	// スレーブボードを先に取込開始
	nRet = AcapGrabStart(hDev_Slave, ch_1, 5); 	// 5 枚
	
	// 次にマスターボードの取り込みを開始
	nRet = AcapGrabStart(hDev_Master, ch_1, 5); 	// 5 枚



	// GRABEND(5 枚入力完了)待ち
	if(ACL_RTN_ERROR == AcapWaitEvent(hDev_Master, ch_1, ACL_INT_GRABEND, 10000))
	{ ;/* タイムアウトetc */ }
	if(ACL_RTN_ERROR == AcapWaitEvent(hDev_Slave, ch_1, ACL_INT_GRABEND, 10000))
	{ ;/* タイムアウトetc */ }
	
	// GRABEND割り込み後であれば停止順は自由
	nRet = AcapGrabStop(hDev_Master, ch_1);
	nRet = AcapGrabStop(hDev_Slave, ch_1);
	
	// 同期取込をやめる場合はマスター/スレーブ設定を解除
	nRet = AcapSetInfo(hDev_Slave, ch_1, ACL_SYNC_LT, 0, 0);

この内容は参考になりましたか?
ご回答いただきまして、ありがとうございます。
今後の参考にさせていただきます。
ご意見・ご感想、ありがとうございます。

関連するご質問

Now Loading...

Now Loading...