[ESP8266/ESP32]esp32-c3做个汽车OBD盒子 精华

21768浏览
查看: 21768|回复: 0

[ESP8266/ESP32] 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模块的价格了,车上电源环境比较恶略,还是得用车规的电源芯片。
esp32-c3做个汽车OBD盒子图1

2.2 can收发器
把can信号转换成esp32能接收的信号格式,也是默认电路图。
esp32-c3做个汽车OBD盒子图2


三、 代码

代码使用Arduino进行编程,测试代码也很简单就把接收到的信号通过串口打印出来。
  1. #define DEBUG_FLAG  1
  2. #ifdef DEBUG_FLAG
  3. #define debug(x) Serial.print(x)
  4. #define debugln(x) Serial.println(x)
  5. #else
  6. #define debug(x)
  7. #define debugln(x)
  8. #endif
  9. // --- shield pins ---------------------
  10. #define SHIELD_LED_PIN 26
  11. #define SHIELD_CAN_RX GPIO_NUM_20
  12. #define SHIELD_CAN_TX GPIO_NUM_21
  13. #include <esp32_can.h>      /* https://github.com/collin80/esp32_can */
  14. void setup() {
  15. #ifdef DEBUG_FLAG
  16.   Serial.begin(115200);
  17. #endif
  18.   pinMode(SHIELD_LED_PIN, OUTPUT);
  19.   // flash the LED
  20.   digitalWrite(SHIELD_LED_PIN, HIGH);
  21.   debugln("");
  22.   debugln("------------------------");
  23.   debugln("    MrDIY CAN SHIELD");
  24.   debugln("------------------------");
  25.   debugln(" CAN...............INIT");
  26.   /* setup CAN @500kbps */
  27.   
  28.   CAN0.setCANPins(SHIELD_CAN_TX, SHIELD_CAN_RX);
  29.   if (!CAN0.begin(500000)) {
  30.     debugln(" CAN...............FAIL");
  31.     delay(500);
  32.     ESP.restart();
  33.   }
  34.   debugln(" CAN.................OK");
  35.   CAN0.watchFor();
  36.   digitalWrite(SHIELD_LED_PIN, LOW);
  37. }
  38. byte i=0;
  39. CAN_FRAME can_message;
  40. // CAN message frame
  41. CAN_FRAME_FD message;
  42. void loop() {
  43.   
  44.   if (CAN0.read(can_message)) {
  45.     debugln(" CAN0.read.................OK");
  46.     Serial.print("ID: ");
  47.                 Serial.println(can_message.id,HEX);
  48.                 Serial.print("Extended: ");
  49.                 if(can_message.extended) {
  50.                         Serial.println("Yes");
  51.                 } else {
  52.                         Serial.println("No");
  53.                 }
  54.                 Serial.print("Length: ");
  55.                 Serial.println(can_message.length,DEC);
  56.                 for(i = 0;i < can_message.length; i++) {
  57.                         Serial.print(can_message.data.uint8[i],HEX);
  58.                         Serial.print(" ");
  59.                 }
  60.                 Serial.println();
  61.                 Serial.println();
  62.                 // Send out a return message for each one received
  63.                 // Simply increment message id and data bytes to show proper transmission
  64.                 // Note: this will double the traffic on the network (provided it passes the filter above)
  65.                 can_message.id++;
  66.                 for(i = 0;i < can_message.length; i++) {
  67.                         message.data.uint8[i]++;
  68.                 }
  69.                 CAN0.sendFrame(can_message);
  70.   }
复制代码
四、 运行效果


esp32-c3做个汽车OBD盒子图3


esp32-c3做个汽车OBD盒子图4


五、 应用场景

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


六、 pcb文件
直接力创打板就行,esp32-c3用的是df的模块。
下载附件Gerber_obd_2023-10-30.zip


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail