因此,我正在进行一个项目,以建立树莓派4和arduino之间的CAN总线通信。不幸的是,我没有很大的成功。所以我已经建立了多个树莓派之间的连接,它是完美的工作。因此,配置我的树莓派我按照在线教程的步骤。我添加了这几行在/ Boot /config.txt:
dtoverlay=mcp2515-can0,oscillator=8000000,interupt=12
dtoverlay=spi-bcm2835-overlay
已安装can实用程序并使用启动can
sudo ip link set can0 up type can bitrate 500000
之后我创建了python代码来控制CAN总线的数据接收和发送。下面是我发送数据的代码:
import time
import can
bustype = 'socketcan'
channel = 'can0'
bus = can.interface.Bus(channel=channel, bustype=bustype,bitrate=500000)
while True:
msg = can.Message(arbitration_id=2, data=[0, 0, 0, 0, 0, 0], is_extended_id=False)
bus.send(msg)
time.sleep(0.1)
</code></pre>
这是接收的一个
import time
import can
bustype = 'socketcan'
channel = 'can0'
bus = can.interface.Bus(channel=channel, bustype=bustype,bitrate=500000)
while True:
print(bus.recv())
time.sleep(0.1)
所以对于arduino部分,我尝试使用UNO和Mega 2560。我在两块板上的连接是相同的:
VCC --> 5V
GND --> GND
CS --> pin 10
SO --> pin12
SI --> pin11
SCK --> pin 13
INT --> pin 2
在https://github.com/Seeed-Studio/Seeed_Arduino_CAN/blob/master/examples/recv_sd/recv_sd.ino和https://www.arduinolibraries.info/libraries/can上尝试了多个库,因此我将示例代码上传到了arduino,如下所示:
#include
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("CAN Sender");
// start the CAN bus at 500 kbps
// if (!CAN.begin(500E3)) {
// Serial.println("Starting CAN failed!");
// while (1);
// }
}
void loop() {
// send packet: id is 11 bits, packet can contain up to 8 bytes of data
Serial.print("Sending packet ... ");
CAN.beginPacket(0x12);
CAN.write('h');
CAN.write('e');
CAN.write('l');
CAN.write('l');
CAN.write('o');
CAN.endPacket();
Serial.println("done");
delay(1000);
// send extended packet: id is 29 bits, packet can contain up to 8 bytes of data
Serial.print("Sending extended packet ... ");
CAN.beginExtendedPacket(0xabcdef);
CAN.write('w');
CAN.write('o');
CAN.write('r');
CAN.write('l');
CAN.write('d');
CAN.endPacket();
Serial.println("done");
delay(1000);
}
当我上传到Arduino Uno时,它会显示“启动CAN失败!",但在Arduino Mega上,一切似乎都很好,但无论我使用Python代码还是简单的“candump can 0”命令,树莓派都没有接收到数据。
#include
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("CAN Receiver");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
}
void loop() {
// try to parse packet
int packetSize = CAN.parsePacket();
if (packetSize || CAN.packetId() != -1) {
// received a packet
Serial.print("Received ");
if (CAN.packetExtended()) {
Serial.print("extended ");
}
if (CAN.packetRtr()) {
// Remote transmission request, packet contains no data
Serial.print("RTR ");
}
Serial.print("packet with id 0x");
Serial.print(CAN.packetId(), HEX);
if (CAN.packetRtr()) {
Serial.print(" and requested length ");
Serial.println(CAN.packetDlc());
} else {
Serial.print(" and length ");
Serial.println(packetSize);
// only print packet data for non-RTR packets
while (CAN.available()) {
Serial.print((char)CAN.read());
}
Serial.println();
}
Serial.println();
}
}
因此,我将非常感谢任何人的帮助,因为我已经与这个问题斗争了2个星期,我真的很想解决它。谢谢你的时间
1条答案
按热度按时间b4lqfgs41#
所以我终于找到了一个解决方案。我猜其他库在发送数据时遇到了一些问题,因为我用相同的配置设置了所有东西。然而,今天我找到了这个库-〉https://www.arduinolibraries.info/libraries/mcp_can,它帮助我正确地编程了arduino,它可以完美地与另一个arduino或raspberry pi连接。