Aus Raspberry Pi Geek 10/2018

Fischertechnik-Roboter via RasPi ansteuern (Seite 2)

Sie importieren die Headerdatei im Quellcode des Programms. Aus der Datei mit dem Quellcode, die die obligatorische Funktion main() enthält, erzeugen Sie mit folgendem Kommando eine Objektdatei:

$ cc -c Bibliothek.c

Diese hat den gleichen Namensstamm wie die Datei mit dem Quellcode, hat aber ein .o als Endung.

Das waren schon alle notwendigen Schritte, um eine eigene Bibliothek zu bauen. Möchten Sie eine Bibliothek für das gesamte System bereitstellen, fallen zusätzliche Arbeiten an.

Im Detail

Es lohnt sich, vorab einen Blick in die Bibliothek für den Roboter zu werfen. Sie finden die kompletten Quellen im Download zu diesem Artikel.

In der Headerdatei libfiropi.h definieren die ersten Zeilen Namen für die einzelnen GPIO-Anschlüsse. Das ermöglicht es, das Verdrahten des Roboters per Software zu ändern.

Der Autor weiß aus eigener Erfahrung mit seinem Roboter-Projekt, wie nützlich das ist. Aus einem unerfindlichen Grund löste dort die Interrupt-Funktion für die GPIO5 immer wieder von selbst aus. Nach vergeblicher Fehlersuche im Code schien das Problem mit der GPIO5 selbst zusammenzuhängen, vermutlich durch einen Schaden in einem früheren Projekt.

Dank der Header-Definitionen war es nun unproblematisch, die GPIO-Nummer über #define zu ändern und einen anderen Anschluss für die Funktion zu verwenden. Dazu genügte es, das Programm an einer Stelle zu ändern. Die Verwendung von Konstanten vereinfacht ein Programm also erheblich. Trotzdem dürfen Sie anschließend freilich nicht vergessen, auch den physischen Anschluss neu zu verdrahten.

Die letzte Zeile des Abschnitts mit den Konstanten definiert die Variable DEBUG, über die Sie die Debug-Ausgaben der Bibliothek ein- und ausschalten.

Der nächste Bereich der Headerdatei enthält alle globalen Variablen, die das Programm zum Arbeiten braucht. Es gibt für jede Achse die Variablen position, direction und target. Dabei zeigt direction an, in welche Richtung sich der Motor aktuell dreht.

Über diese Variable ermittelt das Programm, ob es die eingehenden Signale des Impulsgebers auf die Position addieren oder davon subtrahieren soll. In der Variable position steht die aktuelle Anzahl der Impulse. Dieser Wert entspricht der aktuellen Position der Achse.

Möchten Sie nun die Achse an eine bestimmte Position bewegen, kommt die Variable target ins Spiel. Sie gibt an, an welcher Position der Motor wieder stoppen soll. Achten Sie dabei darauf, dass der Motor sich in die richtige Richtung bewegt, sonst entfernen Sie sich vom Zielwert.

Nach den globalen Variablen folgen die Definitionen der in der Bibliothek enthaltenen Funktionen. Deren Quellcode befindet sich in libfiropi.c.

Da die Funktionen der einzelnen Achsen alle auf dieselbe Weise arbeiten und alle sprechende Namen tragen, beschränkt sich die Erläuterung der Funktionen auf die Achse für die Rotation des Roboters. Die Tabelle “Übersicht der Funktionen” beschreibt alle Funktionen.

Übersicht der Funktionen

Funktion

Beschreibung

motorRotateTurnRight()

Dreht den Motor rechts herum auf den Nullpunkt-Schalter zu.

motorRotateTurnLeft()

Dreht den Motor links herum.

motorRotateStop()

Stoppt den Motor.

interruptRotate()

Löst aus, sobald Sie den Taster für die Nullposition drücken.

interruptPositionRotate()

Löst aus, sobald Sie den Impulsgeber betätigen.

firopiSetup()

Initialisiert die Bibliothek.

initRobot()

Initialisiert den Roboter, fährt alle Nullpunkt-Taster an.

Zum Steuern der Achsen dienen je zwei Interrupt-Funktionen, die Sie sich etwas genauer ansehen sollten. Die Funktion interruptRotate() (Listing 1) kommt zum Zug, wenn der Taster für die Nullposition der Rotationsachse betätigt wird. Sie schaltet als Erstes den Motor ab, damit er sich nicht über die Nullposition hinaus bewegt. Danach setzt sie die Position der Achse auf null. Allgemein empfiehlt es sich, Funktionen, die Sie durch einen Hardware-Interrupt auslösen möchten, immer sehr klein zu halten.

Listing 1

 

void interruptRotate(void){
  motorRotateStop();
  positionRotate=0;
  if (DEBUG) {printf("Interrupt Rotate Zero Position\n");}
  }
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben