kompass
Deutsch   English   

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 Maggit statusnetfeldsensor 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 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, den micro:bit zu kippen, bis alle LEDs aktiviert sind.

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.

 


Programm:

from microbit import *

compass.calibrate()
while True:
    print(compass.heading())
    sleep(300)    
► In Zwischenablage 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.

Programm:

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) 
► In Zwischenablage 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_field_strength(), der die Stärke des Magnetfeldes zurückgibt.

 

Dann skalierst du diesen Messwert so, dass du einen Helligkeitswert zwischen 0 und 9 erhältst.

Programm:

from microbit import *

while True:
    b = compass.get_field_strength()    
    z = min(9, int(b / 500000)) # brightness
    display.set_pixel(2, 2, z)
    sleep(10)
► In Zwischenablage 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.

Die Funktion get_fied_strength() gibt die Stärke des Magnetfeldes zurück. Je nach Stärke des verwendenten Magnets musst du die Grenwerte im Programm noch anpassen.

 

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.

Mit Drücken des Buttons A kannst du die Töne abschalten. Falls du keinen Sound zur Verfügung hast, kannst du auch eine andere Alarmanzeige realisieren.

 

 



Programm:

from microbit import *
import music

state = "ok"

while not button_a.was_pressed():
    b = compass.get_field_strength()
    print(b)
    f = int(b / 100000)
    print(f)
    if f >= 15 and state != "high":
        state = "high"
        print("->high")
    elif f >= 8 and f < 15 and state != "ok":
        state = "ok"
        print("->ok")
    elif f < 8 and state != "low":
        state = "low"
        print("->low")
    if state == "high":
        music.pitch(2000, 100)
    elif state == "low":
        music.pitch(500, 100)
    sleep(500)
► In Zwischenablage 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.