Kết nối cổng OBD2 với máy tính

Mình tiếp tục đăng phần 2 nhé.

7. Giải thích một số câu lệnh quan trọng.
– #define PID_COOLANT_TEMP 0x05 //địa chỉ để lấy dữ liệu nhiệt đồ
– #define CAN_ID_PID 0x7DF //identifier 0x7DF để chỉ ra đây là bứ điện yêu cầu thông tin.
– unsigned char tmp[8] = 0x02, 0x01, __pid, 0, 0, 0, 0, 0;
–pid: chưa địa chỉ dữ liệu cần yêu cầu.
Các thông tin khác tham khảo mục trên.
– CAN.sendMsgBuf(CAN_ID_PID, 0, 8, tmp);
CAN_ID_PID: địa chỉ xuất phát của dữ liệu
0: standard frame, 1-extended frame
8: chiều dài dữ liệu là 8 byte
Tmp: nội dung của tin nhắn.
– CAN.readMsgBuf(&len, buf);
&len: chiều dài dữ liệu
Buf: bộ đệm chứa dữ liệu
– while (CAN_OK != CAN.begin(CAN_500KBPS))
Khởi tạo giao thức can bus với tốc độ 500KBPS.

8. Chương trình chính.
#include <SPI.h>
#include “mcp_can.h”

/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define SERIAL SerialUSB
#else
#define SERIAL Serial
#endif

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN); // Set CS pin

#define PID_ENGIN_PRM 0x0C
#define PID_VEHICLE_SPEED 0x0D
#define PID_COOLANT_TEMP 0x05

#define CAN_ID_PID 0x7DF

unsigned char PID_INPUT;
unsigned char getPid = 0;

void set_mask_filt()

/*
* set mask, set both the mask to 0x3ff
*/
CAN.init_Mask(0, 0, 0x7FC);
CAN.init_Mask(1, 0, 0x7FC);

/*
* set filter, we can receive id from 0x04 ~ 0x09
*/
CAN.init_Filt(0, 0, 0x7E8);
CAN.init_Filt(1, 0, 0x7E8);

CAN.init_Filt(2, 0, 0x7E8);
CAN.init_Filt(3, 0, 0x7E8);
CAN.init_Filt(4, 0, 0x7E8);
CAN.init_Filt(5, 0, 0x7E8);

void sendPid(unsigned char __pid)

unsigned char tmp[8] = 0x02, 0x01, __pid, 0, 0, 0, 0, 0;
SERIAL.print(“SEND PID: 0x”);
SERIAL.println(__pid, HEX);
CAN.sendMsgBuf(CAN_ID_PID, 0, 8, tmp);

void setup()

SERIAL.begin(115200);
while (CAN_OK != CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k

SERIAL.println(“CAN BUS Shield init fail”);
SERIAL.println(” Init CAN BUS Shield again”);
delay(100);

SERIAL.println(“CAN BUS Shield init ok!”);
set_mask_filt();

void loop()

sendPid(PID_ENGIN_PRM);
delay(200);
taskCanRecv1();
delay(500);
sendPid(PID_COOLANT_TEMP);
delay(100);
taskCanRecv2();
delay(200);
taskDbg();

if(getPid) // GET A PID

getPid = 0;
sendPid(PID_INPUT);
PID_INPUT = 0;

void taskCanRecv1()

unsigned char len = 0;
unsigned char buf[8];

if(CAN_MSGAVAIL == CAN.checkReceive()) // check if get data

CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf

SERIAL.println(“rn——————————————————————“);
SERIAL.print(“Get Data From id: 0x”);
SERIAL.println(CAN.getCanId(), HEX);
for(int i = 0; i<len; i++) // print the data

SERIAL.print(“0x”);
SERIAL.print(buf);
SERIAL.print(“t”);

SERIAL.println(“n”);
SERIAL.print(“toc do…:”);
SERIAL.println((buf[3]*256+buf[4])/4);

void taskCanRecv2()

unsigned char len = 0;
unsigned char buf[8];

if(CAN_MSGAVAIL == CAN.checkReceive()) // check if get data

CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf

SERIAL.println(“rn——————————————————————“);
SERIAL.print(“Get Data From id: 0x”);
SERIAL.println(CAN.getCanId(), HEX);
for(int i = 0; i<len; i++) // print the data

SERIAL.print(“0x”);
SERIAL.print(buf);
SERIAL.print(“t”);

SERIAL.println(“n”);
SERIAL.print(“nhiet do…:”);
SERIAL.println(buf[3]-40);

void taskDbg()

while(SERIAL.available())

char c = SERIAL.read();

if(c>=’0′ && c<=’9′)

PID_INPUT *= 0x10;
PID_INPUT += c-‘0’;

else if(c>=’A’ && c<=’F’)

PID_INPUT *= 0x10;
PID_INPUT += 10+c-‘A’;

else if(c>=’a’ && c<=’f’)

PID_INPUT *= 0x10;
PID_INPUT += 10+c-‘a’;

else if(c == ‘n’) // END

getPid = 1;

// END FILE
9. Hình ảnh khi chạy chương trình

1580889854125.png

10. Phát triển ứng dụng.
Mình viết bài này chỉ mang tính chất định hướng, các bạn có thể phát triển các ứng dụng sau.

Đinh Vị GPS Vinhome hưng yên Vinhome ocean park giam sat hanh trinh camera nghị định 10
Camera giám sát ô tô vé xe điện tử