Arduino Mega 2560 mit Serial CAN-BUS Module based on MCP2551 and MCP2515

Hallo zusammen,
ich habe hier einen CAN Bus mit 500kB Baudrate und wollte Sensordaten über einen Arduino Mega 2560 dort im Bus bereitstellen. Dazu habe ich mit diese Module besorgt:

Leider funktionieren die bereitgestellten Beispieldateien nicht und ich teste nun schon weit mehreren Tagen und scheitere immer beim Setzen der CAN-Baudrate bzw. werden auch keine Daten gesendet oder mitgelesen.
Die Terminierung auf dem Module habe ich getrennt, da der Bus beidseitig schon terminiert ist.

Das Codebeispiel stammt aus der Library https://github.com/Longan-Labs/Serial_CAN_Arduino:

#include <Serial_CAN_Module.h>
#include <SoftwareSerial.h>


Serial_CAN can;

#define can_tx  2           // tx of serial can module connect to D2
#define can_rx  3           // rx of serial can module connect to D3


unsigned long id = 0;
unsigned char dtaRX[8];

unsigned char dtaTX[8] = {1, 2, 3, 4, 5, 6, 7, 8};

void setup()
{
    Serial.begin(9600);
    can.begin(can_tx, can_rx, 9600);      // tx, rx
    
    if(can.canRate(CAN_RATE_500))
    {
        Serial.println("set can rate ok");
    }
    else
    {
        Serial.println("set can rate fail");
    }
}

void loop()
{
    can.send(0x175, 0, 0, 8, dtaTX); 
    delay(100);
}
// END FILE

Hatte jemand mit diesem Module bereits Erfolg? Oder ist es aussichtslos und ich sollte gleich ein Shield verwenden.

Danke und viele Grüße, Axel

Hallo,

da ich mich selber für die Can Geschichte interessiere. Habe ich mal kurz nachgedacht .........
komme aber zu dem Schluss das dies zu wenig Informationen sind. Hast du denn den TX an rx angeschlossen und den Rx an TX ? im Gegensatz zu den i2C Leitungen müssen diese nämlich gekreuzt werden. Nur so ne Idee. Mach doch mal ein Foto vom Aufbau, das könnte helfen.

Gruss Temucin alias TFT

Hi

Wenn die Leitungen gekreuzt angeschlossen gehören, wie kann ich damit sinnvoll mehrere CAN-Knoten (?) zusammen klöppeln?
Bei der Hälfte wären die Anschlüsse vertauscht oder ich hätte eine reine 1:1 Verbindung - so hätte ich CAN nicht verstanden.

ABO (habe andere CAN-Platinen vom freundlichem China-Man und werde mir Eure Lösung(en) abkupfern)

MfG

Hallo,

postmaster-ino:
Wenn die Leitungen gekreuzt angeschlossen gehören, wie kann ich damit sinnvoll mehrere CAN-Knoten (?) zusammen klöppeln?

es ist ja nicht CAN, was da gekreuzt werden müsste.

Diese Platine ist eine recht eigenartige Konstruktion:

  • Der MCP2551 ist ein CAN-Transceiver, der macht aus der 5V Logik die eigentlichen CAN-Signale. Die heißen CAN-L und CAN-H und bilden zusammen mit GND den Bus.
  • Der MCP2515 ist ein CAN-Interface mit SPI-Schnittstelle. Normale Arduino CAN-Shields binden den über den SPI vom Arduino an.
  • Das kann hier aber nicht so sein, denn die Platine wird über UART mit dem Arduino verbunden. Also muss das dritte IC auf der Platine ein weiterer Mikrocontroller sein. Viel steht da auf der Seeedstudio Seite nicht zu ...

Es ist diese UART-Verbindung, die anscheinend nicht zu laufen kommt.

Wenn man die dann mal am laufen hat, muss man durch diese Adapter-Adapter-Lösung dann CAN machen. Das stelle ich mir auch nicht so einfach vor. Der CAN-Bus des Fragestellers arbeitet mit 500000 Bit/s, die Platine kann auf dem UART 9600 bis 115200. Muss man halt schaun, was da der unbekannte Mikrocontroller selber kann und wie man das programmiert.

Dann schreibt der Fragesteller noch

ich habe hier einen CAN Bus mit 500kB Baudrate und wollte Sensordaten über einen Arduino Mega 2560 dort im Bus bereitstellen

falls man daraus schliessen kann, dass das ein laufender Bus ist (Auto ?), dann ist da sicher einiges an Datenverkehr unterwegs.Mit diesem Hardwareaufbau ist es sicher sportlich, da mitzumischen.

Mit einem einzelnen MCP2551 (gibt es auch als DIP) an einen einem Teensy 3.2 oder 3.5, bzw. einem MCP2562 (dito) an einem Arduino Due oder Teensy 3.6, wäre das sicher einfacher. Diese Controller haben eingebautes CAN, das geht da ähnlich wie Serial.

Hallo,
schon mal vielen Dank für eure Antworten. Ich merke, dass ich hier mal wieder einiges Lernen werde :slight_smile:
Im Anhang ist ein Bild des Aufbaus. Testweise habe ich auch die PINs mal vertauscht, auf Communication-PINs gelegt, usw ......). (Das obere Kabel am GND stammt von GND der anderen Kontroller.)
Das andere Bild ist eine Aufnahme des Moduls mit Beschriftung der Komponenten. Darauf ist ein Atmel Mega 328P.

Der von mir verwendete BUS stammt nicht aus einem KFZ sondern wurde selber aufgebaut. Der Datenverkehr ist übersichtlich und immer noch optimierbar.

Den Arduino Mega hatte ich ausgewählt, da ich möglichst viele Analoge Inputs zur Verfügung haben wollte.
Allerdings ist der DUE und Teensy 3.6 schon eine Alternative. Danke für den Hinweis! Hatte nicht erwartet, dass die CAN-Implementierunf mich diesmal vor ein Problem stellen würde.

Deswegen auch meine anfängliche Frage, ob jemand genau mit diesem Modul bereits Erfolg hatte. Es reizt mich ja schon, das Problem zu lösen, allerdings gib es (wie von ArduFE vorgeschlagen) zu meinem ursprünglichen Problem auch alternative Lösungen. Das schließt aber nicht aus, dass eine Lösung (oder einen Aussage, dass es nicht möglich oder äußerst aufwendig ist) trotzdem einen gewissen Mehrwert hätte.

Viele Grüße, Axel

Hallo,

axwild:
Deswegen auch meine anfängliche Frage, ob jemand genau mit diesem Modul bereits Erfolg hatte. Es reizt mich ja schon, das Problem zu lösen, allerdings gib es (wie von ArduFE vorgeschlagen) zu meinem ursprünglichen Problem auch alternative Lösungen. Das schliesst aber nicht aus, dass eine Lösung (oder einen Aussage, dass es nicht möglich ist) für die Community einen Mehrwert darstellt.

da stimme ich dir zu. Vielleicht kann noch jemand etwas beitragen.

Bis heute ist mir dieses Modul noch nicht begegnet und ich bin mir ziemlich sicher hier die meisten Threads zum Thema CAN mitverfolgt zu haben. Die Github History der Library reicht gerade mal bis zum 20 September zurück, dass ist noch ziemlich neu.

Ich weiß immer noch nicht, was ich von dem Modul halten soll, erst recht falls es erst vor kurzer Zeit erschienen ist. Die Kombination aus Mega328P und den beiden über 20 Jahre alten MCP Typen deutet auf einen gewissen Arduino Bezug hin, vielleicht werden bestehende Libraries verwendet. Bei einer richtigen Neuentwicklung hätte man wohl eher einen Mega mit CAN, z.B. AT90CAN verwendet, der steckt z.B. auch in der auch schon recht betagten Conrad C-Control.

Kannst du mal am UART mit Logikanalysator oder Scope schauen, ob das Ding überhaupt antwortet ? Stimmt die Baudrate ? Schau mal in den Quelltext der Lib, vielleicht gibt es Möglichkeiten für Debugausgaben ...

Ansonsten hier ein schon etwas älterer Schaltplan, der einen CAN-Bus zwischen zwei Teensys zeigt

Beim Teensy ist elementare CAN-Unterstützung in den mitgelieferten Libs enthalten. Eine neuere Version ist hier

die CAN-Lib für den Due ist vom gleichen Autor

Wichtiger Hinweis: Der MCP2551 arbeitet mit 5V, das geht nur mit den 5V toleranten Teensy 3.2 oder 3.5. Bei einem 3,3V Controller braucht man entweder einen Tranceiver, der mit 3,3 und 5 V versorgt werden muss, z.B. MCP2562 oder TJA1051/3, oder einen reinen 3,3 V Transceiver, wie den SN65HVD230.

Dein Hinweis:

Der MCP2551 arbeitet mit 5V, ...

:grin:
Hoppla, ich sehe meine Daten auf dem Bus! Dann stimmt schon mal die Beschreibung des Moduls NICHT!

3.3V working voltage

Mal sehen wie es weitergeht. Melde mich wieder!

Hmm, ich hatte das Module auch mit 5V versorgt, vermutlich aber gerade mit einer nicht-funktionierenden Code.

Hallo zusammen,
abschließend noch eine Bemerkung:

Mit dem genannten CAN-Module https://www.seeedstudio.com/Serial-CAN-BUS-Module-based-on-MCP2551-and-MCP2515-p-2924.html
konnte ich zwar beim bestehenden CAN-Bus mit 500kbps CAN-Messages senden (wenn man das Module mit 5V versorgt).
Alle anderen Funktionen (Empfangen, ändern der CANRate...) haben NICHT funktioniert.

Ich werde das Module nicht weiterverwenden.
Ich habe nun hier ein Arduino Due, Teensy 3.5 (3.6 hatte längere Lieferzeiten) und auch das CAN-Shield CAN-BUS Shield V1.2 | Seeed Studio Wiki.

Damit funktionierten die bisherigen Tests reibungslos.
Danke an alle und viele Grüße, Axel