question 发表于 2023-11-7 16:26:16

esp32-c3做个汽车OBD盒子

本帖最后由 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_FLAG1

#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,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++;
                }
                CAN0.sendFrame(can_message);
}四、 运行效果








五、 应用场景

5.1 获取和控制自己车
可以安装在自己车上,通过obd或者can总线获取车辆状态信息,也能控制车辆部分功能。控制代码自己完善因为每家车企定义的协议都不一样。
5.2 用于电机控制
可以控制大疆机甲的电机,小米机器人电机等 他们都是走的can协议,具体可以找下大佬们的文章。


六、 pcb文件
直接力创打板就行,esp32-c3用的是df的模块。



页: [1]
查看完整版本: esp32-c3做个汽车OBD盒子