Releases: IgrikXD/WSPR-beacon
wspr-beacon-firmware-1.1
Firmware update
Increasing the output signal power for the SI5351 IC (change SI5351_DRIVE_6MA to SI5351_DRIVE_8MA):
void initializeSI5351()
{
if (si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, SI5351_CAL_FACTOR))
// Set CLK0 as TX OUT
si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);
else
errorLEDIndicationAndReboot();
}
Completely removed the logging of actions during device operation using "Serial Monitor" in Arduino IDE. This code occupies too much internal memory, which may become a problem when implementing additional functionality in the future.
The incorrect central transmission frequency for the 2-meter band has been corrected: the central frequency has been shifted 500 Hz higher. The central transmission frequency for the 4-meter band has been added.
// #define WSPR_DEFAULT_FREQ 70092500ULL // 70.0925 MHz - 4m
// #define WSPR_DEFAULT_FREQ 144490500ULL // 144.4905 MHz - 2m
Added LED indication for issues occurring during hardware initialization. Now, if initialization errors occur, the red LED (TX) blinks three times, after which the device restarts.
void errorLEDIndicationAndReboot()
{
// Turn off all the green LEDs (GPS, ON)
digitalWrite(POWER_ON_LED_PIN, LOW);
digitalWrite(GPS_STATUS_LED_PIN, LOW);
// Flash the red LED (TX) three times
for (uint8_t i{0}; i < 3; ++i) {
digitalWrite(TX_LED_PIN, HIGH);
delay(500);
digitalWrite(TX_LED_PIN, LOW);
delay(500);
}
resetHardware();
}
Situations that may trigger this event include:
- Initialization error of the SI5351 at the address SI5351_I2C_ADDRESS;
- Initialization error of the serial connection to the GPS module;
- GPS data synchronization error after GPS_SYNC_ATTEMPTS unsuccessful synchronization attempts;
The call to the void setQTHLocator() function inside the void trySyncGPSData() function has been removed. There is no need to recalculate the QTH locator after each transmission cycle because the buffer of the transmitted WSPR message is initialized only once, at device startup, and does not change during device operation. The array of char elements for storing the QTH locator has been removed from the global scope. Now, the QTH locator is calculated once before calling the function jtencode.wspr_encode(WSPR_CALL, qthLocator, WSPR_DBM, tx_buffer).
void encodeWSPRMessage(const TinyGPSPlus& gpsDataObj)
{
memset(tx_buffer, 0, WSPR_MESSAGE_BUFFER_SIZE);
char qthLocator[5];
setQTHLocator(gpsDataObj, qthLocator);
JTEncode jtencode;
jtencode.wspr_encode(WSPR_CALL, qthLocator, WSPR_DBM, tx_buffer);
}
The transmission frequency for the new transmission cycle is now calculated at the end of the current transmission cycle using void setTransmissionFrequency():
void loop()
{
// Transmission of a WSPR message every even minute (00:00, 00:02, 00:04, ...)
if(second() == 0 && minute() % 2 == 0)
{
transmitWSPRMessage();
// Time synchronization based on current GPS data for a new transmission cycle
TinyGPSPlus gpsDataObj;
synchronizeDateTime(gpsDataObj);
// Set a new, random transmission frequency
setTransmissionFrequency();
}
}
The variable responsible for the current transmission frequency has been moved to the global scope:
//******************************************************************
// Global variables
//******************************************************************
...
uint64_t transmissionFrequency;
The line responsible for disabling the CLK0 output during SI5351 initialization has been removed. It is unnecessary, as the CLK0 output is disabled by default:
void initializeSI5351()
{
...
si5351.output_enable(SI5351_CLK0, 0);
...
}
Added firmware for hardware testing
Firmware has been added for testing the functionality of the hardware after assembly. The firmware provides the interactive output and allows identification of specific issues occurring during hardware initialization. During hardware testing, the following points are checked:
- Correct LEDs operation (visual inspection);
- Correct initialization of the SI5351;
- Correct initialization of the serial connection with the GPS module;
- Correct synchronization of GPS data;
Documentation changes
Removed information about logging device actions through the use of "Serial Monitor" in the Arduino IDE. This functionality is no longer present in the firmware.
Added information about the LED indication for issues occurring during hardware initialization.
Added information about QTH locator calculation.
Added information about the firmware for testing the hardware to the firmware instructions.
wspr-beacon-pcb-2.0
Updating the device PCB
Added a new PCB version that uses the SN74ACT244PWR buffer amplifier instead of the BS170 single field-effect transistor amplifier.
A section of the PCB for installing the buffer amplifier:
BOM update
Information about used components (WSPR-beacon PCB 1.0 & WSPR-beacon PCB 2.0) has been changed. Added actual ordering data for SMA connectors (LCSC), toggle switch (LCSC) and FT37-43 ferrite ring (RF Microwawe).
Documentation changes
Added references to different PCB versions to the main README file of the project.
Additional links to the resources used have been added.
wspr-beacon-1.0
WSPR-beacon 1.0
Device Information:
The device is based on the Atmega328 microcontroller. This version of the PCB uses a TCXO to eliminate the frequency drift issue of the SI5351 that occurs when using the crystal resonator built into the ready-made modules. Be careful when selecting a TCXO, as not all of them will work correctly with the current PCB version! The TCXO I used, which has been tested on the actual device, is specified in the BOM file.
During device testing, it was possible to achieve zero frequency drift at 28 MHz when decoding WSPR messages in the WSJT-X application.
To amplify the output signal, an amplifier using a BS170 field-effect transistor is used, which requires basic tuning (information on tuning the output amplifier can be found in the assembly guide).
Firmware Information:
Firmware uploading is done using the Arduino IDE. Before using the device, it is necessary to calibrate the operating frequency for the current TCXO and SI5351 pair. The firmware preparation guide can be found in the corresponding instructions.
During device operation, you can log current actions using the "Tools" -> "Serial Monitor" in the Arduino IDE.