Передача в Can шину

andrey3824
Offline
Зарегистрирован: 17.03.2020

Привет всем.
Встала задача сделать устройство, передающее в кан-шину некоторые данные.
Собрал связку Arduino Nano и MCP2515. Залил небольшой скетч (я не автор). Нужные мне данные передаются в правильном виде, но только один пакет. Мне нужно на один и тот же ID передать раздельно 4 разных пакета по  командам с 4-х цифровых входов. Команды дискретные, 1 или 0. Есть сигнал на нужном входе - передаются нужные данные. Если ни на одном сигнала нет - передается пакет по-умолчанию.
У меня только поверхностные знания об Arduino. Пытался сам что-то изобразить в коде, но получилось только
назначить нужные входы и подтянуть их к питанию.
В скетче ID и данные нулевые, подставлял нужное и все получалось.
Помогите, пожалуйста, собрать код. Я мастер спаять что угодно, но с программированием туго.

#include <SPI.h> //Library for using SPI Communication
#include <mcp2515.h> //Library for using CAN Communication

const int P=9;
const int R=8;
const int N=7;
const int D=6;

struct can_frame canMsg;
MCP2515 mcp2515(10);

void setup(){

  pinMode(9, INPUT_PULLUP);  
  pinMode(8, INPUT_PULLUP);  
  pinMode(7, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);  
  
  SPI.begin(); //Begins SPI communication
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
  mcp2515.setNormalMode();
}

void loop(){
  canMsg.can_id = 0x000; //CAN id as 0x000
  canMsg.can_dlc = 8;    //CAN data length as 8
  canMsg.data[0] = 0x00; 
  canMsg.data[1] = 0x00; 
  canMsg.data[2] = 0x00; 
  canMsg.data[3] = 0x00;
  canMsg.data[4] = 0x00;
  canMsg.data[5] = 0x00;
  canMsg.data[6] = 0x00;
  canMsg.data[7] = 0x00;
  mcp2515.sendMessage(&canMsg); //Sends the CAN message
  delay(5);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016
...
If (LOW == digitalRead(R)) { canMsg.data[3] = 0xAE; } 
mcp2515.sendMessage(&canMsg);
...

 

andrey3824
Offline
Зарегистрирован: 17.03.2020

"3" в квадратных скобках это массив?
Сам массив нужно создать?
Я задаю глупые вопросы, для меня здесь ничего очевидного нет.
 

andrey3824
Offline
Зарегистрирован: 17.03.2020

Понял наверное. Это знакоместо в ряду...

andrey3824
Offline
Зарегистрирован: 17.03.2020

Попробовал просто строку вставить.

Ругается на if. Он вроде не должен быть один.

sadman41
Offline
Зарегистрирован: 19.10.2016

С маленькой буквы if. Телефон самовольничает.

andrey3824
Offline
Зарегистрирован: 17.03.2020

Точно)
Буду копать

andrey3824
Offline
Зарегистрирован: 17.03.2020

Sadman41 Спасибо за помощь!

MaksVV
Offline
Зарегистрирован: 06.08.2015

Отправляя пакеты с частотой раз в  5 мс, можно уложить шину, в момент когда она нагружена. Сделайте хотя бы 30...50

andrey3824
Offline
Зарегистрирован: 17.03.2020

Уже приходила такая мысль.
Спасибо)

johnyquest
Offline
Зарегистрирован: 19.02.2021

Всё, что в loop желательно оформить отдельной функцией/процедурой.

И по if вызывать с нужным параметром. Т.к. будет и шина нагружена и ардуино.

Да, CAN, лучше от 200 мс "бомбить".

А можно поинтересоваться, что за ручка КПП? Она по CAN состояния не передаёт?

andrey3824
Offline
Зарегистрирован: 17.03.2020

johnyquest пишет:

Всё, что в loop желательно оформить отдельной функцией/процедурой.

И по if вызывать с нужным параметром. Т.к. будет и шина нагружена и ардуино.

Да, CAN, лучше от 200 мс "бомбить".

А можно поинтересоваться, что за ручка КПП? Она по CAN состояния не передаёт?

Ручка обычная, дискретные сигналы. Панель с CAN.
Я не программист, выше уже отметил это. То, что вы написали, я не реализую.

andrey3824
Offline
Зарегистрирован: 17.03.2020

Привет всем. Эпопея продолжается.
Проблема появилась. Вернее она с самого начала была.
Вся эта связка Arduino+MCP2515 можно сказать рабочая.
Нужная информация на табло появляется, но когда все работает, шина виснет.
Я даже потом убрал в скетче все, что нужно передать. Все-равно будто (по-радиолюбительски)
идет несущая и забивает весь эфир.

Код
 

#include <SPI.h>
#include <mcp2515.h>

const int SPI_CS_PIN = 10;
const int INT_PIN = 2;
const int P=9;

struct can_frame canMsg;
MCP2515 mcp2515(10);

void setup(){

  
  SPI.begin(); //Begins SPI communication
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
  mcp2515.setNormalMode();
}

void loop(){
  canMsg.can_id = 0x000;
  canMsg.can_dlc = 8;
  if (HIGH == digitalRead(P))
  //{ 
  //canMsg.data[0] = 0x00; 
  //canMsg.data[1] = 0x00; 
  //canMsg.data[2] = 0x00; 
  //canMsg.data[3] = 0x00;
  //canMsg.data[4] = 0x00;
  //canMsg.data[5] = 0x00;
  //canMsg.data[6] = 0x00;
  //canMsg.data[7] = 0x00;
  //}

    
  mcp2515.sendMessage(&canMsg);
  delay(200);
}

Что не так сделано?