使用M5STACK控制RS485设备
本帖最后由 vany5921 于 2019-10-11 11:04 编辑作为工业应用的解决方案,M5Stack自然不会缺席相关的应用配件,有许多用户购买了RS485以后不知道如何使用,但是了解了之后发现控制起来很容易上手。如果是一对一的设备可以直接通过串口来发送数据,如果是一对多工业产品可以使用标准的modbus协议,普通用户也可以自定义协议。下面就来介绍一下如何通过M5Stack控制PUSH6060模组
6060PUSH是一个集成了步进电机的直线模组,或者说是线性驱动器,主要通信接口采用的就是RS485,模组提供了多个安装孔位,固定起来比较方便。使用RS485的好处就是可以实现较远距离的控制,同时可以多机通信,用在工业方案上稳定可靠。
前面提到RS485可以通过串口来控制,那么我们需要RS485转串口的单元模块进行连接。无论M5Stack还是M5StickC都有相应的配件。ESP32有三个串口,其中串口0连接USB作为下载和调试使用,外接设备可以使用串口1和串口2,以下将以串口2为例,讲解如何使用RS485
特别提醒,RS485的波特率默认设定为9600
在程序初始化时定义串口2,通常情况下M5Stack的串口为16(RX_PIN)和17(TX_PIN),M5StickC的串口为33(RX_PIN)和32(TX_PIN),HAT串口为26(RX_PIN)和0(TX_PIN)
Serial2.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
发送数据可以使用Serial2.print(“xxx”)或者Serial.write("xxx"),关于两者的区别请参照Arduino中Serial的使用,这里不再啰嗦
#Serial2.print("97");
#Serial2.write("97");
先思考一个问题:给你以下图片,你会怎么写程序
如果你没有看懂,没关系,这就是一个简单的协议或者说是指令,任何两个设备之间通信都需要有协议,串口发送是最常见的一种方式。
上代码,看注释
#include <M5Stack.h>
#define RX_PIN 16
#define TX_PIN 17
#define X_LOCAL 40
#define Y_LOCAL 40
#define X_OFF 160
#define Y_OFF 30
int distance = 0; //电机移动步进值
void header(const char *string, uint16_t color){ //显示标题
M5.Lcd.fillScreen(color);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextColor(TFT_MAGENTA, TFT_BLUE);
M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLUE);
M5.Lcd.setTextDatum(TC_DATUM);
M5.Lcd.drawString(string, 160, 3, 4);
}
void setup() {
M5.begin();
M5.Power.begin();
header("PUSH 6060", TFT_BLACK);
M5.Lcd.setTextFont(2);
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
Serial2.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); //配置串口 2
delay(500);
Serial2.print("ID=123\r\n"); //串口2输出指令 ID=123\r\n, 这句话的意思是配置模组的ID号为123
}
void loop() {
if(M5.BtnA.wasPressed()){ //根据图片的标注 发送ID\r\n获取ID,获取到的ID会在串口打印
Serial2.print("ID\r\n");
}
if(M5.BtnB.wasPressed()){ //控制模组移动,这里电机移动的步进值是绝对值,不是增量!也就意味着如果两次发送同样的数据,第二次的数据并不会使电机移动。
if(distance < 50){
distance +=10; //每次按下按键,增加10个步进值
Serial2.printf("ID123:X%d\r\n",distance); //移动到指定位置
}
}
if(M5.BtnC.wasPressed()){ //发送电机回位归零的指令
Serial2.print("ID123Z\r\n");
}
if(Serial2.available()){ //串口打印串口2接收到的数据
char c = Serial2.read();
Serial.print(c);
}
M5.update();
}
至于UIFlow就更加简单了,直接看图
页:
[1]