移动时跟踪 Zaber 设备的位置
Track position of Zaber device while moving
我正在使用由使用 Zaber 扩展板的 Arduino 控制的 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, 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() {}
要让它在两个设备上工作,您需要在启动 while 循环之前发送两个移动命令,然后对于 while 循环,您希望重复该条件直到两个轴都空闲。在 while 循环中,您将读取两个轴的位置。
关于时间,你能说一下你现在得到的大概频率吗?每次通信的时间通常约为 5-10 毫秒。使用当前函数,isIdle() 调用采用它自己的命令,因此我预计上述循环大约为 20-40 毫秒。您可以通过从 'get encoder.pos' 回复中提取 .IsBusy 信息来将其减半。
迈克·麦克唐纳
麦克@zaber.com
我正在使用由使用 Zaber 扩展板的 Arduino 控制的 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, 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() {}
要让它在两个设备上工作,您需要在启动 while 循环之前发送两个移动命令,然后对于 while 循环,您希望重复该条件直到两个轴都空闲。在 while 循环中,您将读取两个轴的位置。
关于时间,你能说一下你现在得到的大概频率吗?每次通信的时间通常约为 5-10 毫秒。使用当前函数,isIdle() 调用采用它自己的命令,因此我预计上述循环大约为 20-40 毫秒。您可以通过从 'get encoder.pos' 回复中提取 .IsBusy 信息来将其减半。
迈克·麦克唐纳 麦克@zaber.com