Получилось!
И так по порядку. На 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 мс время нажатия какраз нормально.
Осталось теперь найти коробочку которую это все впихнуть и подключить на постоянку





Комментарии 4
www.drive2.ru/l/543928403334529733/ а если так сделать? Заморочек не меньше, но зато перспектив больше. Вход для канбус адаптера сейчас почти на всех китайцах есть
Ну протокол чирка далеко не все поддерживают. Например моя hizpo которая стоит на педжере имеет кан вход но в перечне машин все после 2016.
Впринципе пое решение можно допиливать дальше и например по БТ отдавать на магнитолу климат, парктроники и т.п.
Так ты почитай, там как раз тоже неподдерживаемый протокол. Только не на ардуине сделано а на стм
Ок. Будет время внимательнее почитаю