Projekt 14: Sensor mit CAN-Schnittstelle
Dieser Bericht beschreibt die Ansteuerung eines Kombiinstruments für PKW der Marke Volkswagen mit Hilfe der Entwicklungs-, Test- und Analyseumgebung CANoe[1] der Vector Informatik GmbH[2] und mit einem Arduino Uno. Die Lösung wurde im Rahmen des Elektrotechnik-Fachprakikums im Studiengang Mechatronik der HSHL während des WS 13/14 von Ziad Abuelkhair und Daniel Block erarbeitet.
Aufgabenstellung
In diesem Projekt wurde einen VW-Kombiinstrument zur Verfügung gestellt. Hauptsichtlich bestand die Aufgabe darin, die Anzeigeelemente des Kombiinstruments anzusteuern. Die Ansteuerung der Anzeigeelemente wie z.B. Drehmzahl-Zeiger sollte mit zwei unterschiedlichen Mitteln erfolgen. Einmal mit Hilfe der bereitgestellten CAN-bus der Firma Vector und der Software CANoe mit dem Kombiinstrument zu kommunizieren, Die andere Methode war, das Kombiinstrument mit dem Mikrocontroller Arduino über ein CAN-shield zu verbinden.
Die analogen Sensordaten, zum Beispiel eines Potentiometers, sollten vom Arduino erfasst werden und über den CAN-Bus gesendet werden.
Die Aufgaben waren in Team zu lösen,dann die Lösung und den Lösungsweg zu präsentieren und zu dokumentieren.
Grundlagen CAN-Bus
Um die Funktion der zur verfügung gestellten Hardware zu testen, wird ein kleines CAN-Netzwerk mit zwei Teilnehmern aufgebaut. Ein Teilnehmer ist dabei der Arduino mit einem CAN-Shield des Herstellers SparkFun Electronics®. Der andere Teilnehmer ist ein CAN-Case der Vector Informatik GmbH. Es soll gewährleistet werden, dass beide Teilnehmer senden und empfangen können. Um dies zu wird ein kleines Programm erstellt, welches eine CAN-Botschaft empfängt und zurückschickt. Das Programm bedient sich dieser Library [4] , welcher auf der Sparkfun Seite von diversen Nutzern hochgeladen wurde. Die Library lässt durch einfaches Kopieren in den Arduino Unterordner "Libraries" (z.B. ...\arduino-1.0.3\libraries) einbinden. Der Ablauf des Programmes wird am Ende dieses Kapitels erläutert. Erste Versuche mit gegebener Hard- und Software blieben erfolglos, nach diversen Tests stellte sich heraus das die Verbindung über das vorgekrimpte Kabel nicht funktioniert. Der Grund dafür ist, dass das Pinning des Sub-D Stecker nicht der üblichen Vector-Norm entspricht. Sollen vorgefertigte Kabel verwendet werden, ist ein Adapter Notwendig. Üblicherweise liegt der CAN-High (im folgenden als CAN-H bezeichnet) an Pin 7 des Sub-D Steckers und CAN-Low (im folgenden als CAN-L bezeichnet) an Pin 2. Auf dem Sparkfun Shield liegt CAN-H auf Pin 3 und CAN-L auf Pin 1. Die folgende Tabelle zeigt die Zuordnung des Adapters:
Bezeichnung | Vector-Pinning | Sparkfun-Pinning |
CAN-H | pin7 | Pin3 |
CAN-L | Pin2 | Pin1 |
Alternativ stellt das Arduino-Shield an anderer Stelle CAN-H und CAN-L zur verfügung, über diese Kontakte kann mit zwei einadrigen Leitungen einer direkte Verbindung zu dem CAN-Case hergestellt werden. Ein einfaches Aufstecken des CAN-Shieldes nur bei dem Arduino UNO möglich ist. Wird ein Arduino Mega 2560 vewendet, müssen die Pins des Shieldes mit Leitungen zu bestimmten Pins des Arduino Megas geleitet werden. Der Grund dafür ist, dass Arduino und Shield über eine sogenannte SPI Schnittstelle Kommunizieren. SPI bedeutet "Serial Peripheral Interface" und ist ein serieller Datenbus mit einer Master und Slave Architektur. Die Pins die die Schnittstelle zum SPI zur verfügung stellen liegen beim Arduino Mega 2560 anders als beim UNO. Die Pin-Zuordnung dieser Pins zeigt folgende Tabelle:
CAN-Shild | Arduino-MEGA | Arduino-UNO |
VIN | VIN | VIN |
GND | GND | GND |
GND | GND | GND |
5V | 5V | 5V |
3,3V | 3,3V | 3,3V |
RST | RST | RST |
D10 | D50 | D10 |
D11 | D51 | D11 |
D12 | D52 | D12 |
D13 | D53 | D13 |
alle anderen Pins sind zum Betrieb des Shields nicht notwendig.
Bei dem elektronischen Aufbau dieses Versuches ist zu beachten das die Enden der CAN-Leitungen mit einem 120 Ohm Widerstand zwischen CAN-H und CAN-L abgeschlossen werden müssen. Wird dies nicht gemacht kommt es zu Reflektionen der Signale an den Leitungenden wodurch im schlimmsten Fall ein Kommunizieren auf der Leitung unmöglich wird.
Benötigte Hardware/Bauteile und Dateien/Software
Nun werden in einer Übersicht die benötigten und verwendeten Komponenten zum Lösen der Aufgabe vorgestellt. Bei Bedarf wird eine kurze Erklärung hinzugefügt. Wenn nichts anderes angegeben ist, wurden die jeweiligen Komponenten im Rahmen des zur Verfügung gestellten Budgets beschafft.
Hardware-Komponenten und elektrische Bauteile
- VW Passat Kombiinstrument mit Anschlüssen für Stromversorgung und Bus-Schnittstelle; wurde von betreuendem Professor gestellt
- Labor-Netzteil für 12V DC; Inventar der HSHL
- USB-Seriell-Adapter der Vector Informatik GmbH; wurde von betreuendem Professor gestellt
- Arduino UNO; Eigentum der Studenten
- CAN-BUS Shield von SparkFun Electronics®; wurde von betreuendem Professor gestellt
- Holzplatte für Pult
- Flach-Senkkopf Holzschrauben, Kreuzschlitz PZD, 3.5 x 30 mm für das Pult
- USB-Kabel 2.0, Hi-Speed A-St auf B-St, 3m zur Kommunikation zwischen Arduino und PC
- Blitzkabelbinder, 120mm, KNø 3,5mm, natur zur Montage der Leitungen
- Experimentier-Steckboard 640/200 Kontakte
- Drehpotentiometer linear, 10 kOhm, 6 mm
- Kippschalter
- Rote 5mm-LED mit Vorwiderstand, 5 Volt
- Leitungen 0.5 mm; Inventar der HSHL
Software-Komponenten und Dateien
- Vector Informatik GmbH CANoe in der Version 7.3; wurde von betreuendem Professor gestellt
- DBC-File für Kommunikation mit dem Kombiinstrument; die Datenbank enthält alle Botschaften mit den jeweiligen Signalen; wurde von betreuendem Professor gestellt
- Can-Library für Arduino; Canbus_v4.zip
- Software Arduino IDE in der Version 1.0.5; freier Download direkt auf der Arduino-Homepage
Konstruktion und Bau eines Pults
Um den Anschluss der Bauteile zu vereinfachen, die Leitungen besser zu ordnen und das Kombiinstrument besser einsehen zu können, wurde ein Holz-Pult gebaut. Die Maße der einzelnen Platten können der technischen Zeichnung entnommen werden. Bei dem Bau wurden die Maße jedoch nicht ganz eingehalten, da die verwendeten Holzplatten aus Reststücken stammen und somit den Gegebenheiten angepasst wurden. Der Ausschnitt musste an einigen Stellen noch mit einem Bohrer und einer Holz-Raspel nachbearbeitet werden, damit eine sichere Fixierung des Kombiinstruments realisiert werden konnte. Zusätzlich wurden einige Bohrungen erstellt, in denen die Fixierung der Leitungen mittels der Kabelbinder erfolgen kann. Auch das Steckboard, der Mikrokontroller und die Bus-Leitung mit den Knoten findet dort Platz. Diese Komponenten wurden bedarfsgerecht mit Schrauben befestigt.
Erläuterungen CANoe
CANoe ist eine universelle Entwicklungs-, Test- und Analyseumgebung, die allen Projektbeteiligten während des gesamten Entwicklungsprozesses zur Verfügung steht: Der Systemhersteller wird unterstützt bei der Funktionsaufteilung, Funktionsüberprüfung und Integration des Gesamtsystems; der Zulieferer erhält durch Restbus- und Umgebungssimulation eine ideale Testumgebung.
Mit CANoe ist es möglich, Botschaften mit entsprechenden untergeordneten Signalen an den Kombiinstrument zu schicken und somit die einzelen Anzeigeelemente anzusteuern. Also die Simulation enthält Botschaften mit Signalen, die durch den Trace definiert werden können. Das Signal kann z.B. einem festen Wert zugewiesen werden oder aber auch eine Sinus-Funktion, die ihm periodisch steuert. Es ist nur notwendig zu wissen, welche Botschaften mit welchen untergeordneten Signalen einen bestimmten Anzeigeelement ansprechen. Daher sind in CANoe Bibliotheken hinterlegt, in denen diese Informationen zu finden sind. Manchmal ist es sogar notwendig mehrere Botschaften zu komponieren um einen Anzeigeelement ansteuern zu können.
Ansteuerung Kombiinstrument mit CANoe
Im folgenden Abschnitt geht es um die Ansteuerung des Kombiinstrumentes mit der Software CANoe. Dazu muss mittels des USB-Seriell-Adapters eine Verbindung des physikalischen CAN-Buses mit dem Computer hergestellt werden. Das Kombiinstrument ist auch mit dem Bus zu verbinden. Die Endknoten bestehen jeweils aus einem 120 Ohm Abschlusswiderstand. An dieser Stelle ein Verweis auf den Artikel CAN-Kommunikation mit Arduino von Jens Henze. In CANoe ist die Erstellung einer Konfiguration erforderlich. Es muss darauf geachtet werden, dass die Baudrate 500 Baud beträgt. Desweiteren ist am virtuellen Bus im Simulationsaufbau ein Interaktiver Generator einzufügen. In diesem können aus der Datenbank einzelne Botschaften importiert werden. Jede Botschaft enthält eine Reihe von Signalen. Der interaktive Generator ermöglicht die Simulation eines jeglichen Signals. So kann zum Beispiel das Drehzahl-Signal folgendermaßen stimuliert werden:
- Importieren der Botschaft mMotor_1 aus der Datenbank zb.
- Aufrufen des Fensters der Signal-Definition für das Signal MO1_Drehzahl.
- Konfigurieren des Sinus-Signals mit einer Amplitude von 4000 und einem Bias von 4000. Der Wert schwingt somit zwischen 0 und 8000.
- Zeitinkrement der Botschaft aktivieren.
- Starten des Simulation. Der Drehzahl-Zeiger des Instruments oszilliert zwischen 0 und 8000 Umdrehungen pro Minute.
- Das Verlauf der Werte und die hexadezimale Botschaft kann im Trace des Messaufbaus eingesehen werden.
Damit im nächsten Schritt das Drehzahl-Signal mittels des Arduinos angesteuert werden kann, müssen für diese Botschaft die hexadezimalen Werte, die ID und die Länge notiert werden. Im Rahmen der Bearbeitung wurde folgende Tabelle aufgestellt, die sämtliche verwendeten Botschaften enthält.
Datenbank | Botschaft | Signal | Beschreibung | Wert min | Data min | Wert max | Data max | ID | Länge |
zb | mMotor_1 | MO1_Drehzahl | Motordrehzahl | 0 | FA C0 00 00 00 00 00 00 | 8000 | FA C0 7D 00 00 00 00 00 | 280 | 8 |
KOM_339_PQ46 | mBSG_Kombi | BSK_FT_geoeffnet | Türsymbol Fahrertür | Tür auf | 00 0F 7F 7F 00 | Tür zu | 00 00 7F 7F 00 | 470 | 5 |
KOM_339_PQ46 | mBSG_Kombi | BSK_BT_geoeffnet | Türsymbol Beifahrertür | Tür auf | 00 0F 7F 7F 00 | Tür zu | 00 00 7F 7F 00 | 470 | 5 |
KOM_339_PQ46 | mBSG_Kombi | BSK_HL_geoeffnet | Türsymbol Tür hinten links | Tür auf | 00 0F 7F 7F 00 | Tür zu | 00 00 7F 7F 00 | 470 | 5 |
KOM_339_PQ46 | mBSG_Kombi | BSK_HR_geoeffnet | Türsymbol Tür hinten rechts | Tür auf | 00 0F 7F 7F 00 | Tür zu | 00 00 7F 7F 00 | 470 | 5 |
zb | mBremse_2 | BR2_mi_Radgeschw | mittlere Radgeschwindigkeit (erfordert mBremse_1) | 0 | 00 00 00 00 00 00 00 28 | (entspricht 200) | 00 00 6C 00 00 00 00 00 | 5A0 | 8 |
zb | mMotor_2 | Mo2_Kuehlm_T | Kühlmitteltemperatur | 0 | FA 00 0C FF 00 80 00 00 | 130 | FA C5 0C FF 00 80 00 00 | 288 | 8 |
zb | mBremse_1 | erforderlich für BR2_mi_Radgeschw | 10 F0 01 00 00 30 00 E1 | statisch | 1A0 | 8 | |||
zb | mAirbag_1 | Airbag Kontrollleuchte | nicht ausgelöst | E0 F0 00 FF | statisch | 50 | 4 | ||
zb | mBremse_8 | Bremse Kontrollleuchte und Signalton | ohne Störung | 00 80 7F 7F 69 A1 00 C2 | statisch | 1AC | 8 |
CAN-BUS Shield von SparkFun Electronics®
An dieser Stelle wird das verwendete CAN-Shield des Herstellers SparkFun Electronics® vorgestellt. Die Arduino-Community beschreibt Arduino-Shields im Allgemeinen folgendermaßen:
Shields are boards that can be plugged on top of the Arduino PCB extending its capabilities. The different shields follow the same philosophy as the original toolkit: they are easy to mount, and cheap to produce. [3]
Die Shields sind also Platinen, die zur Erweiterung der Funktionen oder Möglichkeiten auf die Oberseite eines Arduino gesteckt werden können. Die unterschiedlichen Shields verfolgen dabei das gleiche Ziel: Einfach in der Anwendung und Verbindung sowie günstig in der Produktion. Es gibt auch viele solcher Shields, die von anderen Herstellen angeboten werden. So ist das CAN-Shield ein Produkt der Firma SparkFun Electronics®. Es wird in Zusammenarbeit mit SK Pang Electronics vertrieben. Dieses ermöglicht es, mit einem Arduino in einem CAN-Bus zu kommunizieren. Somit kann der Mikrokontroller sowohl als Sender als auch als Empfänger verwendet werden. Es kommt ein MCP2551 CAN-Kontroller mit einem MCP2551 CAN-Empfänger zum Einsatz. Es stehen ein neunpoliger SUB-D-Anschluss, ein microSD-Kartenslot und andere Peripherie zur Verfügung. Desweiteren können die Signale HIGH und LOW für den Can-Bus direkt auf der Platine abgegriffen werden. Dazu wurde ein Stück einer Buchsenleiste auf die Platine aufgelötet. Desweiteren müssen zur Verwendung mit einem Arduino einige Stiftleisten angebracht werden. Dies geschieht mittels Löten bei circa 320°C.
Ansteuerung Kombiinstrument mit Arduino
Nachdem das Kombiinstrument mit CANoe angesteuert worden ist und für die zu sendenden Botschaften die Werte, die ID sowie die Länge herausgefunden wurden, können die Anzeigen nun mit dem Arduino Uno angesteuert werden. Dazu wird, wie bereits oben ersichtlich, das CAN-BUS Shield verwendet. Zur Ansteuerung ist das Einbinden der oben genannten Bibliothek (engl. Library) notwendig. Dieses kann auf zwei Arten geschehen. Erstens bietet die Arduino-IDE eine entsprechende Funktion, die über Sketch\Library importieren\Add Library aufgerufen werden kann. Dort wählt man einfach das Download-Verzeichnis als Quelle aus. Alternativ kann der Ordner direkt in den entsprechenden Pfad für die Arduino-Libraries kopiert werden.
Im Folgenden soll erläutert werden, wie eine konkrete Botschaft mit dem Arduino an das Kombiinstrument gesendet werden kann. Als Beispiel wird die Ansteuerung des Drehzahlmessers mit einem Potentiometer gezeigt. Für die Nutzung des CAN-BUS Shields müssen nun die entsprechenden header-Dateien eingebunden werden.
#include <Canbus.h> #include <defaults.h> #include <global.h> #include <mcp2515.h> #include <mcp2515_defs.h>
Desweiteren ist es erforderlich, dass für die zu sendenden Botschaften im Voraus Arrays deklariert werden. Dies kann zum Beispiel so aussehen:
unsigned char txBufferDrehzahl[8];
Außerdem müssen zum Einlesen von Senoren, wie zum Beispiel eines Potentiometers, Variablen für den Port und den einzulesenden Wert angelegt werden. Hier eine Möglichkeit:
// Arduino Pins int PotiPin=0; // Poti connected to analog pin 0 int TastPin=5; // Taster connected to digital pin 5 […] // Variablen int valPoti=0;
In der Funktion void setup() muss für jeden verwendeten digitalen Anschluss der Modus festgelegt werden, das heißt ob er als Eingang oder Ausgang verwendet wird.
void setup(){ […] // Pin Modus: OUT or IN pinMode(ledPin,OUTPUT); pinMode(TastPin,INPUT); }
Für das Senden von CAN-Botschaften ist in der Bibliothek die Funktion mcp2515_send_message(&message) definiert. Die zu sendende Botschaft (message) stellt eine Struktur-Variable dar, die aus der ID, dem Header mit der Länge und dem Array mit den Signalen besteht. Es empfiehlt sich zur einfacheren Programmierung eine Funktion zu schreiben, die als Parameter die ID, die Botschaftlänge und das Array mit den einzelnen Bytes übergeben bekommt. Das RTR-Bit kann als default-Wert eins gesetzt werden. Diese Funktion übernimmt das Erstellen der Struktur-Variable und sendet diese mit der oben genannten Funktion des CAN-BUS Shields. Eine mögliche Lösung sieht so aus:
// Sende Funktion void CanBus_send(int ID, int laenge, unsigned char *Botschaft) { tCAN message; //struct Variable anlegen message.id=ID; //ID message.header.rtr=0; message.header.length=laenge; //Bit-Anzahl //Bits in Nachricht speichern for (int i=0;i<laenge;i++) { message.data[i]=Botschaft[i]; } //Funktion aus Bibliothek zum Senden der struct-Variable mit der Botschaft mcp2515_send_message(&message); }
In der Endlosschleife (void loop()) sind nun folgende Schritte notwendig:
- 1.Einlesen der Sensoren und speichern des Wertes in einer Variablen; ggf. Skalierung des Wertes
Void loop () { // Potis einlesen valPoti=analogRead(PotiPin)/8;
- 2.Erstellen des Daten-Arrays für die Botschaft, dabei muss jedes Byte separat gesetzt werden
// Botschaften erstellen […] // Drehzahl txBufferDrehzahl[0]=0xFA; txBufferDrehzahl[1]=0xC0; txBufferDrehzahl[2]=0x00; //LSB Drehzahl txBufferDrehzahl[3]=valPoti; //MSB Drehzahl txBufferDrehzahl[4]=0x00; txBufferDrehzahl[5]=0x00; txBufferDrehzahl[6]=0x00; txBufferDrehzahl[7]=0x00;
- 3.Senden der Botschaft mit der zuvor erstellten Funktion; ID und Botschaftlänge müssen bekannt sein
CanBus_send(0x280,8, txBufferDrehzahl);
Reflexion – Was haben wir gelernt
Im Rahmen des Elektrotechnik-Fachprakikums besonders in diesem Projekt war uns möglich gelernte Grundlagen ,wie z.B. die Programmierung von Mikrocontrollern, in der Praxis umzusetzen.
Allerdings war es notwendig den Umgang und die Bedienung von eingesetzten Software ,in diesem Fall CANoe, zu lernen. Daher erschienen uns Die Lösungsansätze beim Einstieg etwas unklar mit Hilfe unserer Dozenten und Hochschul-wissenschaftlichen Mitarbeitern ,könnten wir diese Phase schaffen.
Weiterführende Weblinks
- Artikel von Jens Henze CAN-Kommunikation mit Arduino (Abruf: 22.01.2014) Achtung: Zugangsberechtigung erforderlich! [5]
- Bedienungsanleitung zu CANoe (Abruf: 19.11.2013) [6]
- Beschreibung des CAN-BUS Shields (Homepage von SparkFun Electronics®)[7]
- Homepage der Arduino-Community [8]
- Homepage der Hochschule Hamm-Lippstadt [9]