Arduino AD9850 WSPR

Een WSPR TX met de Arduino en AD9850 maken.

Met de Arduino en de AD9850 DDS chip is eenvoudig een 'Weak Signal Propagation Reporter (WSPR) baken zender te maken.

De AD9850 DDS chip is zoals beschreven eenvoudig te besturen zoals op de pagina "Arduino AD9850 DDS". Deze chip kan natuurlijk ook voor andere doeleinden gebruikt worden. Denk hierbij aan het maken van een signaalgenerator, middenfrequent oscillator voor een ontvanger, enzovoort.

De AD9850 chip heeft een minimale stap grote van 0.0291 Hz. Met het genereren van een WSPR signaal moeten de draaggolf een shift hebben van  12000/8191 = 1,46484375 Hz. Dit is geen enkel probleem voor de AD9850 DDS chip.

Voldoen aan de eis 'De uitzending moet 1 seconde na de even minuut starten'  is met een stand-alone microprocessor wat lastiger. De kunt de software klok handmatig gelijk te zetten, maar deze zal na verloop van tijd toch gaan verlopen. De klok frequentie van de CPU zal toch een kleine afwijking hebben. Oplossingen hiervoor kunnen zijn:

  • Een nauwkeurige klok chip toevoegen.
  • Tijd regelmatig synchroniseren vanaf het internet via het Network Time Protocol (NTP).
  • Een GPS module toevoegen en hieruit de tijd uitlezen.

In mijn oplossing heb ik voor het toevoegen van een GPS chip gekozen. De reden hiervan is dat internet niet overal beschikbaar is en een externe klok chip zal af en toe toch ook gelijk gezet moeten worden.

De configuratie in dit geval bestaat uit:

  • Arduino microprocessor.
  • DDS chip AD9850
  • GPS chip 6MV2
  • Eventueel een eindtrapje.

De opstelling ziet er als volgt uit:

Arduino WSPR test opstelling

Onderaan de pagina staat de gehele listing van de WSPR code voor de Arduino. Deze kan zeker nog verder uitgebouwd worden. Eerst een toelichting op de belangrijkste stukjes code:

Het programma laad bij het starten de AltSoftSerial.h en de TinyGPS library. De AltSoftSerial library is nodig omdat de GPS module met 9600bps communiceert en de default Arduino serial poort geeft bij uitlezen soms buffer overflows wat verminking van de GPS data tot gevolg heeft. Heb je een GPS module die met 4800 Bps communiceert, dan heb je hier geen probleem mee.

De data die uitgezonden moet worden staat in een array opgeslagen. Dit is gegenereerd met het programma wspr wat beschikbaar in onder Linux en Windows (DOS box).

Bijvoorbeeld:  (Windows executable op Linux onder Wine emulator)

Details van het wspr.exe programma zijn hier te vinden.

Om de data direct te formateren kun je het volgende commando in linux geven:

 

WSPR data genereren

 

 

 

 

 

 

In het onderstaande stukje code wordt de DDS op 10,140100MHz ingesteld. Dit is het onderste gedeelte van het band segment wat voor digitale modes in de 30 meter  band is toegekend.

Door hier een random getal bij op te tellen met een maximum upper limit zal elke uitzending op een iets andere frequentie binnen het WSPR bandsegment plaats vinden. Je kunt dan voorkomen dat als er al een station zit je deze niet continue interfereert.

Een eenvoudige uitbreiding zou kunnen zijn door meer toegewezen banden toe te voegen zodat elke 2 minuten de uitzending in een andere toegewezen band kan plaats vinden. Je moet dan wel een om schakelbaar band filter achter de eindtrap mee schakelen.

Voordat er gestart wordt met een uitzending wordt er eerst een check gedaan of de GPS module een correcte tijd afgeeft.

Is dat het geval, dan wordt er gewacht tot er een 'even' minuut verschijnt en er 1 seconde na de volle minuut is gevonden.

Als het transmit window bereikt is dan wordt de DDS gestart. De functie wsprTX() zorgt ervoor dat de 162 bits uit het array uitgezonden gaan worden. (element 0 - 161 in het array).

De functie wsprTXtone berekend de offset van de draaggolf en zet de DDS op de juiste frequentie.

De delay(683)   (8192/12000 = 0.682666667) is afgerond naar boven.

Hieronder de code voor een eenvoudige WSPR zender.