移动时跟踪 Zaber 设备的位置

问题描述

我正在使用由 Arduino 控制的 zaber 线性平台,使用 zaber 扩展板。我尝试做一些类似于这个问题 (Track position of a Zaber device as it moves) 的事情,但使用 Arduino 语言而不是 Labview。

在答案中提供了 3 个选项:从起点和终点进行插值、使用计时器轮询位置或打开每 250 毫秒报告一次位置的设备模式。

我的舞台 (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,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() {}

解决方法

要让它在两个设备上都能工作,您需要在开始 while 循环之前发送两个移动命令,然后对于 while 循环,您希望条件重复,直到两个轴都空闲。在 while 循环中,您将读取两个轴的位置。

关于时间,您能说一下您现在获得的频率大约是多少吗?每次通信的时间通常约为 5-10 毫秒。对于当前函数,isIdle() 调用采用它自己的命令,因此我希望上述循环大约为 20-40 毫秒。您可以通过从“获取编码器.pos”回复中提取 .IsBusy 信息将其切成两半。

麦克麦克唐纳 mike@zaber.com