0%

基于ESP8266的CAN总线通信(-)

本文是基于自主设计的CA-02模块编写的基础教程系列的第一篇,在接下来的一段时间里我会继续围绕CA-02模块做一些基础教程和工程上的应用。

可能会有人对CAN总线比较陌生,在之前的博文中,我已经简单介绍了关于CAN总线的特殊性及和其他通信方式的对比,这里就不再赘述了。

这里我们为什么要用ESP8266而不是其他MCU,比如51单片机,stm32单片机等,其实实现原理上都是一样的只不过我们在使用ESP8266的时候可以使用Arduino进行编写程序,这就意味着我们可以引用其他人编写好的代码库,所谓库,就是将底层寄存器的操作封装起来,我们无需关心具体寄存器是怎么操作的,直接使用API函数编程就可以了,这对于入门来说非常容易。使用ESP8266的原因还有一个就是ESP8266自带WIFI,这就意味着我们可以做一个CAN总线的网关,无论是在智能家居、工业控制还是其他物联网的应用中,网关是必不可少的组件,所以我们只要学会使用这些,基本上实现一个智能网关就非常容易了。

预告一下ESP32的相关教程,目前来说使用ESP32作为网关的话性价比要比ESP8266要高一些,这里暂不阐明原因,后面也会有关于ESP32的教程,会具体说明原因,ESP8266作为终端设备的性价比基本上是物联网应用中最高的,所以ESP8266的学习应用是必须的

接下来我们通过一个简单的实例去看一下我们如何轻松实现CAN总线的通信

接线图

我们按照下面的图纸连接ESP8266和CA-02模块,ESP8266的开发板和最小系统板有很多种,可以使用我设计的这种开发板,也可以使用D1mini、NodeMCU等等都可以,可以购买CA-02模块,也可以使用其他基于MCP2515方案的模块,这里还是建议大家使用CA-02模块,模块板载指示灯,做了多重防护,使用比其他的要方便可靠

连线图.png

示例程序

下面的程序是使用基于Seeed_Arduino_CAN这个库编写的发送程序,使用ArduinoIDE或者VSCODE编译都可以,具体如何编译可以查看博客中关于Arduino的相关教程,实现也是很简单的

库连接 https://github.com/Seeed-Studio/Seeed_Arduino_CAN.git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <SPI.h>

const int SPI_CS_PIN = 4;
const int CAN_INT_PIN = 5;

#include "mcp2515_can.h"
mcp2515_can CAN(SPI_CS_PIN); // Set CS pin

void setup() {
SERIAL_PORT_MONITOR.begin(115200);
while(!Serial){};
while (CAN_OK != CAN.begin(CAN_125KBPS)) { // init can bus : baudrate = 125k
SERIAL_PORT_MONITOR.println("CAN init fail, retry...");
delay(100);
}
SERIAL_PORT_MONITOR.println("CAN init ok!");
}

unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void loop() {
// send data: id = 0x02, 标准数据帧, 数据长度 = 8, stmp: data buf
stmp[7] = stmp[7] + 1;
if (stmp[7] == 100) {
stmp[7] = 0;
stmp[6] = stmp[6] + 1;

if (stmp[6] == 100) {
stmp[6] = 0;
stmp[5] = stmp[5] + 1;
}
}

CAN.sendMsgBuf(0x02, 0, 8, stmp);
delay(1000); // send data per 1000ms
SERIAL_PORT_MONITOR.println("CAN BUS sendMsgBuf ok!");
}

效果

下面的展示效果是使用CA-02模块与ESP32CAN网关通信效果
1.png
下面是接入home-assistant后的示例,取can总线数据的高4字节作为温度显示