树莓派和arduino CAN总线通信不工作

fnx2tebb  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(275)

因此,我正在进行一个项目,以建立树莓派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.inohttps://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个星期,我真的很想解决它。谢谢你的时间

b4lqfgs4

b4lqfgs41#

所以我终于找到了一个解决方案。我猜其他库在发送数据时遇到了一些问题,因为我用相同的配置设置了所有东西。然而,今天我找到了这个库-〉https://www.arduinolibraries.info/libraries/mcp_can,它帮助我正确地编程了arduino,它可以完美地与另一个arduino或raspberry pi连接。

相关问题