Я пытаюсь настроить локальную шину 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?