TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
sensor

13. BESCHLEUNIGUNGSSENSOR

 

 

DU LERNST HIER...

 

wie du mit dem Beschleunigungssensor Lageänderungen und Bewegungen der Oxocard erfassen kannst.

 

 

SENSORWERTE

 

Der Sensor misst die konstante Erdbeschleunigung von rund 10 m/s2 und kann damit Lageänderungen der Oxocard erfassen, aber auch Beschleunigungen, die auf Grund von Bewegungsänderungen der Oxocard auftreten, beispielsweise weil man ihr einen Stoss gibt.

Der Sensor (Accelerometer) ist auf der Oxocard gut sichtbar. Ähnliche Sensoren sind auch in den meisten Smartphones eingebaut.

 

 

Wie bei Flugzeugen, kann man die Neigung der Oxocard gegenüber der Erdoberfläche bestimmen. Wenn man die Karte nach vorne oder nach hinten neigt, ändert der Pitch-Winkel bei einer Seitwärtsneigung der Roll-Winkel.

 

 

MUSTERBEISPIELE

 


Pitch und Roll

Den Sensor werden wir wieder als ein Objekt auffassen, das Eigenschaften und Fähigkeiten hat. Es ist in der Klasse Accel modelliert. Du erzeugst das Objekt mit  mit acc = Accel.create() und verwendest die Methoden getRoll() bzw. getPitch(), um die momentanen Werte von Roll und Pitch zu erhalten. Kippe die Oxocard ausgehend von der horizontalen Lage nach vorne und hinten beobachte dabei die Sensorwerte, die im Terminalfenster ausgeschrieben werden.

Programm:

from oxocard import *
from oxoaccelerometer import *

acc = Accelerometer.create()

while True:
    roll = acc.getRoll()
    pitch = acc.getPitch()    
    print("pitch:", pitch, "roll:", roll)
    sleep(0.3)
► In Zwischenablage kopieren

 

Als Anwendung schreibst du eine Anwendung, bei der die Rollposition auf dem Display sichtbar ist. Drehst du die Oxocard nach rechts, erscheint auf dem Display ein Rechtspfeil, drehst du sie nach links, erscheint ein Linkspfeil. Um ein Flackern zu vermeiden, wenn der Pfeil gelöscht und wieder neu dargestellt wird, schaltest du mit enableRepaint(False) das automatische Rendering ab und stellst das vollständig aufgebaute Bild mit repaint() dar.

 




Programm:

from oxocard import *
from oxoaccelerometer import *

acc = Accelerometer.create()
enableRepaint(False)

while True:
    roll = acc.getRoll()
    clear()
    if roll >= 0:
        arrow(3, 3, 0, 5, RED)
    if roll <= 0:
        arrow(4, 3, 4, 5, RED)
    repaint()
    print("roll = ", roll)
    sleep(0.3) 
► In Zwischenablage kopieren

 

Hier bewegt sich die ganze LED-Reihe beim Kippen der Oxocard nach vorne oder nach hinten.

Zuerst wird eine Linie in der Mitte des Displays gezeichnet. Ist der Pitch-Winkel negativ, wird die y-Koordinate um 1 vergrössert, ist er positiv, wird sie um 1 verkleinert.

 

Programm:

from oxocardext import *
from oxoaccelerometer import *

acc = Accelerometer.create()
enableRepaint(False)
y = 3
while True:
    pitch = acc.getPitch()    
    if pitch > 0 and y < 7:
        y += 1
    if pitch < 0 and y > 0:
        y -= 1    
    clear()
    line(0, y, 0, 8, RED)
    repaint()
    sleep(0.1)
► In Zwischenablage kopieren


Pollen und Ausschreiben der Sensorwerte

Die Methoden getX(), getY() und get(Z) liefern die Beschleunigungskomponenten in den drei Koordinatenrichtungen. Falls der Sensor nur gekippt ist, aber sonst ins Ruhe ist, entspricht dies den Komponenten der Erdbeschleunigung je im Bereich -9.81 und 9.81 m/s2. Mit getValues() kannst du auch ein Tupel mit allen drei Werten gleichzeitig holen. Für viele Sensortests schreibst du die periodisch gemessenen Werte einfach in die Konsole. Man sagt auch, dass man den Sensor "polle".

Programm:

from oxocard import *
from oxoaccelerometer import *

acc = Accelerometer.create()

while True:
    accX = acc.getX()
    accY = acc.getY()
    accZ = acc.getZ()
    print(accX, accY, accZ)
   #print("(acc_x, acc_y, acc_z) = (5.2f, %5.2f, %5.2f)" %(accX, accY, accZ))
    sleep(0.1)
► In Zwischenablage kopieren

Es ist üblich, beim Ausschreiben der Werte auch anzugeben, um welchen Wert es sich handelt. Am besten machst du das mit einer Formatierungsangabe (auskommentierte Zeile). Mit %5.2f legst du fest, dass die Werte als Float auf 2 Nachkommastellen gerundet und einer Feldbreite von 5 Zeichen ausgeschrieben werden. Dies hat auch den Vorteil, dass die Werte exakt untereinander erscheinen.


Wasserwaage mit einer Libelle

Du kannst mit der Oxocard ein Messgerät bauen, das wie eine Wasserwaage-Libelle funktioniert. Dazu zeichnest du einen Punkt entsprechend der momentanen Werte der Beschleunigungskomponenten in x- und y-Richtung.

 

Gleichzeitig willst du auch eine kreisartige Markierung zeichnen. Da du bei jeder Messung das Bild löschen und neu aufbauen musst, handelt es sich um eine Animation und du solltest mit enableRepaint(False) das automatische Rendern abschalten und mit repaint() selbst rendern.

 



Programm:

from oxocardext import *
from oxoaccelerometer import *


acc = Accelerometer.create()

x = 3
y = 3
enableRepaint(False)
while True:
    accX = acc.getX()
    accY = acc.getY() 
    x = max(min(int(3 - accX), 5), 1) 
    y = max(min(int(3 + accY), 5), 1) 
    clear()
    circle(3, 3, 2, CYAN)
    fillRectangle(2, 2, 3, 3, BLUE)
    dot(x, y, YELLOW)
    repaint()
    sleep(0.1)
► In Zwischenablage kopieren


Mit Events schnelle Beschleunigungsänderungen erfassen

Um schnelle Beschleunigungsänderungen zu erfassen, ist das Pollen des Sensors nicht geeignet, da diese weniger als 1 Millisekunde dauern können und das Pollintervall nicht genügend  klein gewählt werden kann. Darum müssen solche Ereignisse mit dem Eventmodell erfasst werden, wobei der Sensor einen Event auslöst, wenn die Beschleunigung einen bestimmten Wert (Triggerpegel) überschreitet. Dabei wird eine Callbackfunktion aufgerufen, in welcher du festlegst, wie das Programm reagieren soll.

Hier wird ein Event mit leichtem Klopfen (Tap) auf die Oxocard ausgelöst. In der Callbackfunktion onTap() erhöhst du lediglich eine Zählvariable n um 1. Im Hauptprogramm wird der Wert auf dem Display angezeigt. Wie du bereits weisst, muss die Callbackfunktion registriert werden. Dies erfolgt beim Erzeugen des Sensors. Dabei kannst du auch trigger_level und rearm_time festlegen. Kleinere Werte beim trigger_level machen den Sensor empfindlicher.  


rearm_time ist die Zeit in Sekunden, während der der Sensor inaktiviert wird, bis er wieder Events registriert. Eine solche "Totzeit" ist oft nötig, damit der Sensor nicht mehrere Ereignisse kurz hintereinander auslöst.

 

Programm:

from oxocard import *
from oxoaccelerometer import *

def onTap():
    global n
    n += 1

Accelerometer.create(onTap, trigger_level = 10, rearm_time = 0.2)

n = 0
print("Tap detector started")
while True:
    display(n)
    sleep(0.1)
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Mit dem Beschleunigungssensor kannst du die Lage und Bewegungsänderungen der Oxocard erfassen. Meist werden die Sensorwerte mit Pollen, d.h. in einer while-True Schleife regelmässig abgefragt.

Schnelle Änderungen müssen mit dem Eventmodell erfasst werden. Ein Event wird ausgelöst, wenn der Sensorwert einen Triggerpegel überschreitet. In einer Callbackfunktion definierst du, wie das Programm reagieren soll.

 

 

ZUM SELBST LÖSEN

 

 

1.
Schreibe ein Programm so, dass beim Kippen der Oxocard nach vorne und nach Hinten die passenden Pfeile angezeigt werden.  

2.

Durch Kippen der Oxocard kannst du alle LEDs am Rand der Reihe nach einschalten.

 

 

 

3.

Konstruiere eine Wasserwaage. Dabei soll sich auf einem Balken eine Markierung je nach Kipplage nach links oder rechts bewegen.