Benutzer-Werkzeuge

Webseiten-Werkzeuge


techniken:objektorient

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
techniken:objektorient [2014/04/11 20:51]
fbonowski [Um das Programm übersichtlich zu halten, können Klassen in eigene Dateien ausgelagert werden]
techniken:objektorient [2016/01/21 12:45] (aktuell)
Zeile 1: Zeile 1:
-===== Übersichtlichkeit und wiederverwendbare Module durch objektorientiertes ​Programmieren ===== +====== Einführung ins objektorientierte ​Programmieren ​mit Arduino======  
-==== Motivation ====+===== Motivation ​=====
 Schon bald nach Beginn der Programmierarbeiten an eurem Roboter werden euch einige typische Probleme begegnen: Schon bald nach Beginn der Programmierarbeiten an eurem Roboter werden euch einige typische Probleme begegnen:
   * **Übersichtlichkeit**:​ Das Programm wird immer größer und es wird schwer, den Überblick zu behalten. ​   * **Übersichtlichkeit**:​ Das Programm wird immer größer und es wird schwer, den Überblick zu behalten. ​
Zeile 10: Zeile 10:
 Fast immer hilft es jedoch, **das Programm in sinnvolle Untereinheiten aufzuteilen,​ die relativ unabhängig voneinander sind**. Fast immer hilft es jedoch, **das Programm in sinnvolle Untereinheiten aufzuteilen,​ die relativ unabhängig voneinander sind**.
  
-Darum geht es hier.+===== Praktisches Beispiel: Motorsteuerung =====
  
 Mit dem Konzept der [[http://​arduino.cc/​de/​Reference/​FunctionDeclaration|Funktion]] habt ihr bereits ein enorm nützliches Werkzeug zur Strukturierung eures Codes kennengelernt. Mit ihnen lässt sich eine Tätigkeit bzw. Operation, die aus mehreren anderen Operationen besteht unter einem neuen Namen zusammenfassen,​ so dass sie immer wieder durchgeführt werden kann, ohne dass der Code dafür kopiert werden oder auch nur bekannt sein muss. Mit dem Konzept der [[http://​arduino.cc/​de/​Reference/​FunctionDeclaration|Funktion]] habt ihr bereits ein enorm nützliches Werkzeug zur Strukturierung eures Codes kennengelernt. Mit ihnen lässt sich eine Tätigkeit bzw. Operation, die aus mehreren anderen Operationen besteht unter einem neuen Namen zusammenfassen,​ so dass sie immer wieder durchgeführt werden kann, ohne dass der Code dafür kopiert werden oder auch nur bekannt sein muss.
Zeile 37: Zeile 37:
 </​code>​ </​code>​
  
-Das spart schon eine Menge Tipperei, aber eines stört immernoch: ​+Das spart schon eine Menge Tipperei.
  
-**Jedes Mal, wenn wir die Geschwindigkeit ändern wollen, müssen wir die //​Pinnummern//​ wissen!**+**Aber eines stört immernoch: ​Jedes Mal, wenn wir die Geschwindigkeit ändern wollen, müssen wir die //​Pinnummern//​ wissen!**
  
 Das ist besonders lästig, wenn die Funktionsaufrufe quer über das Programm verteilt sind, oder wir Programmmodule erstellen wollen, die auf beliebige Motoren zugreifen können sollen, ohne vorher zu wissen, welche dies sein werden. So könne es z.B. eine H-Brücke geben, die statt 3 nur 2 Pins als Eingänge (Richtung, PWM) hat. Wegen einer kleinen Hardwareänderung wie dieser an vielen Stellen Code ändern zu müssen, der sich mit ganz anderen Dingen (z.B. der Navigation in einem Labyrinth) beschäftigt,​ führt zu viel verschwendeter Zeit... Das ist besonders lästig, wenn die Funktionsaufrufe quer über das Programm verteilt sind, oder wir Programmmodule erstellen wollen, die auf beliebige Motoren zugreifen können sollen, ohne vorher zu wissen, welche dies sein werden. So könne es z.B. eine H-Brücke geben, die statt 3 nur 2 Pins als Eingänge (Richtung, PWM) hat. Wegen einer kleinen Hardwareänderung wie dieser an vielen Stellen Code ändern zu müssen, der sich mit ganz anderen Dingen (z.B. der Navigation in einem Labyrinth) beschäftigt,​ führt zu viel verschwendeter Zeit...
Zeile 49: Zeile 49:
 Die Sprache C++ und damit auch Arduino stellt dafür ein geeignetes Werzeug bereit: //Klassen// und //​Objekte//​. Die Sprache C++ und damit auch Arduino stellt dafür ein geeignetes Werzeug bereit: //Klassen// und //​Objekte//​.
  
-Eine Klasse legt die gemeinsamen Eigenschaften einer Gruppe von Objekten fest. In unserem Fall also ist darin z.B. festgelegt, dass alle Motoren die Möglichkeit haben, unterscheidlich viel Gas zu geben.+Eine Klasse legt die gemeinsamen Eigenschaften einer Gruppe von Objekten fest. In unserem Fall also ist darin z.B. festgelegt, dass alle Motoren die Möglichkeit haben, unterscheidlich viel Gas ('​throttle'​)zu geben.
 Im Programm sieht das dann z.B. so aus: Im Programm sieht das dann z.B. so aus:
  
Zeile 98: Zeile 98:
 Und wie kommen jetzt die Pinnummern in das Objekt hinein, wenn sie nicht von außen sichtbar sind? Und wie kommen jetzt die Pinnummern in das Objekt hinein, wenn sie nicht von außen sichtbar sind?
  
-Ganz einfach: Wir schreiben auch dafür eine ''​setup''​ Funktion in die Klasse((Eine ​svchöne ​Alternative wäre es, das im Konstruktor zu erledigen.  +Ganz einfach: Wir schreiben auch dafür eine ''​setup''​ Funktion in die Klasse((Eine ​schönere ​Alternative wäre es, das im Konstruktor zu erledigen.  
-Leider initialisiert Arduino die Hardware erst //nachdem// die Konstruktoren global deklarierter Klassen aufgerufen wurden, so dass Konstruktoren,​ die auf Hardware zugreifen, dort Probleme verursachen - [[http://​forum.arduino.cc/​index.php/​topic,​111463.0.html| hier ein Vorumseintrag, der sich mit diesem Problem beschäftigt.]])) :+Leider initialisiert Arduino die Hardware erst //nachdem// die Konstruktoren global deklarierter Klassen aufgerufen wurden, so dass Konstruktoren,​ die auf Hardware zugreifen, dort Probleme verursachen - [[http://​forum.arduino.cc/​index.php/​topic,​111463.0.html| hier ein Forumseintrag, der sich mit diesem Problem beschäftigt.]])) :
  
 <code c++> <code c++>
Zeile 196: Zeile 196:
  
 {{ :​techniken:​arduinonewtab.png?​nolink&​ | }} {{ :​techniken:​arduinonewtab.png?​nolink&​ | }}
 +
 Am unteren Rand des Fensters könnt Ihr dann einen Dateinamen eingeben. Dieser **muss** aus ''​.h''​ enden, damit es klappt ((Arduino ist bei der Unterstützung von allem, was etwas fortgeschrittener ist, ziemlich zurückhaltend...). In unserem Fall habe ich die Datei ''​MotorControl.h''​ genannt. Am unteren Rand des Fensters könnt Ihr dann einen Dateinamen eingeben. Dieser **muss** aus ''​.h''​ enden, damit es klappt ((Arduino ist bei der Unterstützung von allem, was etwas fortgeschrittener ist, ziemlich zurückhaltend...). In unserem Fall habe ich die Datei ''​MotorControl.h''​ genannt.
  
 In die neu erstellte Datei kommt als erstes die Zeile  In die neu erstellte Datei kommt als erstes die Zeile 
-<code c++>#​include "​Arduino.h"​ /sorgt dafür, dass in dieser Datei Arduino-spezifische Funktionen verwendet werden können</​code>​ +<code c++>#​include "​Arduino.h" ​</code> 
-Danach könnt ihr den Code für eure Klasse einfügen. +Sie sorgt dafür, dass in dieser Datei Arduino-spezifische Funktionen verwendet werden könnenDanach könnt ihr den Code für eure Klasse einfügen.
-==== Klassen können andere Objekte als Membervariablen enthalten ==== +
  
 +Damit euer Programm den Code aus der neu angelegten Datei verwenden kann, muss dort widerum eine Zeile mit dem Inhalt
 +<code c++>#​include "​MotorControl.h"​ </​code>​
 +an den Anfang.
 +===== Teil 2: Mehr Details zum Konzept =====
 ==== Klassen können aufeinander aufbauen (Vererbung) ==== ==== Klassen können aufeinander aufbauen (Vererbung) ====
 +Zu Beginn des Artikels hatten wir versprochen,​ dass es Möglich sein sollte, verschiedene Motortreibervarianten gegeneinander auszutauschen,​ ohne am Rest des Programmes etwas zu ändern.
 +
 +
 +==== Klassen können andere Objekte als Membervariablen enthalten ====
 +==== In C++ können Klassendeklarationen und der Code für die darin angekündigten Funktionen in unterschiedlichen Dateien liegen ====
 +Wer mehr wissen möchte, ließt am besten den [[http://​arduino.cc/​en/​Hacking/​LibraryTutorial|Artikel]] über das Erstellen von Libraries in Arduino.
  
 ---- ----
  
 ---- ----
- 
-===== Klassen und Objekte ===== 
-Auch bei Arduino kann man objektorientiert programmieren. [[http://​arduino.cc/​en/​Hacking/​LibraryTutorial|Hier]] ist ein guter Link, der alles sehr schön beschreibt. Auch bei diesem [[http://​forum.arduino.cc/​index.php?​topic=40922.0|Link]] könnt ihr nachsehen. Dort ist ein Beispiel für eine Klasse. 
-Hinter diesem [[http://​playground.arduino.cc/​code/​library|Link]] könnt ihr auch noch einmal eine ausführlichere Beschreibung finden. 
- 
-Wichtig dabei ist, dass es eine Header Datei gibt, die wie eure Klasse heißt und "​.h"​ als Ende hat. 
-Dann könnt ihr (auch in der gleichen Datei) eure Funktionen deklarieren mit: 
-<code c++> 
-void/​int/​... Klassenname::​Funktionsname(Parameterliste) 
-{ 
-    was die Funktion tun soll 
-} 
-</​code>​ 
- 
-Auch muss eure Datei einen sogenannten Konstruktor haben: 
-<code c++> 
-Klassenname::​Klassenname(Parameterliste zur Instanziierung) 
-{ 
-    Werte setzen, die zum Erstellen von späteren Objekten wichtig sind 
-} 
-</​code>​ 
- 
-Wenn ihr dann ein Objekt von dieser Klasse erstellen wollt, könnt ihr diese mit: 
-<code c++> 
-#include <​Klassenname.h>​ 
-</​code>​ 
- 
-am Anfang eures Programmes und dann: 
-<code c++> 
-Klassenname Objektname (Parameter);​ 
-</​code>​ 
- 
-erstellen. Mit 
-<code c++> 
-Objektname.funktionsaufruf 
-Objektname.variable 
-</​code>​ 
-könnt ihr dann auf Funktionen im Objekt oder auf Variablen zugreifen. 
  
  
-Wer mehr wissen möchte, ließt am besten den [[http://​arduino.cc/​en/​Hacking/​LibraryTutorial|Artikel]]. 
techniken/objektorient.1397242289.txt.gz · Zuletzt geändert: 2016/01/21 12:45 (Externe Bearbeitung)