Eine simple Morsetaste für Internet-CW (ICW)


Elektronik-Labor  Projekte   




Motivation

Ich hatte früher gern und viel Morsetelegrafie auf Kurzwelle gemacht, aber vor 20 bis 15 Jahren wurde das immer weniger; seit 2010 dann Null. Der Störpegel durch Schaltnetzteile, mikroprozessorgesteuerte Geräte und Rechner wurde Jahr für Jahr stärker. Der Lärm nervte, deckte schwache Signale zu, und ich hatte den Verdacht, dass die anderen Leute auch darunter leiden und mich nicht mehr anständig hören können.

Im Grunde genommen werden wir Funkamateure schleichend enteignet (sofern wir in der Stadt wohnen, auf dem Lande mag die Welt noch in Ordnung sein). Formal ist die Bundesnetzagentur noch für Funkschutz zuständig, wurde aber zu einem zahnlosen Tiger umgebaut, denn Funkschutz wird inzwischen als Markthindernis angesehen.

Vor einigen Monaten war ich umgezogen, in der neuen Wohnung kann ich nicht mal mehr eine Sendeantenne anbringen. Es war mir auch nicht mehr wichtig; eigentlich war ich "mit dem Thema durch", obwohl ich die Telegrafie nach wie vor sehr reizvoll fand und ein wenig vermisste.

Telegrafie per Draht - ohne die zunehmend unbrauchbar gemachte Kurzwelle - das wär's!

Schon vor längerer Zeit hatte ich hin und wieder über Versuche in den USA gelesen, Telegrafie per Internet zu machen, aber ich hatte damals den Eindruck, dass die an zu wenigen Nutzern litten und dass das Ganze nicht langlebig sei.

Neulich fand ich jedoch einen Verweis auf einen Server, auf dem sich deutsche Telegrafiefreunde treffen; der schien schon längere Zeit zu existieren und sich einer kleinen, aber aktiven Nutzerschar zu erfreuen. Das musste ich mal ausprobieren!



Technischer Hintergrund

Im Internet gibt es Konferenz-Server, auf denen sich mehrere Teilnehmer in Chaträume begeben und dort unterhalten können. Die werden im Privatsegment häufig von "Gamern" genutzt, die bei Internet-"Ballerspielen" in Mannschaften gegeneinander antreten und sich per Sprechgarnitur mit ihren Kumpels absprechen.

Ein solches System haben die Internet-Telegrafisten zweckentfremdet und schicken statt Sprache die Morsesignale als Audio. Das Verfahren ist technisch etwas unelegant und zudem ein bisschen heikel, weil die Morsetöne durch Software-Sprachcodecs geschickt werden, die darauf ausgelegt sind, Sprache zu komprimieren, und hinter manchen Notebook-Mikrofoneingängen lauern automatische Pegelregler bzw. -begrenzer; beide neigen dazu, mit solchen getasteten Einzeltönen "wilde Sachen" anzustellen. Auch kann es leicht Probleme mit zu langen Paketlaufzeiten (Latenzen) geben.

Aber es mußte nichts neu erfunden werden und man kann gängige Infrastruktur nutzen (der virtuelle Server ist offenbar für wenig Geld bei einem Hoster angemietet und steht in Düsseldorf). Als Client wird die freie Software "Mumble" genutzt, die es für Windows, OSX und Linux gibt (also auch für den Raspberry Pi; mit einem Raspberry Pi 4 mit 4 GB RAM und der weiter unten erwähnten USB-Sound"karte" habe ich bereits erfolgreich ICW getestet - keine Ahnung, ob auch ältere RasPis schnell genug sind).

Einen Überblick über das System und eine detailliertere Einrichtungs-Anleitung gibt es unter https://www.elektronik-labor.de/Projekte/icw-einstieg.html).

Mit der Notebook-internen Sound-Hardware klappte es bei mir nicht richtig, aber ich hatte noch eine billige alte USB-Sound"karte" von Terratec herumliegen, mit der es recht ordentlich zu funktionieren scheint.

Wenn man sich nicht unbeliebt machen will, sollte man für Internet-Telegrafie keinen Rechteck-Ton verwenden, wie ich das immer bei meinen Mikrocontroller-CW-Projekten gemacht hatte. Der klingt schaurig, wenn er über einen relativ breiten Sprachkanal geschickt und mit Kopfhörern oder Lautsprechern abgehört wird.

In einigen Bauanleitungen im Internet werden recht aufwendige Sinusoszillatoren und/oder Filter aus Operationsverstärkern und vielen passiven Bauteilen vorgeschlagen. Die Filter sollen nicht nur einen Sinus formen, sondern auch ein weiches Einschwingen und Ausklingen bewirken (so dass man keine Schaltknackse hört).

Man kann aber auch eine Sinus-Treppenkurve mit einem Mikrocontroller per Pulsweitenmodulation erzeugen und die Treppe mit einfachen RC-Gliedern ausreichend glätten. Auch ein weicheres Ein-und Ausschwingen kann man in Software realisieren. Ich habe ein altes Projekt wieder ausgegraben, mit dem ich das vor Jahren mal ausprobiert hatte: http://www.elektronik-labor.de/AVR/Sinus.html

Ein noch "früheres Werk" war eine elektronische Morsetaste (ElBug): http://www.elektronik-labor.de/AVR/Elbug.html



Hardware




Morsetaste und Sinusgenerator sind auf zwei Mikrocontroller ATtiny13 aufgeteilt, weil die Sinuserzeugung sehr zeitkritisch ist. Die beiden Programme sind durch die Aufteilung sehr schlicht und einfach, sie belegen jeweils nur ein paar hundert Bytes Flash-Speicher.

Der Bauteileaufwand ist lächerlich gering - insgesamt sind es nur 8 Bauteile sowie zwei optionale Taster zum Umschalten der NF-Frequenz.

Die Betriebsspannung kann man am einfachsten aus einem USB-Anschluss des Rechners entnehmen. Als Kurzschlussschutz sollte man einen Widerstand 10 Ohm / 0,125W in den Stecker einbauen, der bei Kurzschluss durchbrennt und sich vorher mit "Rauchzeichen" und Gestank meldet.




Aufgebaut ist die Schaltung auf einer Lochrasterplatine mit Streifenleitern. Der "Radar"-Blick erfolgt von oben; braun sind die Drahtbrücken, blau die Kupferbahn-Stücke auf der Unterseite der Platine. Wo erforderlich, sind die Leiterbahnen mit einem 3mm-Bohrer durch Ansenken unterbrochen.






Software des Sinus-Oszillators

Beim Testen der alten Version stellte ich fest, dass auf dem NF-Ausgang ein Gleichspannungsanteil lag; entweder hatte ich damals etwas falsch gemacht oder die zwischenzeitlich aktualisierte BASCOM-Freeware verhält sich nun anders. Ich musste den Befehl "Config Timer0" am Ende auf "Pwm Clear Up" ändern. Der aktualisierte Quelltext mit Kommentaren:
' Sinusoszillator
'
' Sprache: Bascom-AVR-Basic Version 2.0.7.9 Demo/Freeware

' Erzeugung per PWM- Oszillator; sein Puls-Pausenverhaeltnis wird mit den 128 Werten einer approximierten
' Sinusfunktion geladen, so dass sich eine Treppe in Sinusform ergibt.

' Da die PWM- Taktfrequenz ueber 18 kHz betragen muss, damit man sie nicht hoert, muss der AtTiny 13 mit 9,6 MHz 
' Takt betrieben werden.

' Der Attiny 13 kann jedoch auf 1,2 MHz geflasht bleiben (Auslieferungszustand), die Taktumschaltung auf 9,6
' MHz erfolgt ueber das CLKPR- Register zur Laufzeit des Programms

' Der Sinus liegt an OC0A, also PB0

' Der Generator wird mit einem Low an PB3 aktiviert (es wird also gegen Masse getastet)
'
' zur Unterdrueckung des Einschaltknacksens schwillt die Huellkurve des Sinus nach einer Quadrat-Funktion
' (Befehl "Shift M, Right Z") an bzw. ab. Nebenbei sorgt sie auch fuer das Enprellen des Tasteingangs (PB3)
'
' Die NF-Ausgangsfrequenz kann ueber Taster an PB2 und PB4 in groben Stufen veraendert werden.
' PB2 und PB4 werden nur in den Tastpausen abgefragt, um die Tonerzeugung nicht "auszubremsen"
' Wegen der Eindeutigkeit wird die Frequenz in jeder Tastpause nur um eine Stufe erhoeht bzw. vermindert.
'


$Regfile = "attiny13.dat"
$Crystal = 9600000
$Hwstack = 32
$Swstack = 8
$Framesize = 8

Dim A As Word                                              ' fuer Verzoegerungsschleife, die zu niedrigerer Frequenz fuehrt
Dim B As Byte                                              ' speichert letzten Wert von A
Dim N As Byte                                              ' fuer die Zaehlschleife
Dim M As Byte                                              ' fuer PWM-Wert
Dim Z As Byte                                              ' fuer Huellkurve

Clkpr = 128                                                ' Aenderung Taktrate vorbereiten
Clkpr = 0                                                  ' 9,6 MHz 
Clkpr = 0                                                  ' Wert bestaetigen

Acsr.7 = 1                                                 ' Analog-Komparator ausschalten, spart etwas Strom

Ddrb = &B0000_0001                                         ' alle Pins bis auf PB0 Eingang
Portb = &B0001_1110                                        ' alle Pins bis auf PB0 Pullup-Widerstand


Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up
Start Timer0
Tccr0a.0 = 1                                               ' wgm00
Tccr0a.1 = 1                                               ' wgm01
Tccr0b.3 = 0                                               ' wgm02



Z = 6                                                      ' PWM-Signal ist stets Null 
B = 3                                                      ' mittlere Tonhoehe

Do

    If Pinb.3 = 0 Then                                     ' Abfrage, ob Signal an PB3 low ist

        Gosub Sinus

        If Z > 0 Then
            Decr Z                                         ' Z startet mit 6 und wird nach jeder Sinsuwelle bis 0 vermindert
        End If                                             ' bewirkt Anschwellen der Sinuskurve

    Else

        A = B                                              ' in B ist der letzte Wert von A gespeichert

        If Z < 6 Then
            Gosub Sinus
            Incr Z                                         ' Z startet mit 0 und wird nach jeder Sinsuwelle bis 6 erhoeht
        End If                                             ' bewirkt Abschwellen der Sinuskurve

        If Pinb.4 = 0 Then                                 ' Taster zur Verminderung der Frequenz
            If A = B Then                                  ' Frequenz nur ein mal pro Tastpause vermindern
                Incr A
            End If
        End If

        If Pinb.2 = 0 Then                                 ' Taster zur Erhoehung der Frequenz
            If A = B Then                                  ' Frequenz nur ein mal pro Tastpause erhoehen
                Decr A
            End If
        End If

        If A = 0 Then                                      ' unzulaessige Werte abfangen
            A = 1
        End If

        If A > 6 Then                                      ' unzulaessige Werte abfangen
            A = 6
        End If

    End If

Loop


Sinus:

    Restore Sinusdata                                      ' Zeiger auf Anfang der Data-Tabelle setzen
    For N = 1 To 128
        Read M
        Shift M , Right , Z                                ' bewirkt Ansteigen der Hüllkurve 
        Pwm0a = M                                          ' der Wert in PWM0A bestimmt das Puls- / Pausenverhältnis
        B = 0
        Do                                                 ' Verzögerungsschleife, dauert um so länger, je groesser A ist
            Incr B
        Loop Until B = A
    Next N

Return



Sinusdata:

Data 0 , 0 , 0 , 1 , 2 , 3 , 5 , 7 , 9 , 12 , 14 , 17 , 21 , 24 , 28 , 32,
Data 36 , 41 , 46 , 51 , 56 , 61 , 66 , 72 , 78 , 83 , 89 , 95 , 101 , 107 , 114 , 120,
Data 127 , 133 , 139 , 145 , 151 , 157 , 163 , 169 , 175 , 181 , 186 , 192 , 197 , 202 , 207 , 212,
Data 216 , 221 , 225 , 228 , 232 , 235 , 238 , 241 , 244 , 246 , 248 , 250 , 251 , 252 , 253 , 253,
Data 253 , 253 , 253 , 252 , 251 , 250 , 248 , 246 , 244 , 241 , 239 , 236 , 232 , 229 , 225 , 221,
Data 216 , 212 , 207 , 202 , 197 , 192 , 187 , 181 , 175 , 169 , 164 , 158 , 151 , 145 , 139 , 133,
Data 127 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 67 , 61 , 56 , 51 , 46 , 41,
Data 37 , 33 , 28 , 25 , 21 , 18 , 15 , 12 , 9 , 7 , 5 , 3 , 2 , 1 , 0 , 0,


Software der Morsetaste

Den Speichertext für CQ-Rufe, die Stromsparmaßnahmen und den (Rechteck-) Ton habe ich aus der alten Software rausgeworfen. Der aktualisierte Quelltext:

' Morsekeyer
' Sprache: Bascom-AVR-Basic Version 2.0.7.9 Demo/Freeware
'
' Hardware:
' Tastkontakte fuer Punkt und Strich an PB3 und PB2 (Tastung gegen Masse).
' Schaltausgang ist PB1. Tastung invertiert, Aktiv = 0V, Ruhe = 5V
' Poti zur Geschwindigkeitseinstellung an PB4


$Regfile = "ATtiny13.dat"
$Crystal = 1200000                                          ' Taktfrequenz: 1,2 MHz
$Hwstack = 8                                                ' Platz fuer nur 4 Unterprogramme reserviert, spart SRAM
$Swstack = 0                                                ' wird nicht gebraucht
$Framesize = 0                                              ' dito

Dim I As Byte                                               ' wird in Zaehlschleife verwendet
Dim M As Byte                                               ' wird fuers Auslesen der Morsebits verwendet
Dim L As Byte                                               ' wird fuer niederwertigstes Bit von M verwendet
Dim Dit As Word                                             ' Laenge Punkt
Dim Dah As Word                                             ' Laenge Strich
Dim Wort As Word                                            ' Laenge Wortabstand
Dim P As Byte                                               ' Punktspeicher

Ddrb = &B0000_0010                                          ' Pin PB1 als Ausgang konfigurieren (1), Rest ist Eingang (0)
Portb = &B0000_1111                                         ' PB1 auf high, PullUp-Widerstaende fuer die Pins PB0, PB2 und PB3 aktivieren

Config Adc = Single , Prescaler = Auto                      ' AD- Konverter konfigurieren und starten
Start Adc


Do

    Start Adc
    Gosub Adclesen
    If Pinb.3 = 0 Then                                      ' Punktkontakt gedrueckt
        Portb.1 = 0                                         ' Schaltausgang ein (invertierte Logik)
        Waitms Dit
        Portb.1 = 1                                         ' Schaltausgang aus
        Waitms Dit
    End If

  Mark:

    If Pinb.2 = 0 Then                                      ' Strichkontakt gedrueckt
        Portb.1 = 0
        Waitms Dah
        If Pinb.3 = 0 Then                                  ' Punktkontakt zusaetzlich gedrueckt
            P = 1                                           ' Squeeze- bzw. Punktspeicher
        End If
        Portb.1 = 1
        Waitms Dit
        If P = 1 Then
            Portb.1 = 0
            Waitms Dit
            Portb.1 = 1
            Waitms Dit
            P = 0
            Goto Mark
        End If
    End If

Loop


Adclesen:

    Dit = Getadc(2)
    Dit = Dit + 416                                          ' fuer sinnvollen Einstellbereich der Geschwindigkeit
    Shift Dit, Right , 4                                     ' entspricht Teilung durch 16, spart Flash-Speicher
    Dah = 3 * Dit
    Wort = 8 * Dit
Return

End

Wenn man die Software nicht selbst übersetzen will, kann man die beiden beigefügten HEX-Files direkt in die Mikrocontroller flashen; ein ISP-Programmer muß allerdings vorhanden sein. Die Taktrate der Mikrocontroller kann auf dem Auslieferungszustand verbleiben (1,2 MHz)



Erste Betriebs-Eindrücke




Früher hatte ich auf Kurzwelle gern ausgiebig mit Leuten in Telegrafie "geklönt", allerdings waren viele Funkamateure sehr kurz angebunden und beherrschten möglicherweise auch nur "Standard-QSOs". Rapport, Name, QTH, Stationsbeschreibung und Wetterbericht - das war's. Die interessierten sich wohl mehr für Diplom-Punkte und QSL-Karten (die nannte ich schon immer "Gruselkarten", weil ich keine Lust auf das stumpfe Ausfüllen hatte).

Ganz anders geht es auf dem ICW-Server zu. Da trifft man auf Telegrafisten, die sich gern stundenlang in Klartext unterhalten, ähnlich den HSC-Runden auf Kurzwelle, aber nicht so elitär. Auf dem ICW-Server stellt man gern die Taste langsamer, wenn ein langsamerer Gast auftaucht. Es gibt auch einen QRS- und einen Übungskanal.

Ob ich den anderen dort schnell zu langweilig werde (oder umgekehrt), weiß ich noch nicht, aber die ersten Verbindungen waren sehr entspannend und interessant. Bemerkenswert finde ich auch, dass das System nicht nur Funkamateuren offen steht; der Betreiber des Servers ist ehemaliger Seefunker, hat aber kein Amateurfunk-Call.

Es ist jedoch nicht "rund um die Uhr" etwas los. Zu festen Zeiten treffen sich Runden regelmäßig, aber tagsüber herrscht oft stundenlang Leere. Aber man kann sich ja einloggen und auf die Lauer legen. Wenn dann jemand erscheint, hat man mindestens eine Stunde zu tun ;) .

Auf ein bisschen "Gefummel" muss man sich einstellen, aber wenn man sich an der oben genannten Einrichtungshilfe orientiert und notfalls in eine externe USB-Soundkarte investiert, sollte es klappen und man kann sich auf CW-QSOs freuen, bei denen das Gesendete wirklich beim Empfänger ankommt, einem die Ausbreitungsbedingungen keinen Strich durch die Rechnung machen und sich in einer Runde wirklich alle Teilnehmer hören können.

Download des Quellcodes und des HEX-Files:  1019-icw-morsetaste.zip




Update; neuer ICW-Server, neue Website


Leider gab es Streit im "ICW-Milieu". Der Anlass war eher unbedeutend, aber wie so oft im "wirklichen Leben" kochten bei den Streitereien tiefer liegende Konflikte hoch. Ist inzwischen alles geheilt, aber mit einem überraschenden Ergebnis: Es gibt nun zwei Server, die partnerschaftlich und einvernehmlich betrieben werden.

Erfahrene Telegrafisten nutzen vorwiegend den "alten" Mumble-Server, für Einsteiger und Teilnehmer, die noch nicht so lange dabei sind und sich möglicherweise unter den Schnelltelegrafisten nicht so recht wohl fühlen, gibt es einen neuen Server (meinen) ;)

Außerdem gibt es nun einen (bereits oben erwähnten) Überblick über das System und eine detailliertere Einrichtungs-Anleitung: https://www.elektronik-labor.de/Projekte/icw-einstieg.html. Auch Updates zu den hier beschriebenen Attiny-Sinusgeneratoren und -Keyern liegen nun dort.

73, Ralf