Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Bibliothek erstellen - Teil 1

Um Sensoren, Displays, Shields, Motoren etc. über die Arduino IDE ansprechen zu können, benötigt man i.d.R. Bibliotheken. Mit ihrer Hilfe vereinfacht sich das Programmieren der Objekte und erspart einem das Zugriffs-/Ansprech-Problem mühsam selbst enträtseln zu müssen. In diesem Kapitel wird beschrieben und an einem Beispiel des MultiFunction Shields gezeigt, wie man sich selbst eine Bibliothek erstellen kann.

 

Ausgangspunkt ist ein lauffähiges einfaches Arduino-Programm, das dann Schritt-für-Schritt in eine Bibliothek umgewandelt wird.

Allgemeine Informationen zu Bibliotheken

 

Arduino Bibliotheken, die nicht zur „Grundausstattung“ gehören, sind im Ordner „Arduino/libraries“ als Unterordner abgelegt. Die Unterordner tragen den Namen der jeweiligen Bibliothek.

 

In den Bibliotheksordnern befinden sich

  • Headerdateien (*.h), enthalten den Definitionsteil (z.B. Klassendeklaration) der Bibliothek
  • Quelldateien (*.cpp), enthalten den Programmcode der Bibliothek
  • Readme-Dateien (*.txt), mit Zusatzinformationen zu Bibliotheksdateien und
  • Beispieldateien (*.ino), die Anwendungsprogramme zu den Bibliotheksbefehlen enthalten.

Weitere Bemerkungen:

  • Bei Bibliotheken mit nur einer Klasse haben die Bibliothek, die Klasse und die Header- sowie Quelldatei oftmals denselben Namen.
  • Für die Erstellung und Bearbeitung von Bibliotheken ist die Arduino IDE als Editor nicht gut geeignet. Ich benutze hier das kostenlos erhältliche Notepad++.

Die benutzte Hardware (s. Abb. 1) für das Einstiegsbeispiel besteht aus:

  • Arduino UNO R3
  • Arduino MultiFunction-Shield

 

 

 

 

 

Abb. 1

Arduino UNO R3 mit einem Multifunction Shield (MFS). Die vier LEDs (rot) sind markiert.

Der Shield verfügt über:

4x LED, 3x Taster, 1x Reset, 1x Potenziometer, 1x Buzzer, 4 Ziffern 7-Segment-Anzeige, 1x Anschlusssockel für LM35, 1x Anschlusssockel für Dallas DS18B20, integrierter IR-Empfänger..

Die Vorgehensweise

 

  1. Zunächst wird ein Programm (sketch) LED_1.ino geschrieben, dass vier verschiedene Lichtmuster auf den LEDs des MultiFunction Shields erzeugt. Jedes Muster wird über eine Methode/Funktion aufgerufen (s. Abb. 2a und 2b). Die einzelnen Programmschritte werden hier nicht mehr erklärt.
    Die Methode Reihe() erzeugt ein Lichtmuster auf den vier LEDs.
    Die Methoden Muster1() bis Muster4() definieren jeweils eine Ablauffolge für verschiedene LED-Muster.
    Die Methode setup() definiert die Pin-Modi.
    Die Methode loop() lässt die vier Lichtmuster in einer Endlosschleife ablaufen.

     
  2. Anschließend wird dieser Sketch in kleinschrittigen Stufen in eine Bibliothek LED_1  mit den Dateien LED_1.ino, LED_1.h und LED_1.cpp im Sketchordner LED_1 umgewandelt.
  3. Dieses Verfahren lässt sich später deutlich verkürzen; hier dient es ausschließlich dazu ein besseres Verständnis für die Ablauffolge zu erhalten.

Übung 1 - Eine Bibliothek erstellen

Schritt 1 - Hauptprogramm erstellen
Material
  • 1x Arduino UNO
  • 1x MultiFunction Shield
  • Notepad++ Editor
Aufgaben
  • Übertrage das Programm LED_1.ino in den Editor der Arduino IDE und speichere es und speichere es im Ordner LED_1 ab.
  • Starte das Programm und überprüfe es auf Lauffähigkeit; ggf. finde die Übertragungsfehler. Vergleiche die LED-Muster mit den Mustern, die im Videofilm dargestellt sind; es sollte Übereinstimmung festgestellt werden.
  • Beschreibe mit eigenen Worten, was in jeder Programmzeile passiert.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 2a - Programmkopf des Programms led_1.ino

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 2b - Funktionen Reihe() sowie Muster1() bis Muster4()

 

Methoden/Funktionen auslagern

 

Im ersten Umwandlungsschritt werden mit Hilfe des Editors Notepad ++ im Ordner LED_1 des Programms LED_1.ino die Dateien LED_1.h (Headerdatei) und LED_1.cpp (Programmdatei) angelegt und alle Funktionen/Methoden aus dem Hauptprogramm LED_1.ino in die Header-Datei übertragen, mit Ausnahme der Methoden setup() und loop().

Schritt 2 - Funktionen in die Header-Datei übertragen
Aufgaben
  • Starte Notepad++ oder einen beliebigen anderen Editor und lege die Dateien LED_1.h und LED_1.cpp an. Speicher die Dateien im Programmordner von LED_1 ab.
  • Verschiebe die Programmzeilen 38 - 75 (s. Abb. 2b) aus dem Programm LED_1.ino  in die Header-Datei LED_1.h und speicher den Inhalt ab.
  • Füge in das Hauptprogramm (LED_1.ino) die Programmzeile
    #include "LED_1.h" ein (s. Abb. 3a), Programmzeile 13) und in die Header-Datei (LED_1.h) die Zeile #include <Arduino.h> (s. Abb. 3b).
  • Überprüfe das Programm auf Fehlerfreiheit mit einem Testlauf des Compilers.

Hauptdatei LED_1.ino:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 3a - Ansicht des Programms LED_1.ino. Neu hinzugefügt wurde die Programmzeile 13.

Header-Datei LED_1.h:

Abb. 3b - LED_1h. Neu hinzugefügt wurde die Programmzeile 4.

Wenn alles richtig gemacht wurde, sollte jetzt ein Test-Compilerlauf  (Überprüfen) fehlerfrei ausgehen und wir können uns dem nächsten Schritt 3 zuwenden..

Die Sprache C++ ist Objekt orientiert; die Objekte werden nach einem Bauplan, den wir Klasse nennen (engl. Class), erstellt. Das in dieser Übung betrachtete Objekt sind die vier LEDs auf dem MultiFunctionShield mit ihren Eigenschaften und Methoden oder Funktionen; den Bauplan dazu bezeichnen wir als class LED_1. Anders ausgedrückt, eine Klasse kapselt alle zusammengehörigen Daten und Methoden vom Rest des Programms ab . Dies erfolgt jetzt in mehreren Schritten.

Eine Klasse einrichten

Schritt 3 - class LED_1 einrichten
Aufgaben
  • Führe die in Abb. 4a und 4b dargestellten Zusatzinformationen in die Header-Datei LED_1.h ein.
  • Im Hauptprogramm wird ein LED_1 Objekt mit dem Namen led_1 erzeugt. Die Methoden dieses Objekts lassen sich dann dadurch aufrufen, dass ihnen der Objektname, gefolgt von einem Punkt, vorangestellt wird (s. Abb. 5a und 5b).
  • Nachdem alle Änderungen vorgenommen wurden, überprüfe das Programm auf Fehlerfreiheit mit einem Testlauf des Compilers.

Datei LED_1.h

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 4a - Änderungen in der HEADER-Datei: Die ersten zwei Compiler-Direktiven verhindern ein mehrfaches Aufrufen der Header-Datei, die dritte Direktive lädt die Header-Datei Arduino.h.

Bei der Deklaration einer Klasse werden ihre members (Daten, Funktionen/Methoden)  festgelegt; sie erfolgt immer in einer Header-Datei -> LED_1.h.

Der neue Name der Klasse wird in Programmzeile 5 vergeben: class LED_1 {...};

Das Schlüsselwort public weist darauf hin, dass alle Methoden der Klasse außerhalb der Klasse aufrufbar sind.

 

 

 

 

 

 

 

 

 

Abb. 4b - Änderungen in der HEADER-Datei: Häufig vergessen wird, dass der class-Block in der Header-Datei mit einem Semikolon und die if-Anweisung mit der Direktive #endif abgeschlossen werden muss.

Datei LED_1.ino

 

 

 

 

 

 

 

 

 

Abb. 5a - Änderungen im Hauptprogramm LED_1.ino: Im Hauptprogramm wird nach der #include-Direktive in Programmzeile 14 ein Objekt led_1 instantiiert.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 5b - Änderungen im Hauptprogramm LED_1.ino: Der Aufruf der Methoden aus der Header-Datei erfolgt jetzt durch das Voranstellen des Klassennamens (hier: led_1) gefolgt von einem Punkt.

Nach erfolgreichem Testlauf des Compilers kommt Schritt 4, die Implementierung der Memberfunktionen..

Implementierung der Memberfunktionen in der Datei LED_1.cpp

Schritt 4 - Implementierung der Member-Funktionen
Aufgaben
  • Führe die in Abb. 4a und 4b dargestellten Zusatzinformationen in die Header-Datei LED_1.h ein.
  • Im Hauptprogramm wird ein LED_1 Objekt mit dem Namen led_1 erzeugt. Die Methoden dieses Objekts lassen sich dann dadurch aufrufen, dass ihnen der Objektname, gefolgt von einem Punkt, vorangestellt wird (s. Abb. 5a und 5b).
  • Nachdem alle Änderungen vorgenommen wurden, überprüfe das Programm auf Fehlerfreiheit mit einem Testlauf des Compilers.
Druckversion | Sitemap
© Reinhard Rahner - Gettorf