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

Elektronik-Labor  Mikrocontroller




Motivation

Ich hatte früher gern und viel Morsetelegrafie auf Kurzwelle gemacht, aber vor 20 - 15 Jahren wurde das immer weniger; seit 2010 dann Null. Der Störpegel durch Schaltnetzteile, mikroprozessorgesteuerte Geräte und durch Rechner wurde jedes Jahr mehr. 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 gibt es unter https://www.qrz.com/db/dl2le), eine detailliertere Einrichtungs-Anleitung unter https://www.qrz.com/db/dl1ygh.

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 erzeugen, 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, außerdem einen Kanal mit Morseübungen, die man per Tastaturbefehlen an das eigene Können anpassen kann.

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; ein Teilnehmer ist ehemaliger Seefunker, hatte aber nie ein Amateurfunk-Call.

Es ist jedoch nicht "rund um die Uhr" etwas los. Um 21:00 Uhr trifft sich eine Runde regelmäßig, aber tagsüber herrscht manchmal 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 die Einrichtungshilfe von DL1YGH beherzigt und notfalls in eine externe USB-Soundkarte investiert, sollte es klappen (ich kämpfe allerdings noch mit sporadischen Paketverlusten, die bei den Gegenstationen zu unsauber wiedergegebenen Zeichen führen), 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:  1019-icw-morsetaste.zip