TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
kompass

6. MAGNETFELDSENSOR, KOMPASS

 

 

DU LERNST HIER...

 

wie du mit dem micro:bit das Magnetfeld messen und die Himmelsrichtung (das Azimut) bestimmen kannst.

 

 

SENSOR KALIBRIEREN UND WERTE ANZEIGEN

 
 


Du kannst den Magnetfeldsensor dazu benützen, wie mit einem Kompass die Lage des micro:bits in Bezug auf die Nordrichtung zu bestimmen Dazu verwendest du den Befehl compass.heading(), der bei horizontaler Lage des Boards das Azimut in Grad (positiv gegen Osten) zurückgibt .

Der Sensor ist auf deinem micro:bit gut sichtbar und ist mit COMPASS beschriftet.  

Bevor du mit der Messung beginnen kannst, musst du den Sensor mit dem Befehl compass.calibrate() kalibrieren. Nach dem Aufruf  blockiert das Programm und es erscheint auf dem Display die Aufforderung, eine Kreisfigur zu erstellen (Draw a circle). Kippe das Board in alle Richtungen, bis alle äusseren LEDs einen leuchtenden Kreis bilden.

Sogleich wird auf dem Display das Image HAPPY angezeigt und das Programm läuft weiter. In der Endlosschleife schreibst du das Azimut als ganze Zahl zwischen 0 und 360 aus. Wie üblich kannst du mit Ctrl+C die Ausgabe im Terminalfenster abbrechen.

 


from microbit import *

compass.calibrate()
while True:
    print(compass.heading())
    sleep(300)    
Programmcode markieren (Ctrl+C kopieren)

 

 

MUSTERBEISPIELE

 
Einen Kompass erstellen

Wie bei einem realen Kompass soll auf dem Display ein Pfeil erscheinen, der ungefähr nach Norden zeigt.

Da du nur Pfeile in 45-Grad-Richtungen darstellen kannst, teilst du das Azimut in 8 Bereiche ein und ordnest jedem Bereich denjenigen Pfeil zu, der am besten passt. Wenn der Sensor noch nicht kalibriert ist, musst du zuerst die Kalibrierung durchführen.

 

Eigentlich müsstest du bei den Bereichsgrenzen auch auf die Gleichheit testen. Da der Sensor aber nur ganzzahlige Werte zurückgibt, kannst du darauf verzichten.

from microbit import *

if not compass.is_calibrated():
    print("Perform calibration please!")
    compass.calibrate()

while True:
    h = compass.heading()
    print(h)
    if h > 22.5 and h < 67.5:
        display.show(Image.ARROW_NW) 
    elif h > 67.5 and h < 112.5:
        display.show(Image.ARROW_W)    
    elif h > 112.5 and h < 157.5:
        display.show(Image.ARROW_SW)    
    elif h > 157.5 and h < 202.5:
        display.show(Image.ARROW_S)    
    elif h > 202.5 and h < 247.5:
        display.show(Image.ARROW_SE) 
    elif h > 247.5 and h < 292.5:
        display.show(Image.ARROW_E)          
    elif h > 292.5 and h < 337.5:
        display.show(Image.ARROW_NE)
    else:
        display.show(Image.ARROW_N)
    sleep(10) 
Programmcode markieren (Ctrl+C kopieren)

 

Minen suchen

Lege einen kleinen Magneten, wie du ihn für Memoboards finden kannst,  unter einen Kartondeckel. Den Magneten kannst du wie eine Mine auffassen, die man mit dem micro:bit als Minensucher auffinden muss. In deinem Programm leuchtet die mittlere LED umso heller, je näher das Board zur Mine kommt.

Du verwendest den Befehl compass.get_values(), der die Stärke des Magnetfeldes als ein Tupel mit den x-, y- und z-Komponenten zurückgibt.

 

Dann berechnest du den Betrag aus diesen drei Komponenten und skalierst ihn so, dass du einen Helligkeitswert zwischen 0 und 9 erhältst.

from microbit import *
import math

while True:
    v = compass.get_values()
    b = math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])
    z = min(9, int(b / 500000)) # brightness
    display.set_pixel(2, 2, z)
    sleep(10)
Programmcode markieren (Ctrl+C kopieren)

 

Wasserstand messen

Deine Testanlage besteht aus einer Blumenvase und einem Magneten, der auf einem schwimmenden Korkzapfen befestigt ist. Mit drei Nägeln kannst du den Zapfen  so stabilisieren, dass sich der Magnet bei änderndem Wasserstand immer in der gleichen vertikalen Linie bewegt.

Aus der Messung des Betrages des Magnetfeldes erhältst du eine Information über die Höhe der Wassersäule.  Die willst sie in 3 Wasserstandsbereiche einteilen.

 

Am besten stellst du dir vor, dass sich das Gefäss in drei "Zuständen" befindet, die du mit der Variablen state erfasst, welche die Werte "high", "ok" und "low" annehmen kann. Aus dem skalierten Wert des Magnetfelds triffst du den Entscheid, ob sich der Zustand ändert.

Falls du keinen Sound zur Verfügung hast, kannst du auch eine andere Alarmanzeige realisieren.

 

 



from microbit import *
import math
import music

state = "ok"

while True:
    v = compass.get_values()
    b = math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])
    z = int(b / 100000)
    if z >= 15 and state != "high":
        state = "high"
        print("->high")
    elif z >= 8 and z < 15 and state != "ok":
        state = "ok"
        print("->ok")
    elif z < 8 and state != "low":
        state = "low"
        print("->low")
    if state == "high":
        music.pitch(2000, 100)
    elif state == "low":
        music.pitch(500, 100)
    sleep(10)
    
Programmcode markieren (Ctrl+C kopieren)

 

 

MERKE DIR...

 

Der Magnetfeldsensor kann im Zusammenhang mit Magneten oder zur Bestimmung der Himmelsrichtung als Kompasssensor verwendet werden. In dieser Anwendung muss er vor der ersten Verwendung kalibriert werden.

 

 

ZUM SELBST LÖSEN

 

 

1.

Baue einen "Pirouettenzähler": Jedes Mal wenn du dich mit dem micro:bit in der Hand einmal um deine eigenen Achse gedreht hast, wird eine weitere LED auf dem Display eingeschaltet.

Anleitung: Wenn sich der micro:bit dreht, liefert compass.heading() einen unregelmässigen Signalverlauf. 

Zum Zählen der Umläufe genügt ein einziger Schaltpegel nicht, sondern es müssen zwei Pegel definiert werden. Beim Überschreiten des oberen Pegels wird der Zähler erhöht und gleichzeitig aber das Zählen inaktiv gemacht. Erst beim Unterschreiten des unteren Pegels wird das Zählen wieder aktiviert.

2.

Berührungslose Umdrehungszähler (z.B. bei Rädern) verwenden oft einen Magneten, der bei jeder Umdrehung einmal vor einem Magnetfeldsensor vorbei läuft. Befestige ein Magnetchen (z.B. von einem Memoboards oder einem Magnetschnäpper) an einem Velorad und schreibe ein Programm, dass im Terminalfenster die Anzahl Umdrehungen ausschreibt. Wie lässt sich damit ein Kilometerzähler bauen?

 

 

 

 

 

 

6-1
Didaktische Hinweise:

Das Programm kann man eleganter schreiben, indem man eine Liste mit allen 8 Pfeilen verwendet und die Winkelbereiche mathematisch unter Verwendung des Modulo-Operators berechnet. Für Schülerinnen und Schüler ist diese Lösung aber schwerer nachvollziehbar.

from microbit import *

if not compass.is_calibrated():
    print("Perform calibration please!")
    compass.calibrate()


while True:
    h = compass.heading()
    print(h)
    h = (h - 22.5) % 360
    i = 7 - int(h / 45)
    display.show(Image.ALL_ARROWS[i])
    sleep(100) 
6-2
Didaktische Hinweise:

Die hier gezeigte Lösung verwendet das  Programmierparadigma "Zustandsprogrammierung" (state programming), wie es im Zusammenhang mit Automaten (state machines) weit verbreitet ist.

Dabei ist wichtig, dass nur Zuständsänderungen erfasst werden. Die Programmierung mit einer mehrfachen ifelse-Struktur ist nicht selbstverständlich und muss speziell trainiert werden.

5-3
Fachliche Hinweise:

Da bei der wohltemperierten Stimmung die Oktave (Verdoppelung der Frequenz)  in 12 Halbtöne mit gleichem Frequenzverhältnis r eingeteilt wird, gilt r12 = 2, also
r =

5-1
Fachliche Hinweise:

Einige Tonfrequenzen:

Ton Frequenz Ton Frequenz    

h' 494 h'' 988    
a' 440 a'' 880    
g' 392 g'' 784    
f' 349 f'' 698    
e' 330 e'' 660    
d' 294 d'' 588    
c' 262 c'' 524 c''' 1048