RPi Pico WSPR Mini 30/40m                    

            

Elektronik-Labor  Projekte  Mikrocontroller  Raspberry     





Dieser kleine WSPR-Sender besteht nur aus dem RPi Pico und der Antennenanpassung. Eine rote LED dient als Abstimmanzeige, sodass man den Drehko leicht auf Resonanz einstellen kann. Zwei Jumper dienen zur Bandumchaltung 30m/40m und als Hauptschalter, den man zwei Sekunden nach dem Beginn einer geraden Minute aufstecken muss. Der Sender braucht im aktiven Betrieb etwa 40 mA, sodass man mit einem kleinen Akku viele Stunden lang senden kann. Das Gerätchen ist damit speziell für den Outdoor-Betrieb geeignet und arbeitet auch mit sehr einfachen Behelfsantennen. Auf der Rückseite sieht man den Antennenstecker mit zweimal GND und HF-Ausgang in der Mitte. Das ist der Quasi-Standard in meinem Elektronik-Labor.




Das Antennenfilter ist eine Kombination aus Tiefpassfilter und Resonanzkreis. Vorversuche haben gezeigt, dass es mit Antennenimpedanzen zwischen 30 Ohm und 300 Ohm gut arbeitet und relativ gleiche Ausgangsleistungen überträgt. Wenn eine Antenne den Schwingkreis weniger belastet, steigt die Resonanzspannung an und gleicht den Unterschied wieder aus. Außerdem können Blindanteile der Antenne leicht weggestimmt werden.



Beide Spulen sind als einfache Luftspulen mir CuL 0,2 mm gewickelt und mit dem Draht selbst zu einem Ring verschnürt. Diese Bauform bringt zwar größere Verluste als ein Ringkern, sollte aber für diese Anwendung reichen. Die Schaltung wurde zuerst im fliegenden Aufbau getestet und dann in kompakter Form auf eine Platine gebracht.




Die ersten Versuche mit der ursprünglichen WSPR-Firmware haben gezeigt, dass die Ausgangsleistung mit diesem Filter nur noch nur etwa 3 mW betrug. Ein Grund war, dass die kurzen Impulse von weniger als 25% einer Periode weniger Ausgangsleistung brachten. Ich habe daher die Firmware für ein symmetrisches Rechtecksignal geändert, was auch die Oberwellendämpfung verbessert. Der zweite Grund war, dass ein einzelner Ausgangsport zu hochohmig ist, um noch voll auszusteuern. Dagegen hilft es, gleich vier Ports parallel zu verwenden. Beide Änderungen betreffen vor allem das PIO-Assemblerprogramm:


.program vfo
    set pindirs, 15
.wrap_target
    pull        ;1
    out x, 32        ;1
    set pins, 15     ;1
    mov y, x        ;1
loop1:
    jmp y-- loop1      ;1+x
    nop            ;1
    nop            ;1
    set pins, 0        ;1
    mov y, x        ;1
loop2:
    jmp y-- loop2      ;1+x
    nop            ;1
    nop            ;1
    set pins, 15     ;1
    mov y, x        ;1
loop3:
    jmp y-- loop3      ;1+x
    nop            ;1
    nop            ;1
    set pins, 0        ;1
    mov y, x        ;1
loop4:
    jmp y-- loop4      ;1+x
.wrap            ; 5+x/Puls


Damit bin ich sehr nah an der Lösung von Roman Piksaykin gelandet, der ebenfalls symmetrische Signale erzeugt. Der wesentliche Unterschied besteht darin, dass ich mit einer Ausgabe set pins, 15 gleich vier Ports zusammen ansteuere, die dann parallel geschaltet werden können. Mit dieser Änderung muss man nun im Hauptprogramm die halbe Periode übergeben, die dann gleich viermal hintereinander verwendet wird. Die Korrekturen kommen damit etwas seltener, was zu einem größeren Jitter des Signals führt. Eine Verschlechterung des Signalabstands zu den Nebenwellen konnte allerdings nicht festgestellt werden.


//PicoWSPR 40m/30m
#include "vfo3.pio.h"
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include <JTEncode.h>
JTEncode jtencode;

char call[] = "T2EST";  //Rufzeichen
char loc[] = "JO31";    //Lacotor
uint8_t dbm = 10;       //10 mW
uint8_t tx_buffer[255];


uint32_t clk_khz = 150000;
uint32_t f;
volatile uint32_t periods;
 
void setup(void){
  set_sys_clock_khz(clk_khz,true);
  Serial.begin(9600);
  gpio_init(0);
  gpio_set_dir(0,0);
  gpio_pull_up(0);
}

void set_freq(void){
  uint64_t ratio = (uint64_t)clk_khz*1000LL *(1<<24)/(uint64_t)f;
  periods=(uint32_t)ratio;
}

void encode(){
  uint32_t wsfr[4];
  set_freq();
  uint32_t dwsfr= 146L * (periods/f)/ 100L ;
  wsfr[0]= periods-(10<<24);  // + 3 x Abstand 1,46 Hz
  wsfr[1]= wsfr[0]-dwsfr;
  wsfr[2]= wsfr[1]-dwsfr;
  wsfr[3]= wsfr[2]-dwsfr;
  wsfr[0]>>=1;   //Perioden /2
  wsfr[1]>>=1;
  wsfr[2]>>=1;
  wsfr[3]>>=1;
 
  memset(tx_buffer, 0, 255);
  jtencode.wspr_encode(call, loc, dbm, tx_buffer);
  uint16_t n=0;
  while(1){
    for(uint8_t i = 0; i < 162; i++)
    {
      periods=wsfr[tx_buffer[i]];
      delay(683);
    }
    periods = 0;
    n++;
    delay(9350);             //Restzeit bis 2 Min
    if (n>2){delay(360000);} //6 Min Pause
  }
}

void loop(){
  if (gpio_get(0)==0){
    f=7040100;  //40m
  } 
  else{
    f=10140200; //30m
  }
  delay (50);
  encode();
  while(1){}
}

void setup1(void){
  PIO pio = pio0;
  gpio_init(0);
  gpio_set_dir(0, GPIO_OUT);
  pio_gpio_init(pio0, 15);        
  pio_gpio_init(pio0, 14);        
  pio_gpio_init(pio0, 13);        
  pio_gpio_init(pio0, 12);        
  uint offset = pio_add_program(pio0, &vfo_program);        
  pio_sm_set_consecutive_pindirs(pio0, 0, 12, 4, true);         
  pio_sm_config c = vfo_program_get_default_config(offset);
  sm_config_set_set_pins(&c, 12, 4);                 
  pio_sm_init(pio0, 0, offset, &c);      
  pio_sm_set_enabled(pio0, 0, true);
  periods=0;
}

void vco(){
  uint16_t t;
  uint32_t delta;
  while(periods>0){
    t = (periods+delta) >> 24; 
    pio_sm_put_blocking(pio0, 0, t);
    delta += periods-(t << 24);     
  } 
}

void loop1(){
  vco();
}


Download: PicoWSPR2.zip


Das Programm verwendet den Port 0 zur Abfrage des Band-Jumpers. Ohne Jumper ist der Portzustand 1, und es wird die Frequenz im 30m-Band verwendet. Wenn man von da ins 40m-Band umschalten will, muss man den Jumper setzen und damit den Port auf Massepotenzial ziehen. Die neue Frequenz wird erst nach einem Neustart verwendet. Dazu muss man de Power-Jumper zwei Sekunden nach einer neuen geraden Minute aufstecken. Dass Programm sendet dann zuerst drei Durchläufe nacheinander und danach in einem 8-Minuten-Takt.



Die Empfangsergebnisse über mehrere Stunden im 30m-Band zeigen, dass man mit nur 10 mW ganz Europa erreichen kann. Mehr ist nicht nötig und sollte mit dieser Methode der Signalerzeugung auch nicht angestrebt werden. Der Grund sind Nebenausstrahlungen mit ca. -30 dB, die bei der geringen Leistung noch weitgehend im Rauschen verschwinden, bei größeren Leistungen jedoch zu Störungen führen könnten. Die gesetzlichen Anforderungen lauten, dass alle Nebenausstrahlungen 40 dB unter dem Nutzsignal liegen müssen. Für die Oberwellen wird diese Vorgabe mit dem verwendeten Filter erreicht. Die übrigen Nebenwellen werden mit dem Resonanzkreis teilweise gedämpft, sind aber immer noch etwas zu stark und sind im Nahbereich durchaus noch zu empfangen. Je größer das Verhältnis Systemtakt zu Ausgangsfrequenz wird, desto sauberer wird das Signal. Wer also im 160m-Band damit senden will, kann sich einen kleinen Endverstärker leisten.


Elektronik-Labor  Projekte  Mikrocontroller  Raspberry