Annoncen / Vorträge

    HAM RADIO 2026

    Annoncen / Vorträge

      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.)

      Bild 1

       

      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.)

      Bild 2

       

      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.

      Bild 3

       

      Das Gerät verwendet eine generische USB-ID, die von Linux als MIDI-Gerät erkannt wird:

      Bild 4

       

      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.

      Bild 5

       

      Das virtuelle Audiogerät „tx0“ kann beim Systemstart mithilfe dieses systemd-Konfigurationsausschnitts erstellt werden:

      Bild 6

       

      Der gesendete CW-Text wird auf stdout ausgegeben:

      Bild 7

       

      Christoph, DF7CB 

      Diese Website nutzt ausschließlich technisch erforderliche Cookies. Wir benutzen keine Cookies, die eine Einwilligung erfordern würden. Weitere Informationen finden Sie in unserer Datenschutzerklärung. X