コンテンツにスキップ

焦点の移動

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

let mut phases = geometry.phase_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,
&mut phases,
);
client.send(Pattern::new(&phases, Intensity::MAX)).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 config = SamplingConfig::from_freq(1.0 * Hz)?;
client.send(FociStm::new(config, &points, FociStmOption::default())).await?;

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

FociStm / PatternStm の切り替えタイミングは, SamplingConfig で指定する.

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