一、只能发送指令不能收到电机返回数据的问题
最近需要用到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 |
GND | GND |
TXD | 8 |
RXD | 7 |
只与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表示返回的电机实时位置