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