comunicazione CAN

Ciao a tutti,

eccomi per il primo quesito :slight_smile:
ho acquistato i moduli CAN-BUS basati su mcp2515 (https://amzn.to/3pnuSu3) e ho realizzato il cablaggio (CS su pin10):

dove, seguendo la libreria dedicata, ho anche connesso il terminale INT al pin 2 dei corrispettivi arduino.

Il modulo MASTER, realizzato con una scheda arduinoUNO, esegue lo sketch:

// demo: CAN-BUS Shield, send data
#include <mcp_can.h>
#include <SPI.h>

/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL SerialUSB
#else
    #define SERIAL Serial
#endif

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int ledHIGH    = 1;
const int ledLOW     = 0;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup() {
    SERIAL.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS)) {            // init can bus : baudrate = 500k
        SERIAL.println("CAN BUS Shield init fail");
        SERIAL.println(" Init CAN BUS Shield again");
        delay(100);
    }
    SERIAL.println("CAN BUS Shield init ok!");
}

unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7};

void loop() {
    SERIAL.println("In loop");
    // send data:  id = 0x70, standard frame, data len = 8, stmp: data buf
    CAN.sendMsgBuf(0x70, 0, 8, stmp);
    delay(100);                       // send data once per second
}

/*********************************************************************************************************
    END FILE
*********************************************************************************************************/

Il modulo ricevente invece è costituito da una scheda MEGA con il seguente sketch:

// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13

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

/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL SerialUSB
#else
    #define SERIAL Serial
#endif

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int LED        = 8;
boolean ledON        = 1;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup() {
    SERIAL.begin(115200);
    pinMode(LED, OUTPUT);

    while (CAN_OK != CAN.begin(CAN_500KBPS)) {            // init can bus : baudrate = 500k
        SERIAL.println("CAN BUS Shield init fail");
        SERIAL.println("Init CAN BUS Shield again");
        delay(100);
    }
    SERIAL.println("CAN BUS Shield init ok!");
}


void loop() {
    unsigned char len = 0;
    unsigned char buf[8];

    if (CAN_MSGAVAIL == CAN.checkReceive()) {         // check if data coming
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned long canId = CAN.getCanId();

        SERIAL.println("-----------------------------");
        SERIAL.println("get data from ID: 0x");
        SERIAL.println(canId, HEX);

        for (int i = 0; i < len; i++) { // print the data
            SERIAL.print(buf[i]);
            SERIAL.print("\t");
            if (ledON && i == 0) {

                digitalWrite(LED, buf[i]);
                ledON = 0;
                delay(500);
            } else if ((!(ledON)) && i == 4) {

                digitalWrite(LED, buf[i]);
                ledON = 1;
            }
        }
        SERIAL.println();
    }
}

//END FILE

Se alimento l’intero sistema e leggo la seriale del modulo ricevente ottengo:

21:06:16.627 -> get data from ID: 0x
21:06:16.627 -> 1FFFFFFF
21:06:16.627 -> 
21:06:16.627 -> -----------------------------
21:06:16.627 -> get data from ID: 0x
21:06:16.627 -> 1FFFFFFF
21:06:16.627 -> 255	254	240	248	248	255	248	248	15	1	39	0	1	87	15	
21:06:17.147 -> -----------------------------
21:06:17.147 -> get data from ID: 0x
21:06:17.147 -> 1FFFFFFF
21:06:17.147 -> 255	255	255	255	255	255	255	255	15	1	39	0	1	87	15	
21:06:20.615 -> -----------------------------
21:06:20.615 -> get data from ID: 0x
21:06:20.615 -> 1F1EE0F8
21:06:20.615 -> 248	254	248	248	248	248	248	248	14	1	39	0	1	87

come si può notare le tempistiche sono molto dilatate e il Led permane sempre acceso.

Mi sono perso qualcosa io per strada o qualcosa non quadra?
In questo test ho utilizzato la libreria dedicata CAN-BUS Shield

Inoltre, all’accensione, spesso per tempi molto lunghi viene stampato

+Enter setting mode fail
CAN BUS Shield init fail
Init CAN BUS Shield again

Ringrazio in anticipo chi potrĂ  aiutarmi

Nello schema hai disegnato due Arduino UNO quindi NON si cepisce che collegamnti hai fatto su Arduino MEGA ... specifica i pin utilizzati.

Guglielmo

Chiedo scusa, ho dato per scontato la cosa.
Ho utilizzato esattamente gli stessi pin e riferimenti su MEGA, anche perché l'unico pin modificabile da sketch è CS... gli altri credo vengano gestiti da libreria

La libreria che usi è questa?

Sulla MEGA il bus SPI è su tutt’altri pin … NON si possono usare gli stessi pin della UNO con la MEGA … si ha 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS) … basta andarsi a studiare il refence della scheda.

Ti allego il pinout della MEGA così vedi quali sono i pin MISO, MOSI e SCK …

Guglielmo

mega.pdf (1.92 MB)

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.