Jeep Grand Cherokee (WK) ()

Начал хакать CAN-шину (часть 3)

Я їжджу на Jeep Grand Cherokee (WK)
Київ, Україна

Получилось!
И так по порядку. На CAN модуле кварц был перепаян на 16Mhz. Если расковырять библиотеку, то можно и на 8 завести, но по-умолчанию для 8Mhz нет настройки на нашу скорость 83.3kbps, а для 16 есть.
Непосредственно для управления магнитолой был собран вот такой девайс

Ну и собственно для ардуины вот такой скетч

#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;
const int CAN_INT_PIN = 2;

//KEY PINS
#define KP1 3
#define KP2 4
#define KP3 5
#define KP4 6
#define KP5 7
#define KP6 8

//CAN KEYS
#define CAN_RU 0x02
#define CAN_RD 0x04
#define CAN_RC 0x01
#define CAN_LU 0x08
#define CAN_LD 0x10
#define CAN_LC 0x20
#define CAN_MAIN 0x00

//CAN ID
#define CAN_KEY_ID 0x3A0

//PRESS TIME
#define DELAY_TIME 250

MCP_CAN CAN(SPI_CS_PIN); // Set CS pin

volatile unsigned char flagRecv = 0;
unsigned char len = 0;
unsigned char buf[8];
unsigned long t = 0;
unsigned char set_pin = 255;

void setup() {
pinMode(KP1, OUTPUT);
pinMode(KP2, OUTPUT);
pinMode(KP3, OUTPUT);
pinMode(KP4, OUTPUT);
pinMode(KP5, OUTPUT);
pinMode(KP6, OUTPUT);
digitalWrite(KP1, LOW);
digitalWrite(KP2, LOW);
digitalWrite(KP3, LOW);
digitalWrite(KP4, LOW);
digitalWrite(KP5, LOW);
digitalWrite(KP6, LOW);
SERIAL.begin(115200);
while (!SERIAL) {
; // wait for serial port to connect. Needed for native USB port only
}

while (CAN_OK != CAN.begin(CAN_83K3BPS)) { // init can bus : baudrate = 500k
SERIAL.println("CAN BUS Shield init fail");
SERIAL.println(" Init CAN BUS Shield again");
delay(100);
}

CAN.setMode(MODE_CONFIG);
CAN.init_Mask(0,0,0xfff);
CAN.init_Mask(1,0,0xfff);
CAN.init_Filt(0,0, CAN_KEY_ID);
CAN.init_Filt(1,0, CAN_KEY_ID);
CAN.init_Filt(2,0, CAN_KEY_ID);
CAN.init_Filt(3,0, CAN_KEY_ID);
CAN.init_Filt(4,0, CAN_KEY_ID);
CAN.init_Filt(5,0, CAN_KEY_ID);
CAN.setMode(MODE_NORMAL);
SERIAL.println("CAN BUS Shield init ok!");

attachInterrupt(digitalPinToInterrupt(CAN_INT_PIN), MCP2515_ISR, FALLING); // start interrupt
}

void MCP2515_ISR() {
flagRecv = 1;
}

void loop() {
if (flagRecv) {
// check if get data

flagRecv = 0; // clear flag

// iterate over all pending messages
// If either the bus is saturated or the MCU is busy,
// both RX buffers may be in use and reading a single
// message does not clear the IRQ conditon.
while (CAN_MSGAVAIL == CAN.checkReceive()) {
// read data, len: data length, buf: data buf
CAN.readMsgBuf(&len, buf);
unsigned long canId = CAN.getCanId();
if (canId == CAN_KEY_ID){
switch (buf[0]){
case CAN_RC:
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}

digitalWrite(KP1, HIGH);
t = millis();
set_pin = KP1;
break;
case CAN_RU:
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP2, HIGH);
t = millis();
set_pin = KP2;
break;
case CAN_RD:
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}

digitalWrite(KP3, HIGH);
t = millis();
set_pin = KP3;
break;
case CAN_LC:
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP4, HIGH);
t = millis();
set_pin = KP4;
break;
case CAN_LU:
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP5, HIGH);
t = millis();
set_pin = KP5;
break;
case CAN_LD:
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP6, HIGH);
t = millis();
set_pin = KP6;
break;
}
}
// print the data
/*for (int i = 0; i < len; i++) {
SERIAL.print(buf[i]); SERIAL.print("\t");
}
SERIAL.println();*/
}
}

if (millis()-t >= DELAY_TIME){
if (set_pin != 255){
digitalWrite(set_pin, LOW);
}
t = 0;
set_pin = 255;
}
}

Тут скетч и библиотека

Отлавливает кнопки четко, 250 мс время нажатия какраз нормально.

Осталось теперь найти коробочку которую это все впихнуть и подключить на постоянку

Опубліковано: 13 серпня 2020р. 14:35
0 0 0

Коментарі

Щоб залишати коментарі, потрібно авторизуватись.