In diesem Tutorial zeige ich Euch, wie ihr mehrere Arduinos über eine richtige Canbus Schnittstelle, wie ihr sie im Auto vorfindet, verbinden und kommunizieren lassen könnt.
Der Aufbau ist relativ simpel und die Verbindung untereinander erfordert nur 2 Drähte.
Der Vorteil der Verbindung liegt hier klar auf der Hand und wird deshalb auch von Herstellern seit Jahren genutzt, schnelle Datenübertragungen mit möglichst wenig Kabel.
Benötigte Library's:
- SPI.h
- mcp_can.h
Benötigtes Material:
- Mindestens 2 Arduino's (Uno, Nano etc.)
- Mindestens 2 MCP2515 Module
- Verdrahtungsmaterial (Dupont/Jumper Kabel)
- Optional 2 Jumper für Abschlussterminierung
Info:
Für eine störungsfreie Übertragung, empfehle ich ein verdrilltes und geschirmtes Kabel, dass einseitig geerdet wird.
Schema:
Pinbelegung/Anschlussplan:
SENDER CODE
/*
Copyright ©2021 by Mittns <http://www.mittns.de>
Program Version: 1.0
Last modified: 2021-11-02
EN
### Arduino Canbus Connection SENDER ###
With this sketch you can send/receive multiple
messages via canbus.
DE
### Arduino Canbus Verbindung SENDER ###
Mit dieser Skizze kannst du mehrere Nachrichten über Canbus
senden und empfangen.
*/
const float Sketch_Version = 1.0;
const String Sketch_Datum = "2021-11-02";
#include <SPI.h> // SPI Library wird benötigt
#include <mcp_can.h> // mcp_can Library wird benötigt
MCP_CAN CAN0(10); // MCP2515 CS Pin
//##############################################################################
//############################## Konfiguration ###############################
//##############################################################################
unsigned char Beispiel_Nachricht1[3] = {1,1,1}; // Ein Array mit [3] Zeichen
unsigned char Beispiel_Nachricht2[6] = {0,0,0,0,0,0}; // Ein Array mit [6] Zeichen
unsigned char Beispiel_Nachricht3[8] = {1,2,3,4,5,6,7,8}; // Ein Array mit [8] Zeichen
//##############################################################################
//################################## Setup ###################################
//##############################################################################
void setup() {
delay(1000);
Serial.begin(57600);
Serial.print("Sketch Version: " + String(Sketch_Version));
Serial.println(" (" + Sketch_Datum + ") by Mittns <https://www.mittns.de>");
while (CAN_OK != CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ)) {
Serial.println("MCP2515 Initiierungsfehler! Versuche erneute Verbindung...");
delay(1000);
}
CAN0.setMode(MCP_NORMAL);
Serial.println("Bereit!");
}
//##############################################################################
//################################## Loop ####################################
//##############################################################################
//Aufbau der Can Nachricht:
//CAN.sendMsgBuf(0x001, 0, 3, Beispiel_Nachricht1);
// 0x001 = ID des Empfängers
// 0 = Standard Frame
// 3 = DLC = Data Length Code = Länge des Nachrichten-Arrays
// Beispiel_Nachricht1 = Nachrichten-Array
void loop() {
Serial.println("Sende Beispiel 1");
CAN0.sendMsgBuf(0x001, 0, 3, Beispiel_Nachricht1);
delay(2000);
Serial.println("Sende Beispiel 2");
CAN0.sendMsgBuf(0x001, 0, 6, Beispiel_Nachricht2);
delay(2000);
Serial.println("Sende Beispiel 3");
CAN0.sendMsgBuf(0x001, 0, 8, Beispiel_Nachricht3);
delay(2000);
}
Alles anzeigen
EMPFÄNGER CODE
/*
Copyright ©2021 by Mittns <http://www.mittns.de>
Program Version: 1.0
Last modified: 2021-11-04
EN
### Arduino Canbus Connection EMPFÄNGER ###
With this sketch you can send/receive multiple
messages via canbus.
DE
### Arduino Canbus Verbindung EMPFÄNGER ###
Mit dieser Skizze kannst du mehrere Nachrichten über Canbus
senden und empfangen.
*/
const float Sketch_Version = 1.0;
const String Sketch_Datum = "2021-11-02";
#include <mcp_can.h> // mcp_can Library wird benötigt
#include <SPI.h> // SPI Library wird benötigt
MCP_CAN CAN0(10); // MCP2515 CS Pin
char Nachrichten_Puffer[128];
//################################################################
//####################### Konfiguration ########################
//################################################################
unsigned char Beispiel_Nachricht1[3] = {1,1,1}; // Ein Array mit [3] Zeichen
unsigned char Beispiel_Nachricht2[6] = {0,0,0,0,0,0}; // Ein Array mit [6] Zeichen
unsigned char Beispiel_Nachricht3[8] = {1,2,3,4,5,6,7,8}; // Ein Array mit [8] Zeichen
//################################################################
//########################### Setup ############################
//################################################################
void setup() {
delay(1000);
Serial.begin(57600);
Serial.print("Sketch Version: " + String(Sketch_Version));
Serial.println(" (" + Sketch_Datum + ") by Mittns <https://www.mittns.de>");
while (CAN_OK != CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ)) {
Serial.println("MCP2515 Initiierungsfehler! Versuche erneute Verbindung...");
delay(1000);
}
CAN0.setMode(MCP_NORMAL);
Serial.println("Bereit!");
}
//################################################################
//########################### Loop #############################
//################################################################
void loop() {
unsigned long ID = 0x00;
unsigned char DLC = 0;
unsigned char DATA[8];
if(CAN_MSGAVAIL == CAN0.checkReceive()) {
CAN0.readMsgBuf(&ID, &DLC, DATA);
Serial.print("ID: 0x");
sprintf(Nachrichten_Puffer, "%.3X", ID);
Serial.print(Nachrichten_Puffer);
Serial.print(" - ");
Serial.print("Daten: ");
for(int i = 0; i <DLC; i++)
{
Serial.print(DATA[i]);
Serial.print(" ");
}
Serial.println();
}
}
Alles anzeigen
Nach erfolgreicher Verdrahtung und Programmierung der Arduinos, sollte nun im 2-Sekundentakt beim Empfänger eine Nachricht erscheinen.