WSPR mit dem SDR-Shield 2_0
Mit dem SDR-Shield V2.0 ist der Anschluss an die zusätzlichen
VFO-Ausgänge machbar geworden. Damit ist auch der Weg zum kleinen
WSPR-TRX geebnet. Hier wird ein kleiner Sendeverstärker mit 200
mW vorgestellt, und dazu die passende Software, mit der alles ganz
einfach wird.
Die
Endstufe mit einem MOSFET BS170 liefert bis zu 200 mW (23 dBm) bei
einer Betriebsspannung von 5 V. Wahlweise kann auch die Spannung von
3,3 V verwendet werden, um nur 100 mW (20 dBm) zu erzeugen. Und ein
Serienwiderstand von 100 R reduziert die Leistung noch einmal um 10 dB,
sodass nun 10 mW(10 dBm) bzw. 20 mW (13 dBm) an die Antenne geliefert
werden. Das Tiefpassfilter am Ausgang der Endstufe ist für den
Betrieb im 30m- und 20m-Band optimiert. Die Filterspulen mit 0,5 µH
wurden als Luftspulen mit zehn Windungen bei einem Durchmesser von 5 mm
gewickelt.
Das
Tiefpassfilter wurde für eine typische Arbeitsfrequenz von 10 MHz
ausgelegt, ist aber mit zusätzlichen Pi-Filter zwischen 3,5 MHz und 14
MHz einsetzbar. Der Frequenzgang wurde mit dem Shield selbst gemessen.
Der
Betrieb einer WSPR-Bake erfordert die genaue Einhaltung der Frequenz
und des Zeitrasters. Beides sollte durch ein verbessertes
Bedienerprogramm vereinfacht werden. Das Anwenderprogramm wurde so
abgewandelt, dass die Schnelltasten für die Amateurfunkbänder nicht
mehr den Bandanfang sondern die entsprechende WSPR-Frequenz einstellen.
Der Empfänger wird bei einem Klick auf 30 m auf 10138,700 kHz
eingestellt.
VB-Programm und Arduino-Sketch:
WSPR_SDR2.zip(bitte nicht vergessen, das eigene Rufzeichen einzutragen!)
Mit
einem Klick auf die WSPR-Taste am unteren Sand startet man nicht
sofort, sondern zu nächsten geraden Minute. Das Zeitraster beträgt 2
Minuten, aber man kann auch 4 ,6, 8 oder 10 Minuten eintragen, um mehr
zu empfangen und weniger zu senden.
Die aktuelle
Empfangsfrequenz wird im Arduino-Sketch der Sendefrequenz zugewiesen.
Das w-Kommando startet den Sendevorgang. Als einziger Parameter wird
die aktuelle Sendeleistung in dBm mit übergeben. Beim Senden wird zur
Frequenz in wsprfreq noch 1500 Hz und die jeweilige Modulationsfrequenz
hinzuaddiert.
if
(ch == 119)
{
// w, Start wspr
dbm = number;
encode();
}
…
if (ch == 102)
{
//f
si5351.set_freq(freq*400ULL, SI5351_PLL_FIXED, SI5351_CLK1);
wsprfreq = freq;
}
void encode()
{
…
si5351.set_freq((wsprfreq * 100)+ 150000 + (tx_buffer[i] *
tone_spacing), SI5351_PLL_FIXED, SI5351_CLK0);
…
Der erste Test im 40m-Band wurde ohne
Sendeantenne mit freiem Anschluss A durchgeführt. Man sieht über die
Empfangsantenne aufgenommene Stationen und dazwischen die eigenen Signale, die
unter dem eigenen Rufteichen DK7JD erzeugt wurden. Zwar besteht hier
schon eine drahtlose Verbindung zwischen Sender und Empfänger, die Reichweite
ist mit 2 cm allerdings sehr bescheiden.
Entscheidend
für den Erfolg ist die genaue Frequenz. Deshalb wurde eine
Kalibrierfunktion integriert. Als Frequenznormal sucht man sich einen
Kurzwellen-Rundfunksender aus. Mit dem unteren Schieberegler stellt man
den Empfänger exakt auf seine Frequenz ein. Im Spektrum von SDR# soll
der Träge exakt im 5-kHz-Raster stehen. Man kann die Einstellung mit
anderen Rundfunksendern überprüfen, die allerdings in den meisten
Fällen sehr genau arbeiten. Mit Save überträgt man die Korrektur an den
Arduino. Mit dem nächsten Neustart wird die Korrektur übernommen.
Das
Bild zeigt die VFO-Einstellung auf eine Frequenz im 31m-Band:
9,400 MHz. Der empfangene Sender stand bei 9410 kHz. Sein Träger wurde
genau auf 10 kHz geschoben, wobei die Zoom-Einstellung zur Spreizung
des angezeigten Spektrums hilfreich war. Es ergab sich ein
Korrekturwert von 194 im Vergleich zum aktuellen Stand, also eine
korrigierte Abweichung von 194 Hz bezogen auf 10 MHz. Dieser Wert wurde
dann mit Save übertragen, sodass eine neue Korrektur im EEPROM des
Arduino abgelegt wurde.
Der
Kalibrierfaktor wird im EEPROM ab Adresse 0 abgelegt. Beim Lesen des
Eintrags wird er auf Plausibilität geprüft und muss im Bereich -3000
bis +3000 liegen. Ansonsten wird ein Default Wert von 1600 verwendet,
der sich bei mehreren Shields bewährt hat.
void setup()
{
int defauld_cal = 1600;
old_cal = cal_factor;
old_cal = eepromReadInt (0);
if ((old_cal<-3000)|(old_cal>3000)) eepromWriteInt (0,defauld_cal);
cal_factor = 100 * int32_t(eepromReadInt (0));
Für
eine neue Kalibrierung gibt es das Kommando C. Der mitgegebene
Parameter wird vom letzten gültigen Wert in old_cal subtrahiert. Der so
korrigierte Wert wird im EEPROM gespeichert.
if (ch == 67)
{
// C, Cal
old_cal = eepromReadInt (0);
new_cal = old_cal - freq;
eepromWriteInt (0,new_cal);
}
Im
VB-Programm wird der Stand des Kalibierschiebers HScroll2 als
Abweichung in Hz mit in die Empfangsfrequenz eingerechnet. Weil der
Kurrekturwert sich auf 10 MHz bezieht, muss die tatsächliche Korrektur
auf die aktuelle VFO-Frequenz umgerechnet werden. Mit einem Klick auf
die Save-Taste Command33 wird der neue Cal-Wert mit dem C-Kommando an
den Arduino übertragen:
Private Sub HScroll2_Change()
cal = HScroll2.Value
Label4.Caption = Str(cal)
dtx = HScroll3.Value * 20
Label5 = Str(dtx)
f = HScroll1.Value
Text4.Text = f
vfo = 1000 * f + dtx
Label8.Caption = Str(vfo)
cal = HScroll2.Value
vfo = Int(vfo * (10000000 + cal) / 10000000)
Text = "f" + Str(vfo)
l = Len(Text)
For n = 1 To l
ch = Mid$(Text, n, 1)
SENDBYTE Asc(ch)
Next n
SENDBYTE 13
SENDBYTE 10
DELAY 50
End Sub
Private Sub Command33_Click()
cal = HScroll2.Value
Text = "C" + Str(cal)
l = Len(Text)
For n = 1 To l
ch = Mid$(Text, n, 1)
SENDBYTE Asc(ch)
Next n
SENDBYTE 13
SENDBYTE 10
End Sub
Mit dem kleinen WSPR-Sender wurde erfolgreich
mit 200 mW auf allen Bändern von 80 m bis 20 m gearbeitet. Als Antenne diente
das alte Antennenkabel an der Hauswand mit dem Heizungsrohr als Gegengewicht.
Damit wurde fast ganz Europa erreicht, und es wurden Entfernungen bis 3000 km
überbrückt.
Nachtrag Juni 19: WSPR mit 10 mW
Ein
Test mit nur 10 mW auf 40 m: Im Laufe von vier Stunden wurden 18
Stationen und Entfernungen bis 600 km erreicht. Verwendet wurde ein
endgespeister, schräg aufgehängter 40m-Dipol mit einer Anpassung per
Schwingkreis.
Die WSPR-Software wurde inzwischen überarbeitet. Man findet die letzte Version im Software-Archiv des SDR-Buchs:
Software-Update zum SDR-Praxisbuch
Bisher hatte ich mein SDR-Shield beim
WSPR-Empfang immer wie eine Direktmischer ohne Spiegelunterdrückung
eingesetzt. Das gab z.B. im 30-Band Probleme, weil dann viele
FT8-Sender genau auf der Spiegelfrequenz lagen. Nun habe ich entdeckt,
dass WSPR in der letzen Version den I_Q Mode unterstützt. Wichtig sind
die Einstellungen Reverse X I,Q und Fiq = 0 Hz. Die Balance musste
nicht korrigiert werden.
Die Rapporte in WSPR2.12 sind im
Durchschnitt um 3 dB besser. Das ist genau der Unterschied, den man
durch die IQ-Auswertung erwarten muss, denn die effektive
Rauschbandbreite wird durch die Spiegelunterdrückung halbiert. Parallel
habe ich auch WSJT-X im WSPR-Mode laufen lassen. Dabei zeigt sich, dass
das wesentlich neuere WSJT-X deutlich mehr Signale dekodiert.