- Einführung in CAN
- Vergleich von CAN über SPI & I2C
- CAN-Protokollanwendungen
- Verwendung des CAN-Protokolls in Arduino
- Erforderliche Komponenten
- Schaltplan
- Verbindung zwischen zwei MCP2515 CAN-Modulen
- Programmierung von Arduino für die CAN-Kommunikation
- Erklärung des CAN-Senderseitencodes (Arduino Nano)
- Erklärung des CAN-Empfängerseitencodes (Arduino UNO)
- Arbeiten der CAN-Kommunikation in Arduino
Heutzutage besteht ein durchschnittliches Auto aus etwa 60 bis 100 Sensoreinheiten zum Erfassen und Austauschen von Informationen. Da die Autohersteller ihr Auto mit Funktionen wie autonomem Fahren, Airbag-System, Reifendrucküberwachung, Tempomat usw. immer intelligenter machen, wird diese Zahl voraussichtlich nur hoch sein. Im Gegensatz zu anderen Sensoren verarbeiten diese Sensoren kritische Informationen. Daher sollten die Daten dieser Sensoren unter Verwendung von Standardprotokollen für die Fahrzeugkommunikation übertragen werden. Beispielsweise sind Daten des Tempomatsystems wie Geschwindigkeit, Drosselklappenstellung usw. wichtige Werte, die an die elektronische Steuereinheit (ECU) gesendet werden.Bei der Entscheidung über das Beschleunigungsniveau des Fahrzeugs kann eine Fehlkommunikation oder ein Datenverlust zu kritischen Fehlern führen. Im Gegensatz zu Standardkommunikationsprotokollen wie UART, SPI oder I2C verwenden Entwickler daher sehr zuverlässige Autokommunikationsprotokolle wie LIN, CAN, FlexRay usw.
Von allen verfügbaren Protokollen wird CAN überwiegend verwendet und ist beliebt. Wir haben bereits besprochen, was CAN ist und wie CAN funktioniert. In diesem Artikel werden wir uns also noch einmal mit den Grundlagen befassen und schließlich auch Daten zwischen zwei Arduinos über CAN-Kommunikation austauschen. Klingt interessant, oder? Also lasst uns anfangen.
Einführung in CAN
CAN aka Controller Area Network ist ein serieller Kommunikationsbus für Industrie- und Automobilanwendungen. Es ist ein nachrichtenbasiertes Protokoll, das für die Kommunikation zwischen mehreren Geräten verwendet wird. Wenn mehrere CAN-Geräte wie unten gezeigt miteinander verbunden sind, bildet die Verbindung ein Netzwerk, das sich wie unser zentrales Nervensystem verhält und es jedem Gerät ermöglicht, mit jedem anderen Gerät im Knoten zu sprechen.
Ein CAN-Netzwerk besteht nur aus zwei Drähten CAN High und CAN Low für die bidirektionale Datenübertragung, wie oben gezeigt. Normalerweise liegt die Kommunikationsgeschwindigkeit für CAN zwischen 50 Kbit / s und 1 Mbit / s, und die Entfernung kann zwischen 40 Metern bei 1 Mbit / s und 1000 Metern bei 50 Kbit / s liegen.
Format der CAN-Nachricht:
Bei der CAN-Kommunikation werden die Daten im Netzwerk als bestimmtes Nachrichtenformat übertragen. Dieses Nachrichtenformat enthält viele Segmente, aber zwei Hauptsegmente sind die Kennung und die Daten, die beim Senden und Beantworten von Nachrichten im CAN-Bus helfen.
Kennung oder CAN-ID: Die Kennung wird auch als CAN-ID oder auch als PGN (Parameter Group Number) bezeichnet. Es wird verwendet, um die in einem CAN-Netzwerk vorhandenen CAN-Geräte zu identifizieren. Die Länge des Bezeichners beträgt je nach Art des verwendeten CAN-Protokolls entweder 11 oder 29 Bit.
Standard-CAN: 0-2047 (11 Bit)
Erweiterter CAN: 0-2 29 -1 (29-Bit)
Daten: Dies sind die tatsächlichen Sensor- / Steuerdaten, die von einem Gerät an ein anderes gesendet werden müssen. Die Größendaten können zwischen 0 und 8 Byte lang sein.
Datenlängencode (DLC): 0 bis 8 für die Anzahl der vorhandenen Datenbytes.
In CAN verwendete Drähte:
Das CAN-Protokoll besteht aus zwei Drähten, nämlich CAN_H und CAN_L, um Informationen zu senden und zu empfangen. Beide Drähte wirken als Differenzleitung, dh das CAN-Signal (0 oder 1) wird durch die Potentialdifferenz zwischen CAN_L und CAN_H dargestellt. Wenn die Differenz positiv und größer als eine bestimmte Mindestspannung ist, ist sie 1 und wenn die Differenz negativ ist, ist sie eine 0.
Normalerweise wird ein Twisted Pair-Kabel für die CAN-Kommunikation verwendet. Ein einzelner 120-Ohm-Widerstand wird im Allgemeinen an den beiden Enden des CAN-Netzwerks verwendet, wie in der Abbildung gezeigt. Dies liegt daran, dass die Leitung ausgeglichen und an dasselbe Potential gebunden werden muss.
Vergleich von CAN über SPI & I2C
Da wir bereits gelernt haben, wie man SPI mit Arduino und IIC mit Arduino verwendet, vergleichen wir die Funktionen von SPI und I2C mit CAN
Parameter | SPI | I2C | KÖNNEN |
Geschwindigkeit | 3 Mbit / s bis 10 Mbit / s | Standard: 100 Kbit / s | 10 KBit / s bis 1 MBit / s Hängt auch von der Länge des verwendeten Kabels ab |
Schnell: 400 Kbit / s | |||
Highspeed: 3,4 Mbit / s | |||
Art | Synchron | Synchron | Asynchron |
Anzahl der Drähte | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 Drähte (SDA, SCL) | 2 Drähte (CAN_H, CAN_L) |
Duplex | Vollduplex | Halbduplex | Halbduplex |
CAN-Protokollanwendungen
- Aufgrund der Robustheit und Zuverlässigkeit des CAN-Protokolls werden sie in Branchen wie Automobilindustrie, Industriemaschinen, Landwirtschaft, medizinische Geräte usw. verwendet.
- Da die Komplexität der Verkabelung in CAN reduziert ist, werden sie hauptsächlich in Automobilanwendungen wie dem Auto eingesetzt.
- Niedrige Kosten für die Implementierung und auch der Preis für Hardwarekomponenten sind geringer.
- Einfaches Hinzufügen und Entfernen der CAN-Bus-Geräte.
Verwendung des CAN-Protokolls in Arduino
Da Arduino keinen eingebauten CAN-Port enthält, wird ein CAN-Modul namens MCP2515 verwendet. Dieses CAN-Modul ist über die SPI-Kommunikation mit Arduino verbunden. Lassen Sie uns mehr über MCP2515 im Detail erfahren und wie es mit Arduino verbunden ist.
CAN-Modul MCP2515:
Das MCP2515-Modul verfügt über einen CAN-Controller MCP2515, einen Hochgeschwindigkeits-CAN-Transceiver. Die Verbindung zwischen MCP2515 und MCU erfolgt über SPI. So ist es einfach, mit jedem Mikrocontroller mit SPI-Schnittstelle zu kommunizieren.
Für Anfänger, die CAN Bus lernen möchten, ist dieses Modul ein guter Anfang. Diese CAN SPI-Karte ist ideal für industrielle Automatisierung, Hausautomation und andere eingebettete Projekte in der Automobilindustrie.
Merkmale und Spezifikationen des MCP2515:
- Verwendet den Hochgeschwindigkeits-CAN-Transceiver TJA1050
- Abmessung: 40 × 28 mm
- SPI-Steuerung zur Erweiterung der Multi-CAN-Bus-Schnittstelle
- 8 MHz Quarzoszillator
- 120Ω Klemmenwiderstand
- Hat unabhängige Taste, LED-Anzeige, Power-Anzeige
- Unterstützt 1 Mb / s CAN-Betrieb
- Niedrigstrom-Standby-Betrieb
- Es können bis zu 112 Knoten verbunden werden
Pinbelegung des CAN-Moduls MCP2515:
Pin Name |
VERWENDEN |
VCC |
5V Stromeingangspin |
GND |
Erdungsstift |
CS |
SPI SLAVE Select Pin (Aktiv niedrig) |
DAMIT |
SPI-Master-Eingang Slave-Ausgangsleitung |
SI |
SPI-Master-Ausgangs-Slave-Eingangsleitung |
SCLK |
SPI Clock Pin |
INT |
MCP2515 Interrupt-Pin |
In diesem Tutorial erfahren Sie, wie Sie Feuchtigkeits- und Temperatursensordaten (DHT11) von Arduino Nano über das CAN- Bus-Modul MCP2515 an Arduino Uno senden.
Erforderliche Komponenten
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD-Anzeige
- CAN-Modul MCP2515 - 2
- 10k Potentiometer
- Steckbrett
- Kabel anschließen
Schaltplan
Anschluss auf CAN-Transmitterseite:
Komponente - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - OUT |
A0 |
Schaltungsanschlüsse auf der CAN-Empfängerseite:
Komponente - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Bis 10K Potentiometer Center PIN |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E. |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A. |
+ 5V |
LCD - K. |
GND |
Verbindung zwischen zwei MCP2515 CAN-Modulen
H - CAN High
L - CAN Low
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H. |
H. |
L. |
L. |
Nachdem alle Verbindungen hergestellt waren, sah meine Hardware wie folgt aus
Programmierung von Arduino für die CAN-Kommunikation
Zuerst müssen wir eine Bibliothek für CAN in Arduino IDE installieren. Die Verbindung des CAN-Moduls MCP2515 mit dem Arduino wird durch die Verwendung der folgenden Bibliothek einfacher.
- Laden Sie die ZIP-Datei der Arduino CAN MCP2515 Library herunter.
- In der Arduino IDE: Skizze -> Bibliothek einschließen -> ZIP-Bibliothek hinzufügen
In diesem Tutorial ist die Codierung in zwei Teile unterteilt, einen als CAN-Sendercode (Arduino Nano) und einen als CAN-Empfängercode (Arduino UNO), die beide am Ende dieser Seite zu finden sind. Die Erklärung dafür ist wie folgt.
Stellen Sie vor dem Schreiben eines Programms zum Senden und Empfangen von Daten sicher, dass Sie die Bibliothek gemäß den obigen Schritten installiert haben und das CAN-Modul MCP2515 in Ihrem Programm wie folgt initialisiert ist.
MCP2515 CAN-Modul initialisieren:
Führen Sie die folgenden Schritte aus, um eine Verbindung mit MCP2515 herzustellen:
1. Stellen Sie die PIN-Nummer ein, an die SPI CS angeschlossen ist (standardmäßig 10).
MCP2515 mcp2515 (10);
2. Stellen Sie die Baudrate und die Oszillatorfrequenz ein
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Verfügbare Baudraten:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_125KBPS, CAN_200KBPSK
Verfügbare Taktraten:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Stellen Sie die Modi ein.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Erklärung des CAN-Senderseitencodes (Arduino Nano)
Im Senderbereich ist Arduino Nano über SPI-Pins mit dem CAN-Modul MCP2515 verbunden, und DHT11 sendet Temperatur- und Feuchtigkeitsdaten an den CAN-Bus.
Zunächst sind die erforderlichen Bibliotheken enthalten: SPI-Bibliothek für die Verwendung von SPI-Kommunikation, MCP2515-Bibliothek für die Verwendung von CAN-Kommunikation und DHT-Bibliothek für die Verwendung von DHT-Sensoren mit Arduino . Wir haben zuvor DHT11 mit Arduino verbunden.
#einschließen
Nun wird der Pin-Name von DHT11 (OUT-Pin) definiert, der mit dem A0 von Arduino Nano verbunden ist
#Definieren Sie DHTPIN A0
Außerdem ist der DHTTYPE als DHT11 definiert.
#define DHTTYPE DHT11
Ein canMsg struct-Datentyp zum Speichern des CAN-Nachrichtenformats.
struct can_frame canMsg;
Stellen Sie die PIN-Nummer ein, an die SPI CS angeschlossen ist (standardmäßig 10).
MCP2515 mcp2515 (10);
Außerdem wird das Objekt dht für die Klasse DHT mit DHT-Pin mit Arduino Nano und DHT-Typ als DHT11 initialisiert.
DHT dht (DHTPIN, DHTTYPE);
Weiter in void setup ():
Beginnen Sie die SPI-Kommunikation mit der folgenden Anweisung
SPI.begin ();
Verwenden Sie dann die folgende Anweisung, um Temperatur- und Feuchtigkeitswerte vom DHT11-Sensor zu empfangen.
dht.begin ();
Als nächstes wird der MCP2515 mit dem folgenden Befehl zurückgesetzt
mcp2515.reset ();
Jetzt ist der MCP2515 auf eine Geschwindigkeit von 500 KBit / s und 8 MHz als Takt eingestellt
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Und der MCP2525 ist auf Normalmodus eingestellt
mcp2515.setNormalMode ();
In der void-Schleife ():
Die folgende Anweisung ermittelt den Wert für Luftfeuchtigkeit und Temperatur und speichert sie in einer ganzzahligen Variablen h und t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Als nächstes wird die CAN-ID als 0x036 (nach Wahl) und der DLC als 8 angegeben, und wir geben die h- und t-Daten an die Daten und Daten weiter und ruhen alle Daten mit 0 aus.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Luftfeuchtigkeitswert in canMsg.data = t aktualisieren; // Temperaturwert in canMsg.data aktualisieren = 0x00; // Alles mit 0 ausruhen canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Um die Nachricht an CAN BUS zu senden, verwenden wir schließlich die folgende Anweisung.
mcp2515.sendMessage (& canMsg);
Jetzt werden die Temperatur- und Feuchtigkeitsdaten als Nachricht an den CAN-Bus gesendet.
Erklärung des CAN-Empfängerseitencodes (Arduino UNO)
Im Empfängerbereich war Arduino UNO mit dem LCD-Display MCP2515 und 16x2 verbunden. Hier empfängt der Arduino UNO die Temperatur und Luftfeuchtigkeit vom CAN-Bus und zeigt die empfangenen Daten auf dem LCD an.
Zunächst sind die erforderlichen Bibliotheken enthalten: SPI-Bibliothek für die Verwendung von SPI-Kommunikation, MCP2515-Bibliothek für die Verwendung von CAN-Kommunikation und LiquidCrsytal-Bibliothek für die Verwendung von 16x2-LCD mit Arduino .
#einschließen
Als nächstes werden die LCD-Pins definiert, die beim Verbinden mit dem Arduino UNO verwendet werden.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Zum Speichern des CAN-Nachrichtenformats wird ein Strukturdatentyp deklariert.
struct can_frame canMsg;
Stellen Sie die PIN-Nummer ein, an die SPI CS angeschlossen ist (standardmäßig 10).
MCP2515 mcp2515 (10);
In void setup ():
Zuerst wird das LCD auf den 16x2-Modus eingestellt und eine Willkommensnachricht wird angezeigt.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); Verzögerung (3000); lcd.clear ();
Beginnen Sie die SPI-Kommunikation mit der folgenden Anweisung.
SPI.begin ();
Als nächstes wird der MCP2515 mit dem folgenden Befehl zurückgesetzt.
mcp2515.reset ();
Jetzt ist der MCP2515 auf eine Geschwindigkeit von 500 KBit / s und 8 MHz als Takt eingestellt.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Und der MCP2525 ist auf Normalmodus eingestellt.
mcp2515.setNormalMode ();
Weiter in void loop ():
Die folgende Anweisung wird verwendet, um die Nachricht vom CAN-Bus zu empfangen. Wenn eine Nachricht empfangen wird, wird sie in die if- Bedingung versetzt.
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
In der if- Bedingung werden die Daten empfangen und in c anMsg gespeichert, die Daten mit dem Feuchtigkeitswert und die Daten mit dem Temperaturwert. Beide Werte werden in einer Ganzzahl x und y gespeichert.
int x = canMsg.data; int y = canMsg.data;
Nach Erhalt der Werte werden die Temperatur- und Feuchtigkeitswerte mit der folgenden Anweisung auf dem 16x2-LCD-Display angezeigt.
lcd.setCursor (0,0); lcd.print ("Luftfeuchtigkeit:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); Verzögerung (1000); lcd.clear ();
Arbeiten der CAN-Kommunikation in Arduino
Sobald die Hardware fertig ist, laden Sie das Programm für den CAN-Sender und den CAN-Empfänger (vollständige Programme finden Sie unten) auf die entsprechenden Arduino-Karten hoch. Beim Einschalten sollen Sie den Temperaturwert gelesen von DHT11 feststellen, an einem anderen Arduino durch CAN - Kommunikation und auf dem LCD - Display der 2 gesendet werden nd Arduino, wie Sie im Bild unten sehen können. Ich habe auch meine AC-Fernbedienung verwendet, um zu überprüfen, ob die auf dem LCD angezeigte Temperatur nahe an der tatsächlichen Raumtemperatur liegt.
Die komplette Arbeit finden Sie im unten verlinkten Video. Wenn Sie Fragen haben, lassen Sie diese im Kommentarbereich oder nutzen Sie unsere Foren für andere technische Fragen.