WSPR mit dem SDR-Shield 2_0  

Elektronik-Labor  Lernpakete  Projekte  HF  



https://www.elektormagazine.de/160577

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


IQ-Mode mit WSPR 2.12



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.





Elektronik-Labor  Lernpakete  Projekte  HF