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.
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.
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.
Mit folgendem kleinen Programm ist es möglich das bisher Beschriebene zu prüfen:
#include <Adafruit_CircuitPlayground.h> #include <math.h> int pos; void setup() { CircuitPlayground.begin(); } void loop() { float x = CircuitPlayground.motionX(); float y = CircuitPlayground.motionY(); float angle = (atan2(y, x) * 180) / PI; CircuitPlayground.clearPixels(); if (angle >= 0 && angle < 36) { pos = 0; } else if (angle >= 36 && angle < 72) { pos = 1; } else if (angle >= 72 && angle < 108) { pos = 2; } else if (angle >= 108 && angle < 144) { pos = 3; } else if (angle >= 144 && angle < 180) { pos = 4; } else if (angle >= -180 && angle < -144) { pos = 5; } else if (angle >= -144 && angle < -108) { pos = 6; } else if (angle >= -108 && angle < -72) { pos = 7; } else if (angle >= -72 && angle < -36) { pos = 8; } else if (angle >= -36 && angle < 0) { pos = 9; } CircuitPlayground.strip.setPixelColor(pos, 255, 255, 255); CircuitPlayground.strip.show(); delay (100); }
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.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
- ohne Werbung
- mit ausgeschaltetem Javascript
- mit RSS-Volltext-Feed
Wie der Beschleunigungssensor funktioniert | Die Regeln umsetzen |
Man könnte den Slide Switch Eingang als Interrupt konfigurieren, und den Prozessor bei...
Hast du falsch verstanden. Druckempfindlich nennt man resistive Flächen, kapazitive...
Ich habe noch nie einen Megacontroller programmiert. Wie groß sind die? Meine winzigen...