コンテンツにスキップ
これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.

焦点の移動

AUTD3 において, Pattern は送信するたびに上書きされる. したがって, 次のようなコードを実行すると, 約1秒ごとに焦点の位置が移動する.

let mut patterns = geometry.pattern_buffer();
loop {
for sign in [1.0_f32, -1.0] {
let target = center + offset((sign * 20.0) * mm, 0.0 * mm, 0.0 * mm);
autd3_rs_pattern::focus(
&geometry,
target,
wavelength,
&autd3_rs_pattern::FocusOption::default(),
&mut patterns,
);
let mut builder = client.datagram_builder();
builder.push(Pattern::new(&patterns));
for frame in &builder.build()? {
client.send_checked(frame).await?;
}
tokio::time::sleep(Duration::from_secs(1)).await;
}
}

上記のコードだとソフトウェア的にタイミングを制御している. これの精度は OS や実行環境に依存するため, より精度の高い制御が必要な場合は, FociStm / PatternStm を使用することをおすすめする.

FociStm を使用して上記と同等の動作を実現するコードは以下の通りである.

let points = [
ControlPoints::from(center + offset(20.0 * mm, 0.0 * mm, 0.0 * mm)),
ControlPoints::from(center + offset(-20.0 * mm, 0.0 * mm, 0.0 * mm)),
];
let mut builder = client.datagram_builder();
builder.push(FociStm::new(0.5 * Hz, &points, FociStmOption::default()));
for frame in &builder.build()? {
client.send_checked(frame).await?;
}

FociStm / PatternStm は AUTD3 デバイス内部でループされるため, ソフトウェアループは必要なく, 送信以降自動的に無限ループする. また, タイミングは AUTD3 デバイス内蔵のタイマーで制御されるため, 精度が高く, 解像度も最高で 25 µs 単位で指定できる. ただし, このタイマーの制約上, 出力不可能な周波数が存在する.

FociStm / PatternStm の切り替えタイミングは, 1 ループの周波数, または周期で指定する. すなわち, この場合は 2 つの焦点で 0.5 Hz (2 s) となるので, 各焦点は 1 s 出力される. なお, SamplingConfig を使用することで, 1 ループあたりではなく, サンプリング周波数, すなわち 1 焦点あたりの周波数や周期を指定することもできる.

焦点に限らず任意の Pattern を切り替えたい場合は, FociStm の代わりにPatternStm を使う.