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. Mitarbeiter im Service Desk (m/w/d)
    Techniklotsen GmbH, Bielefeld
  2. Product Designer UX/UI (m/f/d)
    ToolTime GmbH, Berlin
Detailsuche

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:

Golem Akademie
  1. Einführung in Unity: virtueller Ein-Tages-Workshop
    17. Februar 2022, Virtuell
  2. ITIL 4® Foundation: virtueller Zwei-Tage-Workshop
    24.–25. Januar 2022, virtuell
Weitere IT-Trainings

  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.  


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...



Aktuell auf der Startseite von Golem.de
Lego Star Wars UCS AT-AT aufgebaut
"Das ist kein Mond, das ist ein Lego-Modell"

Ganz wie der Imperator es wünscht: Der Lego UCS AT-AT ist riesig und imposant - und eines der besten Star-Wars-Modelle aus Klemmbausteinen.
Ein Praxistest von Oliver Nickel

Lego Star Wars UCS AT-AT aufgebaut: Das ist kein Mond, das ist ein Lego-Modell
Artikel
  1. Kryptowährung im Fall: Bitcoin legt rasante Talfahrt hin
    Kryptowährung im Fall
    Bitcoin legt rasante Talfahrt hin

    Am Samstag setzte sich der Absturz des Bitcoin fort. Ein Bitcoin ist nur noch 34.200 US-Dollar wert. Auch andere Kryptowährungen machen Verluste.

  2. eStream: Airstream-Wohnwagen mit eigenem Elektroantrieb
    eStream
    Airstream-Wohnwagen mit eigenem Elektroantrieb

    Der Wohnwagen Airstream eStream besitzt einen eigenen Elektroantrieb nebst Akku. Das entlastet das Zugfahrzeug und eröffnet weitere Möglichkeiten.

  3. Andromeda: Dieses Microsoft-Smartphone-Betriebssystem erschien nie
    Andromeda
    Dieses Microsoft-Smartphone-Betriebssystem erschien nie

    Erstmals ist ein Blick auf Andromeda möglich - das Smartphone-Betriebssystem, das Microsoft bereits vor einigen Jahren eingestellt hat.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • Corsair Vengeance RGB RT 16-GB-Kit DDR4-4000 120,95€ • Alternate (u.a. AKRacing Master Pro Deluxe 449,98€) • Seagate FireCuda 530 1 TB (PS5) 189,90€ • RTX 3070 989€ • The A500 Mini 189,90€ • Intel Core i9 3.7 459,50€ • RX 6700 12GB 869€ • MindStar (u.a. 1TB SSD 69€) [Werbung]
    •  /