キーワードから探す

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

カテゴリで絞り込む

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

ID:352
作成日: 2022/11/04

チャンネル間同期撮像を行いたいです。AIPToolやプログラムで設定するにはどうすればよいですか?

カテゴリ SDK-AcapLib2 AIPTool
対象製品 APX-3302シリーズ  APX-3324シリーズ  APX-3326シリーズ

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

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

なお、APX-3302はAPX-3324A、APX-3326Aのマスタースレーブ構成ではなく、CC信号同時起動になるため、動作が異なりますのでご注意ください。
以下では、同期元となるチャンネルをマスターチャンネル、同期するチャンネルをスレーブチャンネルとします。


[AIPToolでチャンネル間同期を行う場合]
〇APX-3302の場合
〇APX-3324A/APX-3326Aの場合

[プログラムでチャンネル間同期を行う場合]
〇プログラム例
※APX-3302又はAPX-3324A/APX-3326Aの判別はプログラム内で条件分岐しています。




[AIPToolでチャンネル間同期を行う場合]
1 Setupボタンをクリックし、「Use the CC?」をYesに設定します。
2 Step3 - CC / Strobe Setupが表示されるのでDetailをクリックします。
エリアセンサとラインセンサで設定が異なるため、以下の表を参考に設定を行ってください。

〇APX-3302の場合

設定項目 マスターチャンネル設定 スレーブチャンネル設定
Use The CC? Yes
Exposure 任意の値を設定します。
ただしCycleより小さい値を設定してください。
Cycle 任意の値を設定します。 マスターチャンネルのCC出力周期と同じ値を設定すること
Sync Ch 0に設定します。 同期するチャンネルに設定します。
マスターチャンネルがCH1の場合、1に設定します。
CC Stop チェックを付けます。


・AIPToolのマスターチャンネル設定例(APX-3302使用時)

APX-3302_master.png


・AIPToolのスレーブチャンネル設定例(APX-3302使用時)

APX-3302_slave.png




〇APX-3324/APX-3326の場合

設定項目 マスターチャンネル設定 スレーブチャンネル設定
Use The CC? Yes
Exposure 任意の値を設定します。
ただしCycleより小さい値を設定してください。
Cycle 任意の値を設定します。 以下の条件を満たした値を設定して下さい。
・カメラの制限を超えない範囲で、可能な限り早い周期であること
・マスターチャンネルのCycle(CC信号周期)より早い周期であること
Sync Ch 0に設定します。 同期するチャンネルに設定します。
マスターチャンネルがCH1の場合、1に設定します。
CC Stop チェックを付けます。


・AIPToolのマスターチャンネル設定例(APX-3324A/APX-3326A)

APX-3324-26_master.png


・AIPToolのスレーブチャンネル設定例(APX-3324A/APX-3326A)

APX-3324-26_slave.png


〇撮像開始時の注意
各設定が終わり撮像を開始する際、
撮像(Snap/Grab)はスレーブチャンネルから開始してください。

スレーブチャンネル開始後、マスターチャンネルの撮像を開始してください。
マスターチャンネルから撮像すると、
スレーブチャンネルは撮像を開始するまでの画像を取りこぼすことになります。


[プログラムでチャンネル間同期を行う場合]
以下にプログラムでチャンネル間同期を行う場合の例を記述します。
なお、エラー処理は行っていないためご注意ください。

〇プログラム例

HANDLE hDev = NULL;	// ボードのハンドル格納用
int ch_all = 0;		// 全てのch
int ch_1 = 1;		// ch1
int ch_2 = 2;		// ch2
int CCCycle_us = 30000;	// CC 出力周期
int CCWidth_us = 15000;	// CC 出力幅
int nRet = 0;		// 関数戻り値用
int CamType = 0;	// カメラタイプ
ACAPBOARDINFO abi;	// ボード情報構造体

// ボード情報を取得
AcapGetBoardInfo(&abi);

// 全てのch をオープン
hDev = AcapOpen(abi.BOARDINDEX[0].pBoardName, abi.BOARDINDEX[0].nBoardID, ch_all);

// ini ファイルで基本部分の初期設定
nRet = AcapSelectFile(hDev, ch_1, ".¥¥camera_ch1.ini", 0);
nRet = AcapSelectFile(hDev, ch_2, ".¥¥camera_ch2.ini", 0);



//////////////////////////////////////////////////////////////////
// 〇スレーブチャンネルのCC 出力周期設定はボードによって異なります。
//  APX-3302:マスターチャンネルのCC 出力周期と同じ値を設定します。
//  APX-3324 / APX-3326:カメラの制限を超えない範囲で、できるだけ短い周期に設定します。
//  また必ずマスターチャンネルのCC 出力周期より早い周期を設定してください。
// 〇外部トリガを使用する場合、ボードによって外部トリガの入力方法が異なります。
//  APX-3302:マスターチャンネルとスレーブチャンネルの両方に外部トリガを入力します。
//  APX-3324 / APX-3326:マスターチャンネルのみ外部トリガを入力します。
// 〇CC信号を出力する場合、周期も出力幅も1以上に設定しなければいけません。
//  0に設定した場合、CC信号が出力されません。
// 〇CC信号の周期は出力幅より大きく設定します。
// 〇CC信号を出力してから、CC 信号出力周期期間が終わるまで、
//  次の同期要求を受けられません。
//////////////////////////////////////////////////////////////////


// マスターチャンネルのCC 出力設定
CCCycle_us = 100 * 1000; // 100[ms]
CCWidth_us = 20 * 1000;  // 20[ms]
nRet = AcapSetInfo(hDev, ch_1, ACL_EXP_CYCLE, -1, CCCycle_us);
nRet = AcapSetInfo(hDev, ch_1, ACL_EXPOSURE, -1, CCWidth_us);

// スレーブチャンネルのCC 出力設定
nRet = AcapSetInfo(hDev, ch_2, ACL_EXPOSURE, -1, CCWidth_us);

if(memcmp(abi.BOARDINDEX[0].pBoardName, "APX-3302", sizeof("APX-3302")) == 0) {
	// APX-3302の場合
	nRet = AcapSetInfo(hDev, ch_2, ACL_EXP_CYCLE, -1, CCCycle_us);
}else{
	// APX-3324 / APX-3326の場合
	nRet = AcapSetInfo(hDev, ch_2, ACL_EXP_CYCLE, -1, CCCycle_us - 1000);
}

// CC 出力を有効
nRet = AcapSetInfo(hDev, ch_1, ACL_EXP_EN, -1, 1);
nRet = AcapSetInfo(hDev, ch_2, ACL_EXP_EN, -1, 1);



//////////////////////////////////////////////////////////////////
// ラインセンサの場合、センサの飽和を避けるため取り込み停止中でもCC信号が出力されています。
// この状態でチャンネル間同期を行った場合、
// マスターチャンネルが取り込み停止しているにも関わらず、
// スレーブチャンネルがマスターチャンネルのCC 信号に同期して、CC 信号を出力してしまい、
// 先に取込を行ってしまいますので、必ずCC 信号は停止してください。
//////////////////////////////////////////////////////////////////


// カメラの種類を取得
nRet = AcapGetInfo(hDev, ch_1, ACL_SCAN_SYSTEM, 0, &CamType);

if(CamType == 0) {
	// エリアセンサの場合、ローリングシャッタを有効にします。
	nRet = AcapSetInfo(hDev, ch_1, ACL_ROLLING_SHUTTER, -1, 1);
	nRet = AcapSetInfo(hDev, ch_2, ACL_ROLLING_SHUTTER, -1, 1);
}else{
	// ラインセンサの場合、取り込み開始前にCC信号を停止します。
	nRet = AcapSetInfo(hDev, ch_1, ACL_CC_STOP, -1, 1);
	nRet = AcapSetInfo(hDev, ch_2, ACL_CC_STOP, -1, 1);
}



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


// スレーブチャンネル(2ch)のマスター(1ch)を設定
nRet = AcapSetInfo(hDev, ch_2, ACL_SYNC_CH, -1, ch_1);

// 設定を反映
nRet = AcapReflectParam(hDev, ch_1);
nRet = AcapReflectParam(hDev, ch_2);



//////////////////////////////////////////////////////////////////
// 取り込み開始
//////////////////////////////////////////////////////////////////


// イベント登録(説明用)
nRet = AcapSetEvent(hDev, ch_1, ACL_INT_GRABEND, TRUE);
nRet = AcapSetEvent(hDev, ch_2, ACL_INT_GRABEND, TRUE);


// スレーブチャンネルを先に取込開始しなければならない
nRet = AcapGrabStart(hDev, ch_2, 5);	// 5 枚

// 100[ms]後にマスターチャンネルの取込を開始(説明用)
Sleep(100);
nRet = AcapGrabStart(hDev, ch_1, 5);	// 5 枚



//////////////////////////////////////////////////////////////////
// 取り込み停止
//////////////////////////////////////////////////////////////////


// ACL_INT_GRABEND(5枚入力完了)待ち
if(ACL_RTN_ERROR == AcapWaitEvent(hDev, ch_1, ACL_INT_GRABEND, 10000))
{ /* タイムアウトetc */ }
if(ACL_RTN_ERROR == AcapWaitEvent(hDev, ch_2, ACL_INT_GRABEND, 10000))
{ /* タイムアウトetc */ }

// ACL_INT_GRABEND後であれば停止順は自由
nRet = AcapGrabStop(hDev, ch_1);
nRet = AcapGrabStop(hDev, ch_2);

// 同期取り込みをやめる場合はスレーブ側の設定を解除
nRet = AcapSetInfo(hDev, ch_2, ACL_SYNC_CH, 0, 0);

ch間同期-タイミングチャート.png
この内容は参考になりましたか?
ご回答いただきまして、ありがとうございます。
今後の参考にさせていただきます。
ご意見・ご感想、ありがとうございます。

関連するご質問

Now Loading...

Now Loading...