Iambischer CW-Keyer basierend auf DigiSpark, MIDI und PulseAudio unter Linux
Klassische Amateurfunkgeräte besitzen physische Anschlüsse für Morsetasten und Mikrofone.
Bei Software-Defined-Radio-Geräten (SDR) ist die Sprachsteuerung durch Anschluss eines
Headsets einfach, doch Lösungen zum Anschluss einer Morsetaste – egal ob gerade Taste oder
Paddel – an einen modernen PC sind selten. Früher hatten Geräte serielle Schnittstellen mitRTS/DTR-
Leitungen, diese existieren jedoch nicht mehr, weshalb eine neue Schnittstelle benötigt wird.
Ich nutze einen LimeSDR als Bodenstation für den QO-100-Satelliten und wollte natürlich auch CW-Betrieb
damit durchführen. Zuerst verwendete ich SDRangel mit integriertem Morsegenerator, wollte aber zusätzlich
einen CW-Taster anschließen. Auf den ersten Blick schien alles vorhanden: Es gab eine Abstimmtaste,
die auch als gerader Taster verwendet werden konnte, sowie Tastaturbelegungen für Punkte und Striche.
Die Verzögerung zwischen Taster und lokalem Audiosignal betrug jedoch fast eine Sekunde, was für mich
nicht praktikabel war. Daraufhin modifizierte ich meinen K3NG-Taster, um ^ (hoch) und _ (niedrig) Signale
über die USB-Schnittstelle auszugeben. Ein kleines Python-Programm las diese Signale aus und sendete Anfragen
an die SDRangel REST-API. Das funktionierte zwar, aber diese Lösung erschien mir immer zu komplex. Außerdem
war der Mithörton des Summers im Arduino-Gehäuse im ganzen Haus zu hören. Die gesamte Sende-Empfangs-
Verzögerung betrug deutlich über eine Sekunde.
Als Nächstes versuchte ich, einige GNU-Radio-Flussdiagramme zu erstellen, um dasselbe Problem zu lösen.
Alle hatten jedoch das gleiche Problem: Die Puffer wurden viel zu groß, um die Mithörfunktion zum Tasten zu
verwenden. Gleichzeitig wechselte ich den Transceiver von SDRangel zu einem anderen GR-Flussdiagramm,
wodurch die gesamte Sende-Empfangs-Verzögerung deutlich reduziert wurde. Die lokale Audioverzögerung war
jedoch immer noch zu hoch für CW.
Nach einigem Hin und Her habe ich folgende Lösung gefunden: Die externe Schnittstelle zwischen den CW-Paddeln
und dem PC ist eine kleine DigiSpark-Platine, die so programmiert ist, dass sie MIDI-Signale ausgibt.
Auf dem (Linux-)PC läuft ein Python-Programm, das MIDI-Signale empfängt und als jambischer CW-Geber
fungiert. Die Morsezeichen (Punkte und Striche) werden als „Samples“ an PulseAudio gesendet und dort sowohl
über den lokalen Mithörtonkanal (üblicherweise Kopfhörer) als auch über den Audiokanal des SDR-Transceivers
wiedergegeben. Es gibt keine Verzögerung. :)
DigiSpark-Hardware
Der DigiSpark ist ein sehr kleiner eingebetteter Computer, der mit Hilfe der Arduino-Toolchain programmiert
werden kann.
Von den 6 IO-Pins werden zwei für den USB-Bus verwendet, zwei verbinden die Dit- und Dah-Leitungen des
CW-Paddles, einer ist mit einem Potentiometer zur Einstellung der Tastgeschwindigkeit verbunden, und der
letzte ist in dieser Ausführung nicht angeschlossen, könnte aber zum Ansteuern eines physischen Transceivers
verwendet werden. (Die Onboard-LED verwendet diesen Pin.)
Um sicherzustellen, dass die Spannung an P5 > 2,5 V beträgt, befindet sich im Masseanschluss des Potentiometers
ein zusätzlicher 27 kΩ-Widerstand. Andernfalls setzt sich der DigiSpark zurück. (Dies könnte durch Durchbrennen
einiger Sicherungen geändert werden, ist aber nicht notwendig.)
Der Arduino-Sketch für den Keyer verwendet die DigisparkMIDI-Bibliothek . Der Code ist recht einfach:
Beim Drücken der Paddel wird ein MIDI-Note-On-Ereignis (dit = Note 1, dah = Note 2) gesendet, beim Loslassen
ein Note-Off-Ereignis. Wird das Potentiometer verändert, wird ein Control-Change-Ereignis (Control 3) gesendet.
Der gelesene Wert wird anschließend auf WPM-Werte zwischen 8 und 40 skaliert.
Das Gerät verwendet eine generische USB-ID, die von Linux als MIDI-Gerät erkannt wird:
Python- und PulseAudio-Software
Auf der Linux-Hostseite lauscht ein Python-Programm auf MIDI-Ereignisse und fungiert als jambischer CW-Keyer,
der den Strom der Notenan-/Ausschaltsignale in CW-Signale umwandelt.
Anstatt eines vollständigen Audiostreams werden Dit- und Dah-„Samples“ in PulseAudio hochgeladen
und über die pulsectl-Bibliothek ausgelöst . Bei Geschwindigkeitsänderungen werden neue Samples hochgeladen.
Die Samples werden auf zwei Kanälen wiedergegeben: einem für den Mithörton im Kopfhörer des Bedieners
und einem für das Audioeingabegerät des SDR-Senders.
Das virtuelle Audiogerät „tx0“ kann beim Systemstart mithilfe dieses systemd-Konfigurationsausschnitts erstellt werden:
Der gesendete CW-Text wird auf stdout ausgegeben:
Christoph, DF7CB






