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]