本帖最后由 question 于 2023-11-7 16:27 编辑
一、 CAN总线
1.1 基本介绍
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的一种串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一,并最终成为国际标准(ISO 11898)。 CAN总线通常采用屏蔽或非屏蔽的双绞线,总线接口能在极其恶劣的环境下工作。根据ISO 11898的标准建议,即使双绞线中有一根断路,总线都必须能继续工作。 CAN总线是一种串行数据通信总线,其通信速率最高可达1 Mb/s。CAN系统内两个任意节点之间的最大传输距离与其位速率有关。
1.2 eps32 can接口
esp32 没标明can协议支持,有“TWAIᐪᔿ控制器”,TWAI全称Two-Wire Automobile Interface,这是乐鑫研发的通信协议,对标Bosch的CAN Bus协议。这个网友猜测应该是避开专利,TWAI兼容can协议。
二、 原理图
2.1 电源部分
电源部分使用了比较贵的器件,这个电源转换芯片10多块钱 赶上esp32模块的价格了,车上电源环境比较恶略,还是得用车规的电源芯片。
2.2 can收发器
把can信号转换成esp32能接收的信号格式,也是默认电路图。
三、 代码
代码使用Arduino进行编程,测试代码也很简单就把接收到的信号通过串口打印出来。
- #define DEBUG_FLAG 1
-
- #ifdef DEBUG_FLAG
- #define debug(x) Serial.print(x)
- #define debugln(x) Serial.println(x)
- #else
- #define debug(x)
- #define debugln(x)
- #endif
-
- // --- shield pins ---------------------
-
- #define SHIELD_LED_PIN 26
- #define SHIELD_CAN_RX GPIO_NUM_20
- #define SHIELD_CAN_TX GPIO_NUM_21
-
- #include <esp32_can.h> /* https://github.com/collin80/esp32_can */
-
-
-
-
-
- void setup() {
-
- #ifdef DEBUG_FLAG
- Serial.begin(115200);
- #endif
-
- pinMode(SHIELD_LED_PIN, OUTPUT);
-
- // flash the LED
- digitalWrite(SHIELD_LED_PIN, HIGH);
-
- debugln("");
- debugln("------------------------");
- debugln(" MrDIY CAN SHIELD");
- debugln("------------------------");
- debugln(" CAN...............INIT");
-
- /* setup CAN @500kbps */
-
- CAN0.setCANPins(SHIELD_CAN_TX, SHIELD_CAN_RX);
- if (!CAN0.begin(500000)) {
- debugln(" CAN...............FAIL");
- delay(500);
- ESP.restart();
- }
- debugln(" CAN.................OK");
- CAN0.watchFor();
-
-
- digitalWrite(SHIELD_LED_PIN, LOW);
- }
-
-
- byte i=0;
- CAN_FRAME can_message;
- // CAN message frame
- CAN_FRAME_FD message;
-
- void loop() {
-
- if (CAN0.read(can_message)) {
- debugln(" CAN0.read.................OK");
- Serial.print("ID: ");
- Serial.println(can_message.id,HEX);
- Serial.print("Extended: ");
- if(can_message.extended) {
- Serial.println("Yes");
- } else {
- Serial.println("No");
- }
- Serial.print("Length: ");
- Serial.println(can_message.length,DEC);
- for(i = 0;i < can_message.length; i++) {
- Serial.print(can_message.data.uint8[i],HEX);
- Serial.print(" ");
- }
- Serial.println();
- Serial.println();
-
- // Send out a return message for each one received
- // Simply increment message id and data bytes to show proper transmission
- // Note: this will double the traffic on the network (provided it passes the filter above)
- can_message.id++;
- for(i = 0;i < can_message.length; i++) {
- message.data.uint8[i]++;
- }
- CAN0.sendFrame(can_message);
- }
复制代码
四、 运行效果
五、 应用场景
5.1 获取和控制自己车
可以安装在自己车上,通过obd或者can总线获取车辆状态信息,也能控制车辆部分功能。控制代码自己完善因为每家车企定义的协议都不一样。
5.2 用于电机控制
可以控制大疆机甲的电机,小米机器人电机等 他们都是走的can协议,具体可以找下大佬们的文章。
六、 pcb文件
直接力创打板就行,esp32-c3用的是df的模块。
Gerber_obd_2023-10-30.zip
|