arduino实现RS485通信控制电机

一、只能发送指令不能收到电机返回数据的问题

最近需要用到arduino单片机控制多个电机运动,由于串口通信比较简单,所以考虑采用RS485通信,控制多个电机运动,但买回TTL转RS485模块后,验证过程发现只能用来发送数据控制电机运动,却无法收到电机返回的数据,所以四处找资料,找原因,终于看到一篇文章相关的操作能够解决这个问题:Arduino + RS485测温装置_arduino rs485-CSDN博客

二、具体实现

1.硬件实现

arduino uno板

TTL转RS485模块(淘宝上有卖,直接搜名字就可以)

可以支持RS485通信的电机驱动

2.接线

TTL转RS485模块与arduino的接线可以根据淘宝上购买模块的时候,简介图判断接线方法。我买的板子,后面有印上具体的接线方法:

本来arduino uno的板子上硬接口是0是RX,1是TX,但用这个硬接口会出现前面所说的只能发送指令不能接收数据的问题,估计就是因为串口原因,后面采用软接口就好,软接口可以是任意的数字引脚,自己指定即可。

具体接线如下:

TTL转485模块引脚arduino单片机引脚
VCC        +5V
GNDGND
TXD        8
RXD7

只与TTL与RS485模块与驱动电机接线就比较简单:GND接GND,A接A,B接B即可完成接线。

3.程序代码

#include<SoftwareSerial.h>//使用软串口
//unsigned char order[13] = {0x01, 0xFD,0x01,0x00,0xDC,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0x6B};
uint8_t order[13] = {0x01, 0xFD,0x01,0x00,0x0C,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0x6B};//控制电机运动指令
uint8_t order2[4] = {0x01, 0x36,0x6B};//读取电机实时位置指令
String data = ""; // 接收到的16进制字符串
uint8_t datasave[16]={0};
SoftwareSerial motorSerial(8, 7);  // 8代表的是RX,7代表的是 TX
//TTL转485模块是tx接rx,rx接tx,所以接线图如表格所示

void setup() {
  // put your setup code here, to run once:
  motorSerial.begin(115200);
  Serial.begin(115200);

}

void loop() {
  // put your main code here, to run repeatedly:
  delay(500);//延时
  motorSerial.write(order,13);//输入控制电机转动一定角度的指令
  delay(100);//延时等待数据返回
  int k=0;
  while(motorSerial.available()){
    //unsigned char d=motorSerial.read();
    //unsigned char 的范围是0-255,与uint8_t的范围是一样的
    //Serial.print(d,HEX);
    //Serial.print(",");

    datasave[k]=(uint8_t)motorSerial.read();
    Serial.print(datasave[k],HEX);
    Serial.print(",");
    k++;    
  }
  Serial.println();//换行

  delay(1000);//等待串口输出结束
  motorSerial.write(order2,3);//输入读取电机实时角度的命令
  delay(100);//延时等待数据返回
  k=0;
  while(motorSerial.available()){
    //unsigned char d=motorSerial.read();
    //unsigned char 的范围是0-255,与uint8_t的范围是一样的
    //Serial.print(d,HEX);
    //Serial.print(",");

    datasave[k]=(uint8_t)motorSerial.read();
    Serial.print(datasave[k],HEX);
    Serial.print(",");
    k++;    
  }
  Serial.println();//换行

}

三、验证结果

其中1,FD,2,6B——是电机成功收到位置控制指令的返回值

1,36,1,0,4A,F7,CC,6B——是读取电机实时位置的返回值,其中0,4A,F7,CC表示返回的电机实时位置

通常,在工业中,我们有几种机器和设备(PLC,CNC,变频器)来控制和监视最多样化的工业过程。 为了使所有这些设备一起工作,必须在它们之间建立通信网络。 但是,由于电动机,螺线管和其他执行器的激活,该行业环境中存在许多电磁干扰。 RS485通信标准是通信网络的物理层,可以实现多种协议,例如Modbus,Profibus等。 RS485通信标准适合在行业中实施,因为它接受几种网络拓扑,例如星形和环形。 它允许长距离通信,并使用双绞线电缆。由于我们具有差分通信信号,因此该电缆模型减少了电磁干扰,这有助于更好地抵抗噪声和电磁干扰。 除了RS485通讯之外,还有RS232通讯。它允许以点对点模式进行网络通信,并且遭受电磁干扰的影响更大。 但是,许多设备具有RS232通信,需要长距离传输数据。为此,我们需要使用称为MAX485的集成电路。 该集成电路在使TTL逻辑电平适应RS485通信所需的逻辑电平中发挥作用。 如今,已经有使用该集成电路的现成的低成本模块。它们允许信号调理并促进不同设备之间的通信。 因此,由于其坚固性,RS485通信可用于任何类型的环境。 因此,在本文中,我们将学习如何监视环境温度以及如何通过两个Arduino之间的串行/ RS485通信接收测量值。 Arduino Slave(发送器)将使用DS18B20数字传感器执行温度测量,并将测量值通过串行/ RS485发送到Arduino主设备(接收器),该设备将在LCD显示屏上写入20 x 4 I2C接收的温度值。 因此,通过本文您将学到: 在原型板上执行电路组装; 了解RS 485模块的操作; 了解DS18B20传感器的工作原理; 创建通信协议; 使用有线通信网络进行远程温度监控; 现在,我们将开始通过RS485串行通信使用DS18B20传感器进行温度监控项目的开发的完整介绍。 通过RS485串行通信使用DS18B20传感器开发温度监控项目 在图3中,我们具有项目组装所需的原理图电路。Arduino Uno将成为主机(接收器),它将接收温度测量值并将在LCD显示屏上显示20 x 4 I2C。 Arduino Nano将作为从设备(发送器),它将读取DS18B20传感器并通过RS485模块发送测量值。 现在,让我们转到设置项目所需的材料清单。 带有DS18B20和RS485模块的Arduino项目 温度传感器DS18B20是数字温度传感器,因为要传输信息,它使用协议1-Wire。 1-Wire协议由Dallas Semiconductor和Maxim制造。 1线总线对设备使用主/从概念。 微控制器是主机,外围设备是从机。 在制造过程中,每个设备都会收到一个唯一的ID,即设备标识号(地址),以便在有很多设备时可以在总线上对其进行标识。 信息格式: 1线仅使用一条数据线,并使用长脉冲和短脉冲表示1和0。60微秒脉冲表示0,15微秒脉冲表示1。 在VCC与DS18B20传感器的信号引脚之间必须使用4K7的上拉电阻,以使微控制器与传感器之间的通信稳定。 将发射器和接收器电路组装到原型板上之后,我们可以在图6中看到原型板上的物理组装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值