• IT-Karriere:
  • Services:

Etwas Trigonometrie

Es ist der Winkel, den jede durch die Koordinaten gezogene Linie zur positiven Y-Achse des Koordinatenkreuzes hat. Ich kann ihn ermitteln, wenn ich eine Formel aus einem Teilgebiet der Geometrie, der Trigonometrie, anwende. Für rechtwinklige Dreiecke - denn die Werte X und Y vom Beschleunigungssensor können als Ankathete und Gegenkathete eines rechtwinkligen Dreiecks betrachtet werden - gilt, dass Gegenkathete (Y) geteilt durch Ankathete (X) der Tangens des gesuchten Winkels ist. Die meisten Taschenrechner, aber auch die meisten Bibliotheken für Computersprachen besitzen eine Funktion, die diesen Wert in einen Winkel umrechnen kann. Beim Arduino heißt sie atan2. Ihre Argumente sind Gegenkathete und Ankathete. Ich kann ihr direkt die Werte X und Y übergeben und bekomme dafür den Winkel in Radiant. Um diesen in Grad umzurechnen, multipliziere ich ihn mit 180 und teile das Ergebnis durch Pi.

Stellenmarkt
  1. DLR Deutsches Zentrum für Luft- und Raumfahrt e.V., Oberpfaffenhofen bei München
  2. MULTIVAC Sepp Haggenmüller SE & Co. KG, Wolfertschwenden

Achtung: Die Funktion bekommt nicht den Quotienten als Argument geliefert, sondern die beiden Werte, die den Quotienten bilden. Nur dadurch kann die Funktion den korrekten Quadranten ermitteln und ihr Ergebnis mit dem korrekten Vorzeichen zurückliefern. Da es auch möglich ist, X und Y zu vertauschen, bedeutet dies, dass der im Dreieck gegenüberliegende Winkel berechnet wird und der Winkelanstieg im Uhrzeigersinn verläuft.

  • Adafruit Playground Circuit (Bild: Thomas Ell)
  • Adafruit Playground Circuit  (Bild: Thomas Ell)
  • Bewegungssensor mit Koordinatenbeschriftung (Bild: Thomas Ell)
  • Skript in der Arduino IDE (Bild: Thomas Ell)
  • Ausgabe des seriellen Monitors (Bild: Thomas Ell)
  • Gehäuse für den Playground Circuit (Bild: Thomas Ell)
  • Gehäuse für den Playground Circuit (Bild: Thomas Ell)
  • (Bild: Thomas Ell)
  • (Bild: Thomas Ell)
  • (Bild: Thomas Ell)
(Bild: Thomas Ell)

Leider passt der Wert nur für die obere Seite des Koordinatenkreuzes: Mit der positiven Y-Achse als Bezugspunkt wird ein Winkel von 0 bis 180 Grad berechnet, für die untere Seite geht es dann gegen den Uhrzeigersinn von -180 bis 0 Grad weiter. Möchte ich für die untere Seite einen Wertebereich von 180 - 360 Grad, so addiere ich zum von atan2 zurückgegebenen Wert 360 Grad. Mit diesen Werten ist es jetzt endlich möglich, die einzuschaltende LED zu ermitteln. Ich habe das dann mit einem if und 9 else if realisiert. Wir haben zehn LEDs, die in etwa gleichmäßig im Kreis verteilt sind. 360 dividiert durch 10 ergibt einen Bereich von 36 Grad pro LED. Das stimmt zwar nicht ganz, da sich im Bereich der USB-Buchse und des Anschlusses für die Batterie keine LEDs befinden und diese dafür im restlichen Bereich etwas enger sitzen. Aber das tut der Funktion keinen Abbruch.

  • Adafruit Playground Circuit (Bild: Thomas Ell)
  • Adafruit Playground Circuit  (Bild: Thomas Ell)
  • Bewegungssensor mit Koordinatenbeschriftung (Bild: Thomas Ell)
  • Skript in der Arduino IDE (Bild: Thomas Ell)
  • Ausgabe des seriellen Monitors (Bild: Thomas Ell)
  • Gehäuse für den Playground Circuit (Bild: Thomas Ell)
  • Gehäuse für den Playground Circuit (Bild: Thomas Ell)
  • (Bild: Thomas Ell)
  • (Bild: Thomas Ell)
  • (Bild: Thomas Ell)
(Bild: Thomas Ell)

Mit folgendem kleinen Programm ist es möglich das bisher Beschriebene zu prüfen:

  1. #include <Adafruit_CircuitPlayground.h>
  2. #include <math.h>
  3. int pos;
  4. void setup() {
  5. CircuitPlayground.begin();
  6. }
  7. void loop() {
  8. float x = CircuitPlayground.motionX();
  9. float y = CircuitPlayground.motionY();
  10. float angle = (atan2(y, x) * 180) / PI;
  11. CircuitPlayground.clearPixels();
  12. if (angle >= 0 && angle < 36) {
  13. pos = 0;
  14. } else if (angle >= 36 && angle < 72) {
  15. pos = 1;
  16. } else if (angle >= 72 && angle < 108) {
  17. pos = 2;
  18. } else if (angle >= 108 && angle < 144) {
  19. pos = 3;
  20. } else if (angle >= 144 && angle < 180) {
  21. pos = 4;
  22. } else if (angle >= -180 && angle < -144) {
  23. pos = 5;
  24. } else if (angle >= -144 && angle < -108) {
  25. pos = 6;
  26. } else if (angle >= -108 && angle < -72) {
  27. pos = 7;
  28. } else if (angle >= -72 && angle < -36) {
  29. pos = 8;
  30. } else if (angle >= -36 && angle < 0) {
  31. pos = 9;
  32. }
  33. CircuitPlayground.strip.setPixelColor(pos, 255, 255, 255);
  34. CircuitPlayground.strip.show();
  35. delay (100);
  36. }

Die Variable pos bekommt hier die Indexnummer der höchsten LED zugewiesen. Wenn alles funktioniert, sollte jetzt immer die LED leuchten, die sich im Vergleich zu den anderen am höchsten befindet. Da die Indexnummern der einzelnen LEDs vom Hersteller so vergeben wurden, dass die im Uhrzeigersinn jeweils nächste LED einen um 1 höheren Wert hat, kann ich sie prima für Vergleiche verwenden.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Wie der Beschleunigungssensor funktioniertDie Regeln umsetzen 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8.  


Anzeige
Spiele-Angebote
  1. 31,99€
  2. 16,99€
  3. (u. a. Star Wars: The Force Unleashed - Ultimate Sith Edition für 4,20€, Star Wars: Knights of...

erlkoenig 19. Sep 2018

Man könnte den Slide Switch Eingang als Interrupt konfigurieren, und den Prozessor bei...

FrankGallagher 18. Sep 2018

Hast du falsch verstanden. Druckempfindlich nennt man resistive Flächen, kapazitive...

Eheran 18. Sep 2018

Ich habe noch nie einen Megacontroller programmiert. Wie groß sind die? Meine winzigen...


Folgen Sie uns
       


    •  /