Я использую линейную сцену Zaber, управляемую Arduino с помощью шилда Zaber. Я пытаюсь сделать что-то похожее на этот вопрос (Отслеживать положение Устройство Zaber при его перемещении), но с использованием языка 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() {}