In dem Versuch übernimmt Raspberry Pi die Rolle eines Morsesenders und damit die Übersetzung einzelnen Alphabet-Buchstaben
in den Morse-Code. Die gesendeten Signale werden mit einem aktiven Summer hörbar gemacht. Zur Ergänzung bekommt die Schaltung eine
LED-Matrix. Neben Tonsignalen werden somit auch Lichtsignale gesendet.
Die Eingabe der Nachricht, die gesendet werden soll, erfolgt über die Tastatur. Der Text ist dann auf dem Bildschirm auch sichtbar.
Zusätzlich wird beim Übertragen das gerade gesendete Zeichen mit dem zugehörigen Morse-Code auf dem Bildschirm
zu sehen sein.
Den aktiven Summer könnte man auch direkt an einen GPIO-Ausgang des Raspberry Pi anschließen. Seine Stromaufnahme liegt
bei 13 mA. Das würde ein GPI-Ausgang problemlos verkraften, es empfiehlt sich jedoch, die GPIOs so wenig wie möglich zu belasten und
eventuellen Abnehmer aus einer separaten Stromquelle zu versorgen. Für die Testzwecke benutzen wir hier als Spannungsversorgung den
5V-Ausgang, der uns Raspberry Pi am Pin 2 und 4 zur Verfügung stellt. Als Schalter kommt der Transistor BD437 zum Einsatz. Er ist mit
einer Leistung von über 30 W für diese Aufgabe völlig überdimensioniert. Dafür kann man hier noch weitere Abnehmer
anschließen.
LED-Matrix
Als Lichtquelle für die optischen Signale schließen wir zusätzlich an Raspberry Pi eine aus 64 blauen LEDs bestehende
8x8 Matrix an. Sie wird zusammen mit dem Summer an den Transistor angeschlossen. Die einzelnen LEDs der Matrix sind für den
Versuch zusammengeschlossen.
Mit dem Taster S1 kann manuell gemorst werden. Der Taster ist direkt, genauso wie der Ausgang von Raspberry Pi, an die
Basis des Schalttransistors T1 angeschlossen. Damit der Ausgang keinen Schaden nimmt, wird er von dem Taster mit einer Diode
(1N4148) abgetrennt.
Der Schaltplan
Schaltplan
Testschaltung
Testschaltung
Das Programm
Mit dem Entry-Widget wird dem Benutzer ein Eingabefeld, mit dessen Hilfe ein Text eingegeben werden kann, zur Verfügung
gestellt. Nach der Eingabe des Textes wird mit dem Button "Senden" die Übertragung gestartet. Es werden nacheinander alle Zeichen
(Buchstaben) des eingegebenen Textes abgearbeitet. Vor der eigentlichen Übertragung der Symbole im Morsecode (Punkt, Strich) wird die
Variable "Zeichen_Code" untersucht. Hier sind die Morse-Codes für alle Zeichen gespeichert. Die Zeichen_Code-Variable enthält für
Testzwecke nur die Codes für die Buchstaben. Sie muss bei Bedarf um Ziffern und Sonderzeichen erweitert werden.
Bei der Übertragung spielt die Variable "Dit" die entscheidende Rolle. Sie stellt die zeitliche Basis für alle Symbole und Pausen
dar. Je nachdem, wie sie eingestellt ist, erfolgt die Übertragung schneller oder langsamer. Bezogen auf "Dit" verhalten sich die zeitlichen
Längen der Symbole und Pausen wie folgt:
Symbol Punkt = 1 Dit
Symbol Strich = 3 Dit
Pause zwischen Symbolen = 1 Dit
Pause zwischen Buchstaben (Zeichen) = 3 Dit
Pause zwischen Wörtern = 7 Dit
Das gerade übertragene Zeichen wird mit dem dazugehörigen Morse-Code in dem Label "Label_Zeichen" angezeigt. So kann man stets
die aktuelle Übertragung verfolgen. Mit dem Programm ist auch eine Liveübertragung möglich. Man aktiviert mit dem Button "Senden"
zuerst die Übertragung und erst dann gibt den Text ein. Das Programm startet dann das Morsen noch während der Texteingabe. Hier
ist allerdings darauf zu achten, dass man schnell genug den Text eingibt. Andernfalls können falsche Pausen zwischen den
Zeichen entstehen.
# -----------------------------------------------------------------
# Morsen mit Raspi
# Aktiver Summer + 8x8-Matrix
# Raspberry Pi 3B, Python 3.7.3
# -----------------------------------------------------------------
from tkinter import*
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(40,GPIO.OUT) # Signalgeber Ton+Licht # Morse Code
Zeichen_Code = [["A", ".-"], ["B", "-..."], ["C", "-.-."],
["D", "-.."], ["E", "."], ["F", "..-."],
["G", "--."], ["H", "...."], ["I", ".."],
["J", ".---"], ["K", "-.-"], ["L", ".-.."],
["M", "--"], ["N", "-."], ["O", "---"],
["P", ".--."], ["Q", "--.-"], ["R", ".-."],
["S", "..."], ["T", "-"], ["U", "..-"],
["V", "...-"], ["W", ".--"], ["X", "-..-"],
["Y", "-.--"], ["Z", "--.."], [" ", " "] ]
Zeichen_Nr = 0
Zeichen_Pos = 0
Dit = 0.15
Anzeige_OK = 1
Zeichen = ""
# Zeichen + Code ermitteln ............................................
def Zeichen_und_Code (Text):
global Zeichen_Nr
global Zeichen
global Zeichen_Pos
Zeichen = Text[Zeichen_Nr-1:Zeichen_Nr].upper()
for i in range (27): # Zeichen_Code durchsuchen
if Zeichen_Code [i][0] == Zeichen: # Zeichen gefunden
Anzeige = Zeichen + " " + Zeichen_Code [i][1]
Label_Zeichen.configure (text = Anzeige)
Zeichen_Pos = i
# Fenster Parameter ............................................
def Start_Fenster():
Hauptfenster.config (bg='#999999')
Breite = Hauptfenster.winfo_screenwidth()
Höhe = Hauptfenster.winfo_screenheight()
Hauptfenster.geometry("%dx%d+0+0" % (Breite,Höhe))
# Zeichen senden ............................................
def Zeichen_Senden(Zeichen):
Zeit_Faktor = 0
global Zeichen_Pos
for j in range (len(Zeichen_Code [Zeichen_Pos][1])):
Symbol = Zeichen_Code [Zeichen_Pos][1][j:j+1]
Zeit_Faktor = 2
if Symbol == ".": # Punkt
GPIO.output(40, GPIO.HIGH)
time.sleep(Dit)
if Symbol == "-": # Strich
GPIO.output(40, GPIO.HIGH)
time.sleep(3 * Dit)
GPIO.output(40, GPIO.LOW)
if Symbol == " ": # Wort-Pause
Zeit_Faktor = 6
time.sleep(Dit) # Symbol-Pause
time.sleep(Zeit_Faktor * Dit)
# Senden ............................................
def Zeigen_und_Senden():
global Zeichen_Nr
global Anzeige_OK
global Zeichen
Text = Text_Eingabe.get()
Zeichen_Anzahl = len(Text)
if Zeichen_Nr < Zeichen_Anzahl:
Zeichen_Nr += 1
if Anzeige_OK == 1: # Zeichen + Code anzeigen
Zeichen_und_Code (Text) # Zeichen + Code ermitteln
Zeichen_Nr -= 1
if Anzeige_OK == -1: # senden
Zeichen_Senden (Zeichen)
Anzeige_OK = -Anzeige_OK
Hauptfenster.after (1, Zeigen_und_Senden)
# Hauptprogramm ............................................
Hauptfenster = Tk()
Start_Fenster()
# Fenster Titel ............................................
Titel = Label (Hauptfenster,
bg='#999999',
text="MORSE - SENDER",
font=('Arial', 40, 'bold'),
foreground="green")
Titel.place (x=370,y=-30,width=500,height=180)
# Tastatureingabe ............................................
Text_Eingabe = Entry (Hauptfenster,
font=('Arial', 30, 'bold'),
width=50 )
Text_Eingabe.place (x=20,y=110,width=1315,height=60)
# Zeichen Anzeige ............................................
Label_Zeichen = Label (Hauptfenster,
bd=4, bg="blue",
font=('Arial', 60, 'bold') )
Label_Zeichen.place (x=20,y=200,width=500,height=180)
# Senden starten ............................................
Button_Senden = Button (Hauptfenster,
bd=4, bg='#999999',
text="SENDEN",
font=('Arial', 40, 'bold'),
command = Zeigen_und_Senden)
Button_Senden.place (x=700,y=400,width=300,height=180)
Hauptfenster.mainloop()
# -----------------------------------------------------------------