0

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() {}
4

1 に答える 1