Невозможно отправить сообщения CAN между двумя arduino - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь настроить локальную шину CAN между двумя платами Arduino (мега и про микро).Но я не могу заставить их получать сообщения друг от друга ...

Для обеих плат я использую этот модуль CAN: https://www.amazon.com/CHENBO-Electronics-Receiver-Controller-Development/dp/B015W4D9WY/ref=sr_1_3

Соединение между платой Arduino и CANсделано следующим образом:

ProMicro:

  • VCC на модуле - VCC от микро
  • GND на модуле - GND от микро
  • CS на модуле -PIN 10 на плате
  • SO на модуле -PIN 14 на плате
  • SI на модуле - PIN 16 на плате
  • SCK на модуле- PIN 15 на плате

Mega 2560:

  • VCC на модуле - 5V VCC от микро
  • GND на модуле - GND от микро
  • CS на модуле -PIN 53 на плате
  • SO на модуле -PIN 50 на плате
  • SI на модуле - PIN 51 на плате
  • SCK на модуле - PIN 52 на плате

Обе платы подключены к ПК и подключены к последовательному монитору.

У меня также есть Raspberry PI для отладкис этим модулем: https://www.waveshare.com/rs485-can-hat.htm

Из программного обеспечения я использую эту библиотеку Arduino: https://github.com/Seeed-Studio/CAN_BUS_Shield и эту для Raspberry: https://github.com/sebi2k1/node-can

Это коддля Arduino micro:

#define DEBUG_EN 1
#include <SPI.h>
#include "mcp_can.h"

const int SPI_CS_PIN = 10;

long unsigned int rxId;
unsigned char len = 0;
unsigned char buf[8];

long unsigned int txID = 0xF0;
unsigned char stmp[8] = {0, 9, 8, 7, 6, 5, 4, 3};

MCP_CAN CAN(SPI_CS_PIN);

void setup()
{
  Serial.begin(9600);
  delay(1000);

  while (CAN_OK != CAN.begin(CAN_500KBPS, MCP_8MHz))
  {
    Serial.println("CAN BUS Module Failed to Initialize");
    Serial.println("Retrying....");
    delay(200);
  }
  Serial.println("CAN BUS Module Initialized!");
  Serial.println("PGN\t\tByte0\tByte1\tByte2\tByte3\tByte4\tByte5\tByte6\tByte7");
}

void loop()
{
  if (CAN_MSGAVAIL == CAN.checkReceive())
  {
    Serial.println("I have something on micro...");
    CAN.readMsgBuf(&len, buf);
    rxId = CAN.getCanId();

    Serial.print("0x");
    Serial.print(rxId, HEX);
    Serial.print("\t");

    for (int i = 0; i < len; i++)
    {
      if (buf[i] > 15)
      {
        Serial.print("0x");
        Serial.print(buf[i], HEX);
      }
      else
      {
        Serial.print("0x0");
        Serial.print(buf[i], HEX);
      }
      Serial.print("\t");
    }
    Serial.println();

    Serial.println("sending message...");
    CAN.sendMsgBuf(txID, 1, 8, stmp);
  }
}

Почти то же самое для Arduino mega:

#include <mcp_can.h>
#include <SPI.h>

const int SPI_CS_PIN = 53;

unsigned char len = 0;
unsigned char buf[8];
long unsigned int rxId;

long unsigned int txID = 0xFF;
unsigned char stmp[8] = {1, 2, 3, 4, 5, 6, 7, 8};

MCP_CAN CAN(SPI_CS_PIN);

void setup()
{
  Serial.begin(9600);
  delay(1000);

  while (CAN_OK != CAN.begin(CAN_500KBPS, MCP_8MHz))
  {
    Serial.println("CAN BUS Module Failed to Initialize");
    Serial.println("Retrying....");
    delay(200);
  }
  Serial.println("CAN BUS Module Initialized!");
  Serial.println("PGN\t\tByte0\tByte1\tByte2\tByte3\tByte4\tByte5\tByte6\tByte7");
}

void loop()
{
  if (CAN_MSGAVAIL == CAN.checkReceive())
  {
    Serial.println("I have something no mega...");
    CAN.readMsgBuf(&len, buf);
    rxId = CAN.getCanId();

    Serial.print("0x");
    Serial.print(rxId, HEX);
    Serial.print("\t");

    for (int i = 0; i < len; i++)
    {
      if (buf[i] > 15)
      {
        Serial.print("0x");
        Serial.print(buf[i], HEX);
      }
      else
      {
        Serial.print("0x0");
        Serial.print(buf[i], HEX);
      }
      Serial.print("\t");
    }
    Serial.println();

    Serial.println("sending...");
    CAN.sendMsgBuf(txID, 1, 8, stmp);
  }
}

и отладочный код на малиновом:

var can = require("socketcan");

var channel = can.createRawChannel("can0", true);

// Log any message
channel.addListener("onMessage", function(msg) {
    console.log(msg);
});

channel.start();
console.log("Sending initial message...");
channel.send({id: 0x0F, ext: 1, rtr: false, data: Buffer.from([1, 1, 1, 1, 1, 1, 1, 1])});
console.log("Listening to messages");

Перед началом теста яm выполняет эти команды на Raspberry:

sudo ip link set can0 type can bitrate 500000
sudo ifconfig can0 up

И это выходные данные:

от Raspberry:

Sending initial message...
Listening to messages
{ ts_sec: 1560890627,
  ts_usec: 297829,
  id: 240,
  ext: true,
  data: <Buffer 00 09 08 07 06 05 04 03> }
{ ts_sec: 1560890627,
  ts_usec: 318244,
  id: 255,
  ext: true,
  data: <Buffer 01 02 03 04 05 06 07 08> }

, что означает, что обе платы Arduino отправляют правильные данныена шину CAN ...

от Arduino Micro:

lib is working....
Enter setting mode success 
set rate success!!
Enter Normal Mode Success!!
CAN BUS Module Initialized!
PGN     Byte0   Byte1   Byte2   Byte3   Byte4   Byte5   Byte6   Byte7
I have something on micro...
0xF 0x01    0x01    0x01    0x01    0x01    0x01    0x01    0x01    
sending message...

Здесь я пропускаю сообщение от Arduino Mega

и от Arduino Mega

lib is working....
Enter setting mode success 
set rate success!!
Enter Normal Mode Success!!
CAN BUS Module Initialized!
PGN     Byte0   Byte1   Byte2   Byte3   Byte4   Byte5   Byte6   Byte7
I have something no mega...
0xF 0x01    0x01    0x01    0x01    0x01    0x01    0x01    0x01    
sending...

Здесь также проблема в том, что нет сообщения от Arduino Micro

Как я могу заставить платы Arduino принимать все сообщения от шины CAN?

...