压电电机的 Arduino MKR (RS)485 错误
Arduino MKR (RS)485 error with Piezo Motor
我的新项目有问题。
目标是通过 使用 Arduino MKR Wifi 1010 控制 我的 压电电机 RS485。
出于这个原因,我有这些组件:
Arduino MKR Wifi 1010
Arduino MKR 485 扩展板
压电电机驱动器 PM401(手册:https://piezomotor.com/wp-content/uploads/2019/03/150025_PMD401_Technical_Manual.pdf)
压电 LEGS 电机
我使用USB适配器和压电电机软件测试了RS485。那奏效了。
但是如果涉及到代码,我不会再进一步了。
我想用 ASCII 码发送压电驱动器的命令是:
X127M2;
X127J200,0,100;
(他们在 PiezoMotor DriveLab 软件中工作)
我试着用这段代码来做:
#include <ArduinoRS485.h>
int counter = 0;
void setup() {
RS485.begin(115200);
Serial.begin(115200);
RS485.receive();
}
void loop() {
RS485.beginTransmission();
if (RS485.available()){
Serial.println(RS485.read());
}
else {
Serial.write("Not available");
}
Serial.println(RS485.available());
RS485.write('X127M2;');
RS485.write('X127J200,0,100;');
Serial.print("Count No: ");
Serial.println(counter);
RS485.endTransmission();
counter ++;
delay(2000);
}
在终端我得到了类似的东西:
88
8
Count No: 1
50
15
Count No: 2
67
22
Count No: 3
我怎么知道 MKR 485 Shield 正在向 Piezodriver 发送命令而不是无处可去?终端机的号码在我看来是随机的。即使 MKR 485 Shield 没有连接任何东西,它们也会出现。
那么如何在代码中找到或设置PM401的地址呢?
还是我必须发送完全不同的命令?
它们必须以 ASCII 格式发送到 115200n81。 RS485.write('X127M2;');
行是否提供了这一点?
我有点迷茫,也因为我在那个领域没有太多经验,而且 try&error 在这里不起作用。
希望有一些提示:)
Do I need a adress? And if, how do I get it.
这在手册中有解释......阅读它!
Also is the Piezodriver Half or Full duplex?
手册只列出了一对数据引脚。所以一定是半双工的。
but the example code said it have to be Full Duplex.
MKR 485 shield 支持半双工和全双工。阅读手册。
The commands I want to send the piezodriver in ASCII Code is:
X1M2;
X1J200,0,100;
根据手册,命令以回车符-return结束。为什么在命令末尾加分号?
RS485.write(X1J200,0,100;);
和 RS485.write('X1M2;');
甚至无法编译。
替换你需要使用双引号。使用 none 或单引号将不起作用。
您的命令应该类似于 RS485.write("X1M2\r");
所以我现在明白了,这是一个愚蠢的电缆问题。 MKR 485 Shield 的 Y 输出必须转到来自 PMD401 的数据 + 和 Z 到数据 -。不是反过来,就像到处都是discriped。
这里是最终的测试代码,供所有尝试相同的人使用:
#include <ArduinoRS485.h>
int counter = 0;
void setup() {
RS485.begin(115200);
Serial.begin(115200);
RS485.receive();
}
void loop() {
RS485.beginTransmission();
if (RS485.available()){
Serial.println(RS485.read());
}
else {
Serial.write("Not available");
}
RS485.write("X127M2;");
delay(500);
RS485.write("X127J200,0,200;");
delay(2000);
RS485.write("X127J-200,0,200;");
Serial.print("Count No: ");
Serial.println(counter);
RS485.endTransmission();
counter ++;
delay(10000);
}
我的新项目有问题。 目标是通过 使用 Arduino MKR Wifi 1010 控制 我的 压电电机 RS485。 出于这个原因,我有这些组件:
Arduino MKR Wifi 1010 Arduino MKR 485 扩展板 压电电机驱动器 PM401(手册:https://piezomotor.com/wp-content/uploads/2019/03/150025_PMD401_Technical_Manual.pdf) 压电 LEGS 电机
我使用USB适配器和压电电机软件测试了RS485。那奏效了。 但是如果涉及到代码,我不会再进一步了。
我想用 ASCII 码发送压电驱动器的命令是:
X127M2;
X127J200,0,100;
(他们在 PiezoMotor DriveLab 软件中工作)
我试着用这段代码来做:
#include <ArduinoRS485.h>
int counter = 0;
void setup() {
RS485.begin(115200);
Serial.begin(115200);
RS485.receive();
}
void loop() {
RS485.beginTransmission();
if (RS485.available()){
Serial.println(RS485.read());
}
else {
Serial.write("Not available");
}
Serial.println(RS485.available());
RS485.write('X127M2;');
RS485.write('X127J200,0,100;');
Serial.print("Count No: ");
Serial.println(counter);
RS485.endTransmission();
counter ++;
delay(2000);
}
在终端我得到了类似的东西:
88
8
Count No: 1
50
15
Count No: 2
67
22
Count No: 3
我怎么知道 MKR 485 Shield 正在向 Piezodriver 发送命令而不是无处可去?终端机的号码在我看来是随机的。即使 MKR 485 Shield 没有连接任何东西,它们也会出现。
那么如何在代码中找到或设置PM401的地址呢?
还是我必须发送完全不同的命令?
它们必须以 ASCII 格式发送到 115200n81。 RS485.write('X127M2;');
行是否提供了这一点?
我有点迷茫,也因为我在那个领域没有太多经验,而且 try&error 在这里不起作用。 希望有一些提示:)
Do I need a adress? And if, how do I get it.
这在手册中有解释......阅读它!
Also is the Piezodriver Half or Full duplex?
手册只列出了一对数据引脚。所以一定是半双工的。
but the example code said it have to be Full Duplex.
MKR 485 shield 支持半双工和全双工。阅读手册。
The commands I want to send the piezodriver in ASCII Code is:
X1M2;
X1J200,0,100;
根据手册,命令以回车符-return结束。为什么在命令末尾加分号?
RS485.write(X1J200,0,100;);
和 RS485.write('X1M2;');
甚至无法编译。
替换你需要使用双引号。使用 none 或单引号将不起作用。
您的命令应该类似于 RS485.write("X1M2\r");
所以我现在明白了,这是一个愚蠢的电缆问题。 MKR 485 Shield 的 Y 输出必须转到来自 PMD401 的数据 + 和 Z 到数据 -。不是反过来,就像到处都是discriped。
这里是最终的测试代码,供所有尝试相同的人使用:
#include <ArduinoRS485.h>
int counter = 0;
void setup() {
RS485.begin(115200);
Serial.begin(115200);
RS485.receive();
}
void loop() {
RS485.beginTransmission();
if (RS485.available()){
Serial.println(RS485.read());
}
else {
Serial.write("Not available");
}
RS485.write("X127M2;");
delay(500);
RS485.write("X127J200,0,200;");
delay(2000);
RS485.write("X127J-200,0,200;");
Serial.print("Count No: ");
Serial.println(counter);
RS485.endTransmission();
counter ++;
delay(10000);
}