使用M5STACK控制RS485设备-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3486|回复: 0

使用M5STACK控制RS485设备

[复制链接]
发表于 2019-10-11 11:01 | 显示全部楼层 |阅读模式
本帖最后由 vany5921 于 2019-10-11 11:04 编辑

作为工业应用的解决方案,M5Stack自然不会缺席相关的应用配件,有许多用户购买了RS485以后不知道如何使用,但是了解了之后发现控制起来很容易上手。如果是一对一的设备可以直接通过串口来发送数据,如果是一对多工业产品可以使用标准的modbus协议,普通用户也可以自定义协议。下面就来介绍一下如何通过M5Stack控制PUSH6060模组 6060_push_01.jpg unit_rs485_01.png rs485_hat_01.jpg

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)
[mw_shl_code=arduino,true]Serial2.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);[/mw_shl_code]

发送数据可以使用Serial2.print(“xxx”)或者Serial.write("xxx"),关于两者的区别请参照Arduino中Serial的使用,这里不再啰嗦
[mw_shl_code=arduino,true]#Serial2.print("97");
#Serial2.write("97");[/mw_shl_code]

先思考一个问题:给你以下图片,你会怎么写程序
6060_push_02.jpg

如果你没有看懂,没关系,这就是一个简单的协议或者说是指令,任何两个设备之间通信都需要有协议,串口发送是最常见的一种方式。

上代码,看注释
[mw_shl_code=arduino,true]#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();
}[/mw_shl_code]

至于UIFlow就更加简单了,直接看图
RS485.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 09:35 , Processed in 0.082841 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表