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

Propeller 8 Kern Controller - C Programmierung

1 - MMA7455 Testprogramm (Raumachsen x, y, z)

Für diesen Abschnitt sind Mathematikkenntnisse mindestens aus der oberen Mittelstufe notwendig (trigonometrische Funktionen, arcus-Funktionen, Hauptwert, Pythagoras).

 

Für die folgenden Programme ist die Bibliotheksfunktion mma7455.h notwendig.

Mit dem ersten Programm werden die Achsbeschleunigungswerte in Richtung der drei Raumachsen x, y und z im Terminal von SimpleIDE ausgegeben. Dabei bedeuten:

  • x - in Richtung auf den Beobachter zu/ in Richtung vom Beobachter weg
  • y - links/ rechts
  • z - hoch/ runter
Abbildung 1 - Modul MMA7455 (Courtesy of Parallax Inc.)

Abb. 2 zeigt drei mögliche unkalibrierte Messwerte eines flach auf einem Tisch liegenden g-Sensors, auf den nur die Gravitationskraft in z-Richtung wirkt. Die hier angezeigten Werte müssen nicht mit den eigenen Messwerten übereinstimmen, da sie - wie gesagt - noch nicht kalibriert wurden.

Im Idealfall sollte die Anzeige die Werte x = 0, y = 0, z = 64 präsentieren. Der Wert 64 ist vom Hersteller vorgegeben und entspricht 1g (g: Schwere- oder Fallbeschleunigung, die ortsabhängig ist und in nördlichen Breiten bei ca. 9,81 m/s² liegt). Wird das Board auf den Kopf gestellt (der Sensor befindet sich unterhalb des Boards), dann sollte im Terminal von SimpleIDE ein negativer Wert angezeigt werden.

Abbildung 2 - Messwerte für einen flach auf den Tisch gestellten g-Sensor
Testprogramm Kalibrieren
Aufgaben
  • Starte das Programm SimpleIDE und erstelle ein neues Projekt MMA7455_Test über Project - New und speichere es mit Save in deinem Arbeitsverzeichnis ab.
  • Kopiere den Ordner libmma7455 in das Arbeitsverzeichnis.
  • Übertrage das Programm Test_MMA7455.c in den SimpleIDE Editor und speichere es ab.
  • Starte das Programm mit einem Klick auf Run with Terminal.
  • Stelle das Board flach auf den Tisch. Der z-Achsenwert gibt die Schwerebeschleunigung durch einem Zahlenwert an. Dieser Zahlenwert entspricht bei diesem Versuchsaufbau 1g.
  • Stelle das Board auf den Kopf (der Sensor ist unter dem Board) und lies den Zahlenwert im Terminalfenster ab. Er sollte negativ sein und entspricht -1g.
  • Stelle das Board auf die Seitenkanten (möglichst lotrecht zur Tischoberfläche) und beobachte die ausgegebenen Werte im Terminal. Jetzt entsprechen, je nach Stellung des Boards, die angezeigten Werte +/- 1g in Richtung der x- oder y-Achse.
  • Setze das Board flach auf den Tisch und hebe es mit einem Ruck hoch. Beobachte dabei die angezeigten Werte im Terminal.

Das Programm Test_MMA7455.c

Wie arbeitet das Programm Test_MMA7455.c?

In Zeile 2 wird eine neue Bibliotheksdatei mma7455.h in das Programm eingebunden.

  • Zeile 3

Deklaration der drei Variablen x, y und z vom Typ short (16-Bit). Sie werden beim Funktionsaufruf von MMA7455_getxyz10 in Zeile 13 benötigt.

  • Zeile 8

An jeden der drei Parameter der Funktion MMA7455_init wird ein Zahlenwert übergeben. Damit werden die Propeller I/O Pin festgelegt, die mit den Pin DATA, CLK und /CS des Sensors verbunden sind (DATA -> P7, CLK -> P8, /CS -> P6).

  • Zeile 13

An die Funktion werden mit diesem Aufruf die Adressen der drei Achsvariablen übergeben; die Funktion weist die Messwerte dann den drei genannten Variablen zu.

  • Zeile 14

Der Cursor wird im Terminal zunächst in die Homeposition gebracht; anschließend werden die Dezimalwerte der drei Variablen x, y und z im Terminal ausgegeben und alle Zeichen rechts von der Ausgabe gelöscht (CLREOL).

  • Zeile 17

Nach einer Pause von 200ms beginnt das Programm wieder mit Zeile 13.

2 - Kalibrierung des MMA7455

Die drei Achsen des Sensors werden in diesem Abschnitt kalibriert. Liegt das Board flach auf einem Tisch, dann sollten die x- und y-Werte 0 anzeigen, steht es auf einer Kante lotrecht zum Tisch, dann sollte die z-Komponente 0 anzeigen. Für den Kalibrierungsvorgang gibt es in der Sensorbibliothek drei spezielle Funktionen: MMA7455_setOffsetX, MMA7455_setOffsetY  und MMA7455_setOffsetZ.

Kalibrierung des MMA7455
Aufgaben
  • Öffne das Programm Test_MMA7455.c und speichere es über Project - Save Project As ... unter dem Namen MMA7455_TestKalib ab.
  • Füge die drei mit NEU bezeichneten Programmzeilen in das Programm ein.
  • Starte das Programm und notiere die im Terminal angegebenen Werte. Als Beispiel seien hier die Werte aus Abb. 2 genommen.
  • Multipliziere die x- und y-Werte mit -2 und setze sie anschließend in die Funktion MMA7455_setOffsetX bzw. MMA7455_setOffsetY ein. Bei den von mir gemessenen Werte (Abb. 2) würde man 10 und 36 einsetzen.
  • Starte das Programm mit diesen Werten erneut und erhöhe oder erniedrige die Parameterwerte so lange, bis sich ungefähr ein Wert um 0 für beide Achsrichtungen einstellt.
  • Stelle das Board auf eine Seitenkante und wiederhole den Vorgang für die z-Achse.

Das Programm MMA7455_TestKalib.c

Wird der kalibrierte Sensor flach auf einen horizontalen Tisch gestellt, dann sollten die x- und y-Achswerte einen Wert um 0 und der z-Achswert bei ca. 65 (entspricht 1g) liegen.

Abbildung 3 - Terminalausgabe für einen kalibrierten g-Sensor.

3 - Projekt: Höhenbestimmung eines Gebäudes

Mit Hilfe des g-Sensors lassen sich Höhen von Gegenständen und Gebäuden leicht durchführen. Dazu genügt die Aufnahme von zwei Messwerten: Abstand zum Gebäude/Gegenstand und Erhebungswinkel über Grund (Abb. 4).

Abbildung 4 - Höhenbestimmung eines Gebäudes mit MMA7455 (Courtesy of Parallax Inc.)

In einem rechtwinkligen Dreieck kann die Gegenkathete zum Winkel Theta über die trigonometrische Funktion tan bestimmt werden, wenn der Winkel Theta und die Ankathete bekannt sind.

Die Ankathete entspricht dem Abstand des Beobachters vom Gebäude, die sich mit einem Metermaßstab, einem Lasermessgerät o. ä. bestimmen lässt.

Hat man die Gegenkathete bestimmt, dann ergibt sich die Gebäudehöhe aus (2) plus Sehhöhe des Beobachters oder in einer Formel ausgedrückt:

Beispiel

Nehmen wir an, dass der Abstand zu einem Objekt (Ankathete) 10m betrage und die Sehhöhe des Beobachters bei 1,5m liegt. Der Winkel, der mit dem g-Modul bestimmt wurde, liege bei 61°.  Mit diesen Werten lässt sich die Höhe eines Objektes berechnen.

 

Abstand Beobachter - Objekt    : 10m

Winkelmessung g-Modul          : 61°

Sehhöhe des Beobachters        : 1,5m

Aus (2) ergibt sich für die Gegenkathete ein Wert von 18,04 und aus (3) für die Objekthöhe ein Wert von 19,54m.

4 - Winkelmessung mit g-Sensor

Das Board muss senkrecht zum Boden gehalten werden und über die x- und y-Achse des Sensors wird der Winkel Theta bestimmt. Dazu muss das Programm so angepasst werden, dass es den Neigungswinkel Theta berechnet und den z-Wert im Terminal mit angibt. Über den z-Wert überprüft man die präzise senkrechte Ausrichtung des Sensors. Das ist genau dann der Fall, wenn z den Wert 0 annimmt.

Winkelmessung mit g-Sensor
Aufgaben
  • Öffne das Programm MMA7455_TestKalib und speichere es über Project - Save Project As ... unter dem Namen MMA7455_Winkelmessung ab.
  • Überzeuge dich über einen Testlauf noch einmal davon, dass alle drei Achsen kalibriert sind. Lege dazu den Sensor flach auf einen Tisch. Es sollten die Werte x = +/- 0,  y = +/- 0, z = 65 angezeigt werden.
  • Verändere bzw. ergänze die entsprechenden Programmzeilen.
  • Starte das Programm erneut.
  • Halte das Board an seinen Kanten und neige es nach rechts und links. Der Messwert von Winkel_Z sollten sich verändern.
  • Peile über die Oberkante des Boards die höchste Stelle eines Gebäudes an und versuche den Wert von Winkel_Z dabei möglichst bei 0 zu halten; notiere anschließend den Wert von WinkelTheta.

Das Programm MMA7455_Winkelmessung.c

Ist der Wert von zf größer als 64,0, dann gibt die Funktion asin(zf/64) (Zeile 27) den Wert nan (not a number) zurück. Über die WENN ... DANN Schleife (Zeilen 28 - 31) wird das überprüft und eine entsprechende Nachricht im Terminal ausgegeben.

Die Funktion atan2 (Zeile 25) verlangt zwei Eingabegrößen; sie gibt den Hauptwert der Funktion arctan von x im Bogenmaß zurück. Der Wert kann mit Bogen * 180 / PI  in ein Winkelmaß umgerechnet werden.

asin gibt den Hauptwert der Funktion arcsin von x im Bogenmaß zurück.

Eine mögliche Messung könnte im Terminal von SimpleIDE wie folgt aussehen:

Druckversion | Sitemap
© Reinhard Rahner - Gettorf