【问题标题】:Arduino MKR (RS)485 error with Piezo Motor压电电机的 Arduino MKR (RS)485 错误
【发布时间】:2021-01-14 10:15:09
【问题描述】:

我的新项目有问题。 目标是通过 RS485 使用 Arduino MKR Wifi 1010控制我的 压电马达。 出于这个原因,我有这些组件:

Arduino MKR Wifi 1010 Arduino MKR 485 盾牌 压电电机驱动器 PM401(手册:https://piezomotor.com/wp-content/uploads/2019/03/150025_PMD401_Technical_Manual.pdf) 压电腿电机

我使用 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 在这里不起作用。 希望有一些提示:)

【问题讨论】:

  • 请注意,这不是人工阅读服务。请阅读How to Ask
  • 停止编辑您的问题,阅读手册。时间投入得更好。 4 小时后,您仍然发送错误的命令。如果您期望得到响应,您可能不会用分号终止您的命令。它将抑制控制器的响应!请阅读手册。它会为你节省很多时间

标签: arduino rs485 motordriver


【解决方案1】:

我需要地址吗?如果,我如何得到它。

这在手册中有解释...阅读它!

压电驱动器是半双工还是全双工?

手册只列出了一对数据引脚。所以一定是半双工的。

但是示例代码说它必须是全双工的。

MKR 485 扩展板支持半双工和全双工。阅读手册。

我想以 ASCII 码发送压电驱动器的命令是:

X1M2;

X1J200,0,100;

根据手动命令以回车结束。为什么要在命令末尾加上分号?

RS485.write(X1J200,0,100;);RS485.write('X1M2;'); 甚至无法编译。

替换你需要使用双引号。使用无引号或单引号将不起作用。

您的命令应该类似于RS485.write("X1M2\r");

【讨论】:

  • 地址,我的意思是,如果我必须用 Arduino 扫描(或类似的东西)。当我将 SDA 和 SCL 引脚用于屏幕时,我就这样做了。所以我想,也许它很相似。啊,好吧,所以是半双工 :) thx 在这里的代码中只是错误的。之前做了一些更改,并得到了那个错误。就在一秒钟前看到的。对此感到抱歉。
  • SDA/SCL 是 I2C。如果您不知道从机的 I2C 地址,则只需扫描即可。如果您忘记了为控制器设置的地址,您将在此处发送到广播地址。
  • 我使用了RS485.write('X1M2;'); 命令,因为他们使用压电软件。所以我想在那里终止一个错误。我也添加了该代码部分,但没有得到任何响应。 if (RS485.available()){ Serial.println(RS485.read()); } else { Serial.write("Not available"); } 那么我怎么知道,驱动程序得到了我的命令?
  • 请不要通过 cmets 添加更多代码。接收模式是否启用?请更新您的问题或发布新问题。我回答了您在问题中发布的所有问题。在 cmets 中开始讨论只会造成混乱
  • 啊抱歉,我也这么想,但不知道如何更好地处理它。第一次来这里。非常感谢您的帮助!
【解决方案2】:

所以我现在明白了,这是一个愚蠢的电缆问题。 MKR 485 Shield 的 Y 输出必须到 PMD401 的数据 +Z 到数据 -。不是绕过去,就像它无处不在。

这里是所有尝试相同的人的最终测试代码:

#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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多