Zaber シールドを使用して Arduino によって制御される Zaber リニア ステージを使用しています。私はこの質問に似たようなことをしようとしています ( Zaber デバイスの移動位置を追跡します) が、Labview の代わりに Arduino 言語を使用しています。
回答では、開始点と終了点から補間する、タイマーを使用して位置をポーリングする、または 250 ミリ秒ごとに位置を報告するデバイス モードをオンにする 3 つのオプションが提供されました。
私のステージ (X-LSQ-075B-E01) にはデバイス モードが存在しないようで、補間に依存したくありません。ステージにはエンコーダーが取り付けられており、正確な位置を簡単に読み取ることができます。移動中にステージをポーリングする方法がわかりません。次のコード (少し簡略化) を思いつきましたが、比較的遅く、1 つのステージ (実際には 2 つを使用しています) からのリードバックのみを提供し、コマンドを両方に送信しても実際には機能しません。
#include <ZaberAscii.h>
ZaberShield shield(ZABERSHIELD_ADDRESS_AA);
ZaberAscii za(shield);
void setup() {
shield.begin(115200);
Serial.begin(115200);
za.send(1, 1, "move rel", 20000);
za.receive();
while (za.isIdle(1) == false) {
za.send(1, "get encoder.pos");
ZaberAscii::reply reply = za.receive();
if (!reply.isReply) {
Serial.println("*** Received a non-reply message from device " + String(reply.deviceNumber) + ".");
}
else if (reply.isRejected) {
Serial.println("*** A command was rejected by device " + String(reply.deviceNumber) + ".");
}
else {
Serial.println( String(reply.deviceNumber) + ": " + String(reply.responseData));
}
delay(5);
}
za.pollUntilIdle(1);
Serial.println("1 finished");
za.send(2, 1, "move rel", 20000);
while (za.isIdle(2) == false) {
za.send(2, "get encoder.pos");
Serial.println("Device 2 not idle");
ZaberAscii::reply reply = za.receive();
if (!reply.isReply) {
Serial.println("*** Received a non-reply message from device " + String(reply.deviceNumber) + ".");
}
else if (reply.isRejected) {
Serial.println("*** A command was rejected by device " + String(reply.deviceNumber) + ".");
}
else {
Serial.println( String(reply.deviceNumber) + ": " + String(reply.responseData));
}
//delay(10);
}
Serial.println("2 finished");
}
void loop() {}