Zum Inhalt

Morse:bit

Wir werden bald den Microbit so programmieren, damit er einen String in Morsecode umwandeln kann.

Der Morsecode ist wie folgt definiert:

micro:bit

morsecode

Morse-Alphabet digitalisieren

Im Replit-Team «inf-pka» findest du die Aufgabe «Morsecode» unter der Lerneinheit «MicroBit-Vorbereitungen».

Es macht mehr Sinn, zuerst alles nicht micro:bitianische in Replit zu probieren, da die Fehler-Ausgabe auf dem micro:bit beschränkt ist.

Lösung

Laut der Definition ist

  • die Länge eines Punktes eine Zeiteinheit
  • ein Strich drei Zeiteinheiten lang
  • der Abstand zwischen zwei Signalen im Buchstaben eine Zeiteinheit lang
  • der Abstand zwischen zwei Buchstaben im selben Wort drei Zeiteinheiten lang
  • der Abstand zwischen zwei Wörtern sieben Zeiteinheiten lang

Der Morse-Ceo wurde mit Hilfe eines Dictionnaries digitalisiert:

morseCode = {
  "A": "10111",
  "B": "111010101",
  "C": "11101011101",
  "D": "1110101",
  "E": "1",
  "F": "101011101",
  "G": "111011101",
  "H": "1010101",
  "I": "101",
  "J": "1011101110111",
  "K": "111010111",
  "L": "101110101",
  "M": "1110111",
  "N": "11101",
  "O": "11101110111",
  "P": "10111011101",
  "Q": "1110111010111",
  "R": "1011101",
  "S": "10101",
  "T": "111",
  "U": "1010111",
  "V": "101010111",
  "W": "101110111",
  "X": "11101010111",
  "Y": "1110101110111",
  "Z": "11101110101",
  "1": "10111011101110111",
  "2": "101011101110111",
  "3": "1010101110111",
  "4": "10101010111",
  "5": "101010101",
  "6": "11101010101",
  "7": "1110111010101",
  "8": "111011101110101",
  "9": "11101110111011101",
  "0": "1110111011101110111"
}
Ein Wort in Morsealphabet ausgeben

Übernimm die Funktion aus der oberen Aufgabe und programmiere den micro:bit so, dass er ein Wort, das du noch im Programm vorgibst, als Morse-Code über die LEDs ausgibt.

Nutze dazu den brandneuen Web-Editor von micro:bit.

Lösungs-Vorschlag
# Imports go at the top
from microbit import *
import time

morseCode = {
        "A": "10111",
        "B": "111010101",
        "C": "11101011101",
        "D": "1110101",
        "E": "1",
        "F": "101011101",
        "G": "111011101",
        "H": "1010101",
        "I": "101",
        "J": "1011101110111",
        "K": "111010111",
        "L": "101110101",
        "M": "1110111",
        "N": "11101",
        "O": "11101110111",
        "P": "10111011101",
        "Q": "1110111010111",
        "R": "1011101",
        "S": "10101",
        "T": "111",
        "U": "1010111",
        "V": "101010111",
        "W": "101110111",
        "X": "11101010111",
        "Y": "1110101110111",
        "Z": "11101110101",
        "1": "10111011101110111",
        "2": "101011101110111",
        "3": "1010101110111",
        "4": "10101010111",
        "5": "101010101",
        "6": "11101010101",
        "7": "1110111010101",
        "8": "111011101110101",
        "9": "11101110111011101",
        "0": "1110111011101110111"
        }

# Wort zum Testen
wort = "SOS"

# Intervall
int = 0.2

# Images für LED ein und aus
ledEin = Image('99999:99999:99999:99999:99999')
ledAus = Image('00000:00000:00000:00000:00000')

for zeichen in wort.upper():
    for code in morseCode[zeichen]:
        if code == "1":
            display.show(ledEin)
        else:
            display.show(ledAus)
        time.sleep(int)

    display.show(ledAus)
    time.sleep(3 * int)
Ein Satz in Morsealphabet ausgeben

Übernimm die Funktion aus der oberen Aufgabe und programmiere den micro:bit so, dass er ein Satz, den du noch im Programm vorgibst, als Morse-Code über die LEDs ausgibt.

Achte darauf, keine Satzzeichen zu verwenden.

Lösungsvorschlag
# Imports go at the top
from microbit import *
import time

morseCode = {
  "A": "10111",
  "B": "111010101",
  "C": "11101011101",
  "D": "1110101",
  "E": "1",
  "F": "101011101",
  "G": "111011101",
  "H": "1010101",
  "I": "101",
  "J": "1011101110111",
  "K": "111010111",
  "L": "101110101",
  "M": "1110111",
  "N": "11101",
  "O": "11101110111",
  "P": "10111011101",
  "Q": "1110111010111",
  "R": "1011101",
  "S": "10101",
  "T": "111",
  "U": "1010111",
  "V": "101010111",
  "W": "101110111",
  "X": "11101010111",
  "Y": "1110101110111",
  "Z": "11101110101",
  "1": "10111011101110111",
  "2": "101011101110111",
  "3": "1010101110111",
  "4": "10101010111",
  "5": "101010101",
  "6": "11101010101",
  "7": "1110111010101",
  "8": "111011101110101",
  "9": "11101110111011101",
  "0": "1110111011101110111"
}

# Satz zum Testen
wort = "Hello World"

# Intervall
int = 0.2

# Images für LED ein und aus
ledEin = Image('99999:99999:99999:99999:99999')
ledAus = Image('00000:00000:00000:00000:00000')

for zeichen in wort.upper():

    # Falls Leerzeichen
    if zeichen == " ":
        time.sleep(4 * int)
        # Am Ende hedes Buchstabens gibts bereits 3 * int
        # deshalb nur 4
    else:    
        for code in morseCode[zeichen]:
            if code == "1":
                display.show(ledEin)
            else:
               display.show(ledAus)
            time.sleep(int)

        display.show(ledAus)
        time.sleep(3*int)
Akkustische Ausgabe

Versuch doch mal den Morse-Code akkustisch auszugeben?

Lösungsvorschlag
# Imports go at the top
from microbit import *
import time
import music

morseCode = {
  "A": "10111",
  "B": "111010101",
  "C": "11101011101",
  "D": "1110101",
  "E": "1",
  "F": "101011101",
  "G": "111011101",
  "H": "1010101",
  "I": "101",
  "J": "1011101110111",
  "K": "111010111",
  "L": "101110101",
  "M": "1110111",
  "N": "11101",
  "O": "11101110111",
  "P": "10111011101",
  "Q": "1110111010111",
  "R": "1011101",
  "S": "10101",
  "T": "111",
  "U": "1010111",
  "V": "101010111",
  "W": "101110111",
  "X": "11101010111",
  "Y": "1110101110111",
  "Z": "11101110101",
  "1": "10111011101110111",
  "2": "101011101110111",
  "3": "1010101110111",
  "4": "10101010111",
  "5": "101010101",
  "6": "11101010101",
  "7": "1110111010101",
  "8": "111011101110101",
  "9": "11101110111011101",
  "0": "1110111011101110111"
}

# Satz zum Testen
wort = "Hello World"

# Intervall
int = 0.2

# Images für LED ein und aus
ledEin = Image('99999:99999:99999:99999:99999')
ledAus = Image('00000:00000:00000:00000:00000')

# Musik-Ton einstellen und stummschalten
music.pitch(440)
set_volume(0)

for zeichen in wort.upper():

    # Falls Leerzeichen
    if zeichen == " ":
        time.sleep(4 * int)
        # Am Ende hedes Buchstabens gibts bereits 3 * int
        # deshalb nur 4
    else:    
        for code in morseCode[zeichen]:
            if code == "1":
                set_volume(128)
                display.show(ledEin)
            else:
                set_volume(0)
                display.show(ledAus)
            time.sleep(int)

        display.show(ledAus)
        set_volume(0)
        time.sleep(3*int)
Morsecode übermitteln

Versuch doch mal den Morse-Code mittels «Radio» zu übermitteln. Anleitungen, wie man «Radio» mit den Microbits nutzt, findest du im Online-Editor.

Leider können nur strings übermittelt werden. Du musst also den Morse-Code von Boolean noch in ein String übersetzen, dann kannst du alles übermitteln.

Morsecode decodieren

Kannst du den erhaltenen Morsecode auch decodieren?