Arduino Mega und CAN-BUS Shield Nachricht senden bzw empfangen

Servus und nen schönen Tag euch allen,

ich bin ziemlich neu in der Welt von Arduino und hoffe deshalb auf eure Hilfe ;)

Also es geht um folgendes.

Wir haben für ein Projekt ein Arduino Mega und ein CAN-Bus Shield. Nun wollen wir zwei Schrittmotoren mit Absolutwertgebern ansteuern. Die Schrittmotoren haben direkt eine Steuerplatine dran, das heißt die können ganz einfach über ein Befehl, den sie über CAN-Bus bekommen, gesteuert werden. Ganz tribial z.B. MoveRigth -> Motor fährt nach rechts. Das Problem was wir jetzt haben ist, wie wir eben so eine Nachricht über CAN-Bus senden können. Wie muss dabei der Quellcode aussehen? Welche Befehle nutzt man beim Arduino?

Ich hoffe ihr könnt mir bzw uns helfen.

Grüßle

Daniel

Hallo Daniel,

das schöne an Shields ist, dass es meist Libraries und immer Demo-Code dazu gibt :) Manchmal auch beides zusammen: https://github.com/Seeed-Studio/CAN_BUS_Shield

Am besten alles runterladen und "Installieren". Dann stehen die Beispiele auch in der Arduino IDE zur Verfügung und Du kannst sie Dir anschauen.

Die Nachrichten per CAN-Bus sehen aber i.d.R. etwas anders aus als "MoveRight" oder "MoveLeft". Da benötigst Du noch mehr Informationen über die Schrittmotoren. Normal besteht eine CAN-Bus Nachricht aus Hexadezimalwerten. Also 0-255. Nachrichtenformat, Sender, Empfänger, Länge (Optional, je nach Format), Datenbytes, Checksumme.

Wobei nun die Datenbytes vermutlich ein Steuerzeichen für die Richtung und eines für die Anzahl der Schritte haben. Aber ab da kann ich nur vage vermuten.

Ansonsten sollte Dir die Library die Kommunikation extrem vereinfachen:

unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
// send data:  id = 0x00, standrad frame, data len = 8, stmp: data buffer
CAN.sendMsgBuf(0x00, 0, 8, stmp)

EDIT: Gerade mal nach Schrittmotor CAN Bus gesucht... Das sieht aber schon recht komplex aus! MDrive 17 Plus beinhaltet etliche Anleitungen, Datenblätter und Tools. Mit einer Nachricht kommst Du da wohl nicht aus. Falls der Motor aus meinem Link ein ähnlicher ist, würde ich mir wohl dieses CANopen-Tool runterladen, den Motor darüber zum laufen bringen und wenn Du verstanden hast wie es funktioniert, die Nachrichten nachbauen.

Aber erstmal schauen, ob es CAN oder CANopen ist.

CANopen ist ein Protokoll, was CAN als Hardware benutzt. So wie Profibus auf RS485 arbeitet.

Hi,

also Danke schon mal für die Antworten. Also mit dem HEX-Code habe ich da auch schon mal etwas gelesen. Habe es auch schon mal mit so einem ähnlichen Code probiert, aber bekam dann immer die Meldung bekommen, das CAN nicht deklariert ist.

Also um genau zu sein haben wir diesen Motor von Trinamic PD42-2-1140 Dieser unterstützt auch CANopen.

Gruß Daniel

Hi Daniel,

für CANopen gibt es auch wieder eine Library. Sicherlich sogar mehrere. https://github.com/jgeisler0303/AGCON Das war aber die erste, die ich gefunden habe.

Bei dem Motor sind alle notwendigen Dokumentationen enthalten. Auch wieder die CANopen Software. Auch wenn das im ersten Moment sehr viel erscheint, kann ich Dir nur empfehlen die durchzulesen! Du wirst sonst nicht verstehen was Du von der Library genau benötigst und welche Steuerbefehle Du übergeben musst.

Wenn Du schon Probleme hast eine Library zu verwenden, bzw. diese korrekt zu initialisieren, würde ich aber erstmal mit den Basics beginnen und mich durch ein paar Arduino-Tutorials hangeln.

Wir unterstützen Dich gerne bei allen Fragen oder auftretenden Problemen. Nur komplett programmieren wird Dir das keiner :grinning:

Hallo,

bei dem Link bin ich auch schon gewesen, als ich meine Antwort geschrieben habe

Trib: für CANopen gibt es auch wieder eine Library. Sicherlich sogar mehrere. https://github.com/jgeisler0303/AGCON Das war aber die erste, die ich gefunden habe.

Habe aber nach kurzem drübersehen entschieden ihn nicht zu posten, weil

a) die Lib implementiert nur einen CANopen Slave. Um die Motoren zu steuern braucht man einen Master. b) die Lib setzt auf CANfestival auf, ein wohl nicht mehr aktiv supportetes Projekt c) die Lib ist keine Arduino Lib, sie arbeitet mit avr-gcc und Makefile

Ein fertige CANopen Master Implementierung für Arduino konnte ich mit Google nicht finden. Da wird etwas Arbeit erforderlich sein. Das ist sicher ein ambitioniertes Anfängerprojekt.

Das kann man alles hinkriegen, aber trotzdem würde ich zuerst mal Alternativen ausloten. Haben die Motoren eine alternative Schnittstelle, z.B. seriell ?

Ok, hab selber mal geschaut.

Im “PD-1140_TMCL_firmware_manual.pdf” steht eigentlich alles, was man wissen muss. Es gäbe auch diese Varianten:

  1. Vom Windows PC aus über USB
  2. Vom Windows PC aus über USB zu RS485 Adapter
  3. Arduino Mega über RS485 (mit zusätzlichem IC am UART)
    4) Arduino Mega mit CAN-Shield, nur mit CAN ohne CANopen
    (Da steht zwar CAN 2.0B Interface, meint aber wohl nur die Hardware.)

alles wahrscheinlich tausend mal einfacher, als eine CANopen Master zu bauen.

Danke ArduFE! Hatte bisher noch keine Berührungspunkte mit CANopen. Scheint alles deutlich komplexer als ich ursprünglich annahm!

Wie anfangs schon gepostet tendiere ich zu einer Kombination aus 1) und 4). Erstmal alles mit den dafür vorgesehenen Programmen zum laufen bringen. Anschließend sich die Befehlsketten anschauen und verstehen was passiert. Ggf. den Datenstrom separat mitschneiden. Nun mit dem Arduino nachbauen.

Super, vielen Dank schon mal an euch alle :) Habt mir schon mal sehr geholfen, weil ich jetzt wenigstens mal weiß, wo ich am besten anfangen soll ;)

@ArduFE der Motor besitzt noch RS485 und USB Schnittstellen.

Grüßle Daniel

RS485 wäre im Moment mein Favorit. Da gibt es hier sehr viel Infos und Leute, die sich auskennen, dazu.

Zu CAN kann ich zumindest etwas Halbwissen beisteuern. Ich habe zwar kein Shield, erforsche aber gerade den eingebauten CAN-Bus auf dem Teensy.

OK, also RS485 wäre eventuell auch ne Möglichkeit. Wir hatten uns am Anfang auch nur für CAN entschieden, weil wir von einer Simulationseinheit, die die Steuergeräte von Autos testet, die Daten bekommen. Da in Autos eben der CAN-Bus benutzt wird, haben wir gedacht, nutzen wir für Ansteuerung der Motoren eben auch CAN. Müssen und jetzt aber nochmal zusammen setzen und des bereden.

Danke ;)

Grüßle

Hallöchen alle miteinander,

also wir haben jetzt mal alles besprochen und haben uns jetzt dennoch für die Kommunikation über den Canbus entschieden.

Das neuste Problem ist jetzt, dass ich nachdem ich das Programm draufgespielt habe, die Fehlermeldung

CAN BUS Shield init fail
Init CAN BUS Shield again

auftaucht und ich einfach nicht weiß wieso.
Muss man das Shield noch irgendwie speziell konfigurieren?

Hier ist mal das Programm, vllt kennt es auch schon jemand.

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

// 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 = 9;

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] = {0, 1, 2, 3, 4, 5, 6, 7};
void loop()
{
// send data: id = 0x00, standrad frame, data len = 8, stmp: data buf
CAN.sendMsgBuf(0x00, 0, 8, stmp);
delay(100); // send data per 100ms
}

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

Vielen Danke schon mal.

Gruß Daniel

Hallo,

stimmt den der Chip-Select Pin ?

Scheint nicht einheitlich zu sein, verschiedene Firmen bauen Shields mit dem MCP2515.

Mein Can-Bus Shield ist von Duinopeak, ich finde leider überhaupt nicht heraus, auf welchem Pin der sein soll. Habe jetzt aber mal dem Hersteller geschrieben.

Grüße Daniel

Servus, also ich habe jetzt endlich mal ne Antwort vom Hersteller bekommen. Der CAN_CS Pin ist auf Pin 10 und der SD_CS Pin auf 9. Das heißt, ich muss im obigen Programm den SPI_CS_PIN auf 10 ändern?

Funktioniert es denn jetzt?

Nein leider nicht, es kommt noch immer die Meldung
“CAN BUS Shield init fail
Init CAN BUS Shield again”

Woran könnte es denn noch liegen?

Es muss ja anscheinen irgendwas mit der Baudrate vom Shield zu tun haben oder?

So, endlich mal gute Nachrichten. Habe es endlich geschafft, die Initialisierung hat funktioniert. Durch etlichen suchen bin ich auf eine Seite gekommen, bei der es richtig gut erklärt wird was man machen muss um ein Can Bus Shield mit einem Arduino Mega 2560 zu verbinden. Nach verbiegen und neu verbinden von paar Pins und einer Änderung in der defaults.h, hat es dann endlich geklappt ;) Falls es sich jemand anschauen will, kann des auf dieser Seite machen

https://learn.sparkfun.com/tutorials/can-bus-shield-hookup-guide/discuss

Ich bedanke mich aber recht herzlich bei euch allen für eure Unterstützung.

Grüßle Daniel

Einen wunderschönen guten Morgen euch allen. Ich vermisse euch alle schon so, dass ich gleich mal eine weitere, hoffentlich schnell zu beantwortende Frage an euch habe :P Und zwar geht es um die Codes die man zum programmieren nutzt. In welcher Datei sind diese denn zu finden? Die müssen doch nämlich irgendwo gespeichert sein. Oder hat zufällig jemand eine Liste mit allen Befehlen für die Sparkfun CAN-Bus Libary? Hatte nämlich versucht mit dem Befehl "Canbus.sendMsgBuf" etwas über den CAN.Bus zu schicken, aber es kam leider die Fehlermeldung, dass der Befehl sendMsgBuf nicht bekannt ist. Deswegen eben die Frage, wo die Befehle der Libary zu finden ist.

Euch natürlich schon mal ein recht herzliches Dankeschön und nen Guten Start in den Tag ;)

Grüßle Daniel

Moin,

ich sehe schon, das wird ein Langzeitprojekt :)

Also, das blöde an CAN mit Arduino ist, dass es keine einheitlichen Libs und Schnittstellen dafür gibt.

Ganz grob gibt es erst mal drei Wege:

Die beiden ersten habe ich und ein wenig Erfahrung damit. Von der dritten Variante habe ich beschlossen die Finger zu lassen, aus Gründen die Du bestimmt langsam verstehst. :)

Diese Sparkfun Library kannte ich noch nicht, sieht eher nach Democode als fertiger Library aus.

Hier im Quelltext https://github.com/sparkfun/SparkFun_CAN-Bus_Arduino_Library/tree/master/src findet man dies

class CanbusClass
{
  public:

    CanbusClass();
    char init(unsigned char);
    char message_tx(void);
    char message_rx(unsigned char *buffer);
char ecu_req(unsigned char pid, char *buffer)

equ_req klingt nach ECU Request, also nach Datenübertragung mit Steuergerät im Auto, das ist eher nicht das, was Du suchst.

Und die Funktion message_rx sendet immer das gleiche

char CanbusClass::message_tx(void) {
    tCAN message;


    // einige Testwerte
    message.id = 0x7DF;
    message.header.rtr = 0;
    message.header.length = 8;
    message.data[0] = 0x02;
    message.data[1] = 0x01;
    message.data[2] = 0x05;
    message.data[3] = 0x00;
    message.data[4] = 0x00;
    message.data[5] = 0x00;
    message.data[6] = 0x00;
    message.data[7] = 0x00;

Also entweder schreibst Du die Lib Deinen Anforderungen entsprechend um, oder suchst eine andere.

Die Firma Watterott baut auch ein Shield mit dem MCP2515, die verlinken auf diese Lib https://github.com/watterott/Arduino-Libs/tree/master/MCP2515

Schaut meiner Meinung nach besser aus, kann man eventuell anpassen, wenn es wieder die Chip-Select Problematik gibt.