2 Esp32 mit CAN verbinden

Gast #6068619
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!
#6069264
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?
Gast #6069470
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.
Gast #6069473
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.
Gast #6070357
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
Gast #6075015
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...
Gast #6075142
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:)
Gast #6075161
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.
Gast #6247064
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
Gast #6418468
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
Gast #6746771
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren