Forum: Mikrocontroller und Digitale Elektronik 2 Esp32 mit CAN verbinden


von Shannah (Gast)


Lesenswert?

Hallo zusammen,

ich bin komplett neu im Feld des ESP32 ( & auch Arduino).

Ich versuche gerade zwei ESP32 über CAN zu verbinden.

Dazu habe ich zwei MCP2515 Module, die ich so verpinnt habe mit den 
ESP32:

CS to 5
SO to 19
SCK to 18
SI to 23
(INT to 2) INT weiß ich nicht genau, wei ich setzen soll, eigentlihc an 
zwei, aber wenn der stecker dort sitzt, kann ich den sketch nicht mehr 
hochladen.Die Arduino IDE versucht dann zu connecten, sagt dann aber 
Error.

Ich benutze dazu die Bibliothek von Coryjfowler

https://github.com/coryjfowler/MCP_CAN_lib

und folgenden Code
(Ich habe CS auf 5 gesetzt, ist das so richtig?)

ESP32 Sender:
1
#include <mcp_can.h>
2
#include <SPI.h>
3
4
MCP_CAN CAN0(5);     // Set CS to pin 5
5
6
void setup()
7
{
8
  Serial.begin(115200);
9
10
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
11
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
12
  else Serial.println("Error Initializing MCP2515...");
13
14
  CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted
15
}
16
17
byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
18
19
void loop()
20
{
21
  // send data:  ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
22
  byte sndStat = CAN0.sendMsgBuf(0x100, 0, 8, data);
23
  if(sndStat == CAN_OK){
24
    Serial.println("Message Sent Successfully!");
25
  } else {
26
    Serial.println("Error Sending Message...");
27
  }
28
  delay(100);   // send data per 100ms
29
}

Und für den Receiver:
1
// CAN Receive Example
2
//https://github.com/coryjfowler/MCP_CAN_lib/blob/master/examples/CAN_receive/CAN_receive.ino
3
4
#include <mcp_can.h>
5
#include <SPI.h>
6
7
long unsigned int rxId;
8
unsigned char len = 0;
9
unsigned char rxBuf[8];
10
char msgString[128];                        // Array to store serial string
11
12
#define CAN0_INT 2                              // Set INT to pin 2
13
MCP_CAN CAN0(5);                               // Set CS to pin 10
14
15
16
void setup()
17
{
18
  Serial.begin(115200);
19
  
20
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
21
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
22
    Serial.println("MCP2515 Initialized Successfully!");
23
  else
24
    Serial.println("Error Initializing MCP2515...");
25
  
26
  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
27
28
  pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input
29
  
30
  Serial.println("MCP2515 Library Receive Example...");
31
}
32
33
void loop()
34
{
35
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
36
  {
37
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
38
    
39
    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
40
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
41
    else
42
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
43
  
44
    Serial.print(msgString);
45
  
46
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
47
      sprintf(msgString, " REMOTE REQUEST FRAME");
48
      Serial.print(msgString);
49
    } else {
50
      for(byte i = 0; i<len; i++){
51
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
52
        Serial.print(msgString);
53
      }
54
    }
55
        
56
    Serial.println();
57
  }
58
}

Leider erhalte ich immer vom Sender

"Error Sending message"

Und vom Receiver:

"Standard ID: 0x000       DLC: 0  Data:"

Ich bin sehr neu auf dem Gebiet und weiß nicht so recht, was ich alles 
beachten muß. Meine Internetrecherche hat mir für CAN und ESP32 auch 
nicht viel gebracht.

Vielleicht kann mir hier jemadn helfen.

Vielen Dank!

von Thomas F. (igel)


Lesenswert?

Shannah schrieb:
> ESP32 Sender:
>   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

Dieses Modul hat also einen 8MHz Quarz.
Warum muss es denn gleich 500kBps sein und für den Anfang nicht was 
kleines wie 33kBps?

Shannah schrieb:
> Und für den Receiver:
>   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)

Hier hat das Modul nun 16MHz. Hast du wirklich zwei unterschiedliche 
gekauft?

von Wolfgang (Gast)


Lesenswert?

Shannah schrieb:
> Vielleicht kann mir hier jemadn helfen.

Die mit der Bibliothek mitgelieferten Beispiele laufen?
Dann baue darauf auf und guck dir dazu die Signale auf dem Bus an.

von Jochen S. (jochen_s)


Lesenswert?

Kurze Frage: ist CAN0 wirklich der am MCP der ESP32 hat doch einen 
eingebauten CAN Controller. Eventuell wird der angesprochen? Eigentlich 
reicht nur der CAN Treiber direkt an den CAN RX und TX  Pins?

Grüße Jochen

von Paula Q. (bytebuffer)


Lesenswert?

Wie hast du das CAN - Modul  an die Spannungsversorgung konnektiert ?

von Shannah (Gast)


Lesenswert?

Thomas F. schrieb:
> Shannah schrieb:
> ESP32 Sender:
>   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
>
> Dieses Modul hat also einen 8MHz Quarz.
> Warum muss es denn gleich 500kBps sein und für den Anfang nicht was
> kleines wie 33kBps?
>
> Shannah schrieb:
> Und für den Receiver:
>   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
>
> Hier hat das Modul nun 16MHz. Hast du wirklich zwei unterschiedliche
> gekauft?

Ich habe 2x 8Mhz, da habe ich wohl beim Kopieren des Codes etwas 
übersehen. Bei meinen ganzen Versuchen, bin ich kurzzeitig etwas 
durcheinander gekommen.

von Shannah (Gast)


Lesenswert?

Wolfgang schrieb:
> Shannah schrieb:
> Vielleicht kann mir hier jemadn helfen.
>
> Die mit der Bibliothek mitgelieferten Beispiele laufen?
> Dann baue darauf auf und guck dir dazu die Signale auf dem Bus an.

Nein, sie funktionieren leider auch nicht. Die Initialisierung des MCP 
2515 klappt wohl, zumindest geht er in die If Bedingung und gibt mir den 
Erfolg im seriellen Monitor aus. Aber senden klappt nicht und/ oder 
empfangen.

von Stefan F. (Gast)


Lesenswert?

Shannah schrieb:
> Ich habe 2x 8Mhz, da habe ich wohl beim Kopieren des Codes etwas
> übersehen. Bei meinen ganzen Versuchen, bin ich kurzzeitig etwas
> durcheinander gekommen.

Läuft es denn jetzt nach der Korrektur?

von Shannah (Gast)


Lesenswert?

Paula Q. schrieb:
> Wie hast du das CAN - Modul  an die Spannungsversorgung
> konnektiert ?

An 5v angelegt.

von Wolfgang (Gast)


Lesenswert?

Shannah schrieb:
> Aber senden klappt nicht und/ oder empfangen.

Was sagt ein LA/DSO zu den Signalen auf dem Bus?

von Helmut -. (dc3yc)


Lesenswert?

Sind Terminierungswiderstände am CAN-Bus?

von Shannah (Gast)


Lesenswert?

Wolfgang schrieb:
> Shannah schrieb:
>> Aber senden klappt nicht und/ oder empfangen.
>
> Was sagt ein LA/DSO zu den Signalen auf dem Bus?

Das habe ich bisher nocht nicht gemessen, dazu müßte ich mir ein 
Oszilloskop leihen. Werde ich in Angriff nehmen.

von Shannah (Gast)


Lesenswert?

Helmut -. schrieb:
> Sind Terminierungswiderstände am CAN-Bus?

Nein, in den Beispielen, die ich im Internet gefunden habe, waren keine 
vorhanden, deshalb habe ich auch keine gesetzt.

von Stefan F. (Gast)


Lesenswert?

Shannah schrieb:
> dazu müßte ich mir ein Oszilloskop leihen

Kauf Dir ein DSO-138. Das ist zwar ein Spielzeug, aber dennoch für viele 
Aufgaben (wie dieser) hilfreich.

von Wolfgang (Gast)


Lesenswert?

Stefan F. schrieb:
> Kauf Dir ein DSO-138. Das ist zwar ein Spielzeug, aber dennoch für viele
> Aufgaben (wie dieser) hilfreich.

Aber ausgerechnet für diese Aufgabe hier eher nicht. Mit der Bandbreite 
von 200kHz und einer Speichertiefe von 1024 Punkten, ist man bei 
Datentelegrammen sehr schnell am Ende, gerade wenn es um mehr als die 
Symbolrate geht. Bei 500kb/s wird das schon gar nichts bzw. ist nur noch 
Krampferei.

Mit einem kleiner LA für keine 7€ ist man da deutlich besser bedient.
https://www.ebay.de/itm/202437260818

von Shannah (Gast)


Lesenswert?

Inzwischen habe ich es geschafft, dass zwei Arduino UNO über zwei 
MCP2515 Module kommunizieren, dass klappt auch wunderbar.

Mit dem ESP32 läuft es leider immer noch nicht. Leider bin ich (noch) 
nicht so technisch bewandert, könnte es daran liegen, dass das MCP2515 
Modul 5v benötigt, mein ESP32 Wroom32 allerdings ein 3,v, V 
Mikrocontroller ist?Eventuell bräuchte ich somit einen Wandler...

von Shannah (Gast)


Lesenswert?

Juhuuu! Nach x-Versuchen habe ich endlich eine Bibliothek gefunden, die 
mir mein Projekt ermöglicht.
Nur noch Anpassungen im Code mußte ich machen, und nun klappt es auch 
mit den 2 ESP32 und den 2 MCP2515 Modulen :)

DAnke euch allen für eure Hilfe, das hat mir sehr geholfen mich an den 
richtigen Stellen mit den Sachen auseinander zu setzen:)

von Stefan F. (Gast)


Lesenswert?

Wolfgang schrieb:
> Bei 500kb/s wird das schon gar nichts bzw. ist nur noch
> Krampferei.

Stimmt. Die Bitrate hat er allerdings unter Kontrolle, er kann eine 
niedrigere benutzen.

Mit dem Logic Analyzer kann er die Signalpegel/Qualität nicht prüfen, 
die hier in Frage gestellt wurden. Aber zusätzlich zum Oszilloskop wäre 
so ein Ding sehr hilfreich.

von Ulli13 (Gast)


Lesenswert?

Hallo Shanna,

ich vermute du hast den Bus nicht abgeschlossen, bei 2 steuergeräten 
must du an beide Enden 120 Ohm setzen. An den MCP2515 gibt es auch ein 
Brücke die genau das bewirkt. Messbar ist das ganze wenn schaltung 
Stromlos, dann must auf dem Canbus 60 ohm messen.
Am ESP32 geht auch nur ein SN65HVD Modul wo nur an P4 RX und P5 TX 
angeschlossen wird und die Bibliothek ESP32-protocol-demo-master 
braucht.
Gerade heute zum laufen gebracht. :-)

Habe im Auto einen ESP8266 laufen, der Motorcan 500kB daten abfragt und 
auf einer webseite darstellt. SD-karte und Uhr auch dran.

Gruß Uli

von TR.0LL (Gast)


Lesenswert?

Für den ESP32 brauchst du nur noch einen can-transceiver, der rest 
steckt schon in dem ESP32 
(http://www.iotsharing.com/2017/09/how-to-use-arduino-esp32-can-interface.html).

von david_le (Gast)


Lesenswert?

Hi,

Cool das es geklappt hat, hänge grad am gleichen Problemfall.
Könntest du sagen welche Bibliothek du benutzt hast und welche 
Änderungen du vorgenommen hast damit die Übertragung klappt ?



Danke MFG

von RudolfAtITD (Gast)


Lesenswert?

Ist das die typische Qualität in diesem Forum?
 - 19 Beiträge
 - Am 16.12.2019 verkündet der Initiator "Juchhu...", ohne zu sagen, 
welche
   Bibliothek er gefunden hat.
 - Danach kommen noch 3 (unnötige) Beiträge mit der Frage "welche 
Bibiliothek
   hast Du gefunden?" als krönenden Abschluss.
Einfach toll. Ich suche eigentlich nach Lösungen für mein Problem.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.