Wemos D1 R1 und MCP2515

Hallo zusammen,

ich möchte gerne meine Heizungssteuerung umbauen:

Aktuell benutzte ich einen Arduino + Ethernetshield und sende dann per MQTT meine Befehle an FHEM.

Ich hatte mir nun überlegt die Kommunikation auf CAN-BUS umzustellen.

Habe mir zum Test 2 MCP2515 CAN Module gekauft.

Aktuell habe ich aber das Problem das ich keine CAN Botschaften empfange.

Hier hätte ich nun folgende Fragen an euch:

  1. Wie kann ich überprüfen ob der Sende die Botschaft richtig rausschickt?
  2. Die Abfrage beim Empfänger "if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
    wird nicht ausgeführt da der 1.Ausdruck der Abfrage immer 1 ist. ERROR_OK ist aber mit 0 hinterlegt. Woran kann das liegen das der Ausdruck 1 ist.

Anbei mein Coder für Sender und Empfänger:

Sender:

#include <SPI.h>
#include <mcp2515.h>


struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(10);


void setup() {

  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

  canMsg2.can_id  = 0x036;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x0E;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x00;
  canMsg2.data[3] = 0x08;
  canMsg2.data[4] = 0x01;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0xA0;
  
  //while (!Serial);
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);//, MCP_8MHZ);
  mcp2515.setNormalMode();
  
  Serial.println("Example: Write to CAN");
}

void loop() {

  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;
  
  mcp2515.sendMessage(&canMsg1);


 /* mcp2515.sendMessage(MCP2515::TXB1,&canMsg2);
  for (int i = 0; i<canMsg2.can_dlc; i++)  {  // print the data
        
      Serial.print(canMsg2.data[i],HEX);
      Serial.print(" ");

    }
  Serial.println("Messages sent");
  */
  delay(1000);

}

Empfänger:

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg;
MCP2515 mcp2515(10);


void setup() {
  
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);//, MCP_8MHZ);
  mcp2515.setNormalMode();
  
  Serial.println("------- CAN Read ----------");
  Serial.println("ID  DLC   DATA");
}

void loop() {
  int test = mcp2515.readMessage(&canMsg);
  
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
      
    Serial.print(canMsg.can_id, HEX); // print ID
    Serial.print(" -"); 
    Serial.print(canMsg.can_dlc, HEX); // print DLC
    Serial.print(" -");
     Serial.println(canMsg.can_dlc);
    for (int i = 0; i<canMsg.can_dlc; i++)  {  // print the data
        
      Serial.print(canMsg.data[i],HEX);
      Serial.print(" ");

    }

    Serial.println();   
    delay(1000);   
  }

}

Könnt ihr mir weiterhelfen wie ich den Fehler herausfinden kann?

Vielen Dank

Gruß

Hardtacker

Wie hast du denn die MCP2515 mit dem Wemos verbunden ?
Soweit mir bekannt ist, nutzt der MCP2515 5Volt, aber der Wemos an den Pins nur 3,3Volt.
Hast du das berücksichtigt ?

Die zwei Module zum spielen sind ja ok, aber warum tust du dir das auf einen ESP8266 an.
Nimm einen ESP32, der hat CAN on Board - brauchst nur die CAN-Bus Wandler.

1) Wie kann ich überprüfen ob der Sende die Botschaft richtig rausschickt?

ich hab da in meinem Testaufbau einfach einen weiteren laufen. Der macht nichts anderes als einen "Canbus-Monitor" bereitzustellen. Halt alles was er am Bus sieht, auf die Serielle rausschickt.

edit:

 mcp2515.setBitrate(CAN_125KBPS);//, MCP_8MHZ);

zeig bitte ein Echtbild von deinen Wandlern was da wirklich an Quartz drauf ist.

Im Thema UNO - Mega - Teensy mittels CAN-Bus verbinden habe ich ein paar Dinge probiert, deren Lektüre möglicherweise für Dich von Nutzen sein könnte.

Hallo,

vielen Dank für die schnellen Antworten.

Warum ESP8266?

Weil ich noch ein paar Module hier habe, gerade Wemos Mini, welche sehr klein sind. Fände ich praktisch.

Vielen Dank für den Link zum Arduino Beispiel.

Für den ESP32 wäre ich offen,müsste mir eh 4 Module kaufen. Wichtig ist mir nur das es vorab läuft.

Aktuell habe ich ja überall ein Uno mit Ethernetshield. Eigentlich kann ich diesen auch wiederverwenden.
Ist ökologischer :slight_smile:

Hab mal meinen Aufbau umgebaut auf Arduino Uno und Arduino Mega.

Hier funktioniert mein Code. Sprich die CAN Module funktionieren.

Liegt es nun wirklich daran dass das Spannungslevel mit 3,3V beim ESP8266 nicht ausreicht?

Hatte VCC & GND vom CAN Board auf eine externe Spannungsquelle 5V gesetzt und auch hier hat es nicht funktioniert. Bin sehr verwundert, da ja das ESP8266 Board 5V rausführt.

Auf den Oszillator vom CAN Board steht EAS8.000 sprich 8MHZ richtig?

Hardtacker:
Hatte VCC & GND vom CAN Board auf eine externe Spannungsquelle 5V gesetzt und auch hier hat es nicht funktioniert. Bin sehr verwundert, da ja das ESP8266 Board 5V rausführt.

Der Wemos bringt an den Pins nur 3,3V, keine 5V.
Und die Pins können Schaden nehmen, wenn da 5V drauf kommen.

jetzt kanns ja ein Modul auf den ESP8266 hängen wennst weist, dass es am Uno/MEGA geht.

Bei den bisherigen Angaben kann ich dir nur sagen: bei mir klappen die Module auch am ESP8266.
Mehr kann man dir aktuell nicht helfen.

es fehlt:

  • Schaltbild wie du was verkabelt hast
  • Hochauflösendes Bild von deinem Aufbau worauf man wirklich jedes einzelne Kabel sieht
  • der anklickbare Link zur verwendeten CAN Library
  • die Serial.print Ausgaben des betroffenen Sketch damit man sieht was er bei dir macht.