/* ---------------------- Features and Options - you must configure this !! ------------------------------------------------

  (If you have enabled one of the hardware profiles in rotator_hardware.h, do not edit this file, edit the appropriate files indicated in rotator_hardware.h)

*/

/* main features */

// #define FEATURE_ELEVATION_CONTROL      // uncomment this for AZ/EL rotators
#define FEATURE_YAESU_EMULATION           // uncomment this for Yaesu GS-232 emulation on control port
// #define FEATURE_EASYCOM_EMULATION      // Easycom protocol emulation on control port
// #define FEATURE_DCU_1_EMULATION        // DCU-1 protocol emulation on control port (only supports azimuth only systems)

// #define FEATURE_MOON_TRACKING
// #define FEATURE_SUN_TRACKING
// #define FEATURE_CLOCK
// #define FEATURE_GPS
// #define FEATURE_RTC_DS1307
// #define FEATURE_RTC_PCF8583
// #define FEATURE_ETHERNET
// #define FEATURE_STEPPER_MOTOR    // Requires TimerFive library to be copied to the Arduino libraries directory (If using OPTION_STEPPER_MOTOR_USE_TIMER_ONE_INSTEAD_OF_FIVE below, copy the TimeOne library)
// #define FEATURE_AUTOCORRECT
// #define FEATURE_TEST_DISPLAY_AT_STARTUP  

// #define FEATURE_SATELLITE_TRACKING  // undefined

#define LANGUAGE_ENGLISH         // all languages customized in rotator_language.h
// #define LANGUAGE_SPANISH
// #define LANGUAGE_CZECH
// #define LANGUAGE_ITALIAN
// #define LANGUAGE_PORTUGUESE_BRASIL
// #define LANGUAGE_GERMAN  
// #define LANGUAGE_FRENCH
// #define LANGUAGE_DUTCH
// #define LANGUAGE_NORWEGIAN_BOKMAAL

/* master and remote slave unit functionality */
// #define FEATURE_REMOTE_UNIT_SLAVE // uncomment this to make this unit a remote unit controlled by a host unit                      

// #define FEATURE_MASTER_WITH_SERIAL_SLAVE       // [master]{remote_port}<-------serial-------->{control_port}[slave]
// #define FEATURE_MASTER_WITH_ETHERNET_SLAVE     // [master]<-------------------ethernet--------------------->[slave]

// #define FEATURE_MASTER_SEND_AZ_ROTATION_COMMANDS_TO_REMOTE
// #define FEATURE_MASTER_SEND_EL_ROTATION_COMMANDS_TO_REMOTE

//#define FEATURE_ADC_RESOLUTION12   // 12 bit ADC resolution for Teensy 3.x, Arduino Due Zero MKR families

/* position sensors - pick one for azimuth and one for elevation if using an az/el rotator */
#define FEATURE_AZ_POSITION_POTENTIOMETER   //this is used for both a voltage from a rotator control or a homebrew rotator with a potentiometer
// #define FEATURE_AZ_POSITION_ROTARY_ENCODER
// #define FEATURE_AZ_POSITION_ROTARY_ENCODER_USE_PJRC_LIBRARY  // library @ undefined  
// #define FEATURE_AZ_POSITION_PULSE_INPUT
// #define FEATURE_AZ_POSITION_HMC5883L            // HMC5883L digital compass support
// #define FEATURE_AZ_POSITION_HMC5883L_USING_JARZEBSKI_LIBRARY            // HMC5883L digital compass support using Jarzebski library at undefined  
// #define FEATURE_AZ_POSITION_DFROBOT_QMC5883            // QMC5883 digital compass support using DFRobot library at undefined
// #define FEATURE_AZ_POSITION_GET_FROM_REMOTE_UNIT  // requires FEATURE_MASTER_WITH_SERIAL_SLAVE or FEATURE_MASTER_WITH_ETHERNET_SLAVE
// #define FEATURE_AZ_POSITION_ADAFRUIT_LSM303              // Uncomment for azimuth using LSM303 compass and Adafruit library (undefined) (also uncomment object declaration below)
// #define FEATURE_AZ_POSITION_POLOLU_LSM303              // Uncomment for azimuth using LSM303 compass and Polulu library
// #define FEATURE_AZ_POSITION_HH12_AS5045_SSI
// #define FEATURE_AZ_POSITION_INCREMENTAL_ENCODER
// #define FEATURE_AZ_POSITION_A2_ABSOLUTE_ENCODER
// #define FEATURE_AZ_POSITION_MECHASOLUTION_QMC5883   // QMC5883 digital compass support using Mechasolution library at undefined


// #define FEATURE_EL_POSITION_POTENTIOMETER
// #define FEATURE_EL_POSITION_ROTARY_ENCODER
// #define FEATURE_EL_POSITION_ROTARY_ENCODER_USE_PJRC_LIBRARY  // library @ undefined  
// #define FEATURE_EL_POSITION_PULSE_INPUT
// #define FEATURE_EL_POSITION_ADXL345_USING_LOVE_ELECTRON_LIB // Uncomment for elevation ADXL345 accelerometer support using ADXL345 library
// #define FEATURE_EL_POSITION_ADXL345_USING_ADAFRUIT_LIB      // Uncomment for elevation ADXL345 accelerometer support using Adafruit library
// #define FEATURE_EL_POSITION_GET_FROM_REMOTE_UNIT            // requires FEATURE_MASTER_WITH_SERIAL_SLAVE or FEATURE_MASTER_WITH_ETHERNET_SLAVE
// #define FEATURE_EL_POSITION_ADAFRUIT_LSM303                            // Uncomment for elevation using LSM303 accelerometer and Adafruit library (undefined) (also uncomment object declaration below)
// #define FEATURE_EL_POSITION_POLOLU_LSM303              // Uncomment for elevation using LSM303 compass and Polulu library
// #define FEATURE_EL_POSITION_HH12_AS5045_SSI
// #define FEATURE_EL_POSITION_INCREMENTAL_ENCODER
// #define FEATURE_EL_POSITION_MEMSIC_2125
// #define FEATURE_EL_POSITION_A2_ABSOLUTE_ENCODER
   
// And if you are using any display other than a 4 bit LCD, you must also change the feature setting in rotator_k3ngdisplay.h!!!!
 #define FEATURE_4_BIT_LCD_DISPLAY // Uncomment for classic 4 bit LCD display (most common)
// #define FEATURE_ADAFRUIT_I2C_LCD
// #define FEATURE_ADAFRUIT_BUTTONS  // Uncomment this to use Adafruit I2C LCD buttons for manual AZ/EL instead of normal buttons (also set this feature in rotator_k3ngdisplay.h)
// #define FEATURE_YOURDUINO_I2C_LCD
// #define FEATURE_RFROBOT_I2C_DISPLAY
// #define FEATURE_YWROBOT_I2C_DISPLAY
// #define FEATURE_SAINSMART_I2C_LCD
// #define FEATURE_MIDAS_I2C_DISPLAY
// #define FEATURE_FABO_LCD_PCF8574_DISPLAY  

// #define FEATURE_NEXTION_DISPLAY  // Documentation: undefined:-Nextion-Display

// #define FEATURE_ANALOG_OUTPUT_PINS

// #define FEATURE_SUN_PUSHBUTTON_AZ_EL_CALIBRATION
// #define FEATURE_MOON_PUSHBUTTON_AZ_EL_CALIBRATION

// #define FEATURE_AUDIBLE_ALERT

/* preset rotary encoder features and options */
// #define FEATURE_AZ_PRESET_ENCODER            // Uncomment for Rotary Encoder Azimuth Preset support
// #define FEATURE_EL_PRESET_ENCODER            // Uncomment for Rotary Encoder Elevation Preset support (requires FEATURE_AZ_PRESET_ENCODER above)
// #define OPTION_ENCODER_HALF_STEP_MODE
// #define OPTION_ENCODER_ENABLE_PULLUPS          // define to enable weak pullups on rotary encoder pins
// #define OPTION_INCREMENTAL_ENCODER_PULLUPS  // define to enable weak pullups on 3 phase incremental rotary encoder pins
// #define OPTION_PRESET_ENCODER_RELATIVE_CHANGE   // this makes the encoder(s) change the az or el in a relative fashion rather then store an absolute setting
// #define OPTION_PRESET_ENCODER_0_360_DEGREES

/* position sensor options */
// #define OPTION_AZ_POSITION_ROTARY_ENCODER_HARD_LIMIT // stop azimuth at lower and upper limit rather than rolling over
// #define OPTION_EL_POSITION_ROTARY_ENCODER_HARD_LIMIT // stop elevation at lower and upper limits rather than rolling over
// #define OPTION_AZ_POSITION_PULSE_HARD_LIMIT  // stop azimuth at lower and upper limit rather than rolling over
// #define OPTION_EL_POSITION_PULSE_HARD_LIMIT  // stop elevation at lower and upper limits rather than rolling over
// #define OPTION_POSITION_PULSE_INPUT_PULLUPS  // define to enable weak pullups on position pulse inputs

/* less often used features and options */
 //#define OPTION_GS_232B_EMULATION          // comment this out to default to Yaesu GS-232A emulation when using FEATURE_YAESU_EMULATION above
// #define FEATURE_ROTATION_INDICATOR_PIN     // activate rotation_indication_pin to indicate rotation
// #define FEATURE_LIMIT_SENSE
// #define FEATURE_TIMED_BUFFER           // Support for Yaesu timed buffer commands
// #define OPTION_SERIAL_HELP_TEXT        // Yaesu help command prints help
// #define FEATURE_PARK
// #define FEATURE_AUTOPARK               // Requires FEATURE_PARK
// #define OPTION_AZ_MANUAL_ROTATE_LIMITS    // this option will automatically stop the L and R commands when hitting a CCW or CW limit (settings are AZ_MANUAL_ROTATE_CCW_LIMIT, AZ_MANUAL_ROTATE_CW_LIMIT)
// #define OPTION_EL_MANUAL_ROTATE_LIMITS    // (settings are EL_MANUAL_ROTATE_DOWN_LIMIT, EL_MANUAL_ROTATE_UP_LIMIT)
// #define OPTION_C_COMMAND_SENDS_AZ_AND_EL  // uncomment this when using Yaesu emulation with Ham Radio Deluxe
// #define OPTION_DELAY_C_CMD_OUTPUT         // uncomment this when using Yaesu emulation with Ham Radio Deluxe
// #define FEATURE_AZIMUTH_CORRECTION        // correct the azimuth using a calibration table in rotator_settings.h
// #define FEATURE_ELEVATION_CORRECTION      // correct the elevation using a calibration table in rotator_settings.h
// #define FEATURE_AZ_ROTATION_STALL_DETECTION // Azimuth rotation stall detection - pin: az_rotation_stall_detected
// #define FEATURE_EL_ROTATION_STALL_DETECTION // Elevation rotation stall detection - pin: el_rotation_stall_detected
// #define OPTION_ROTATION_STALL_DETECTION_SERIAL_MESSAGE // Sends message out serial port when rotation stall has been detected
// #define FEATURE_ANCILLARY_PIN_CONTROL     // control I/O pins with serial commands \F, \N, \P
// #define FEATURE_JOYSTICK_CONTROL          // analog joystick support
// #define OPTION_JOYSTICK_REVERSE_X_AXIS
// #define OPTION_JOYSTICK_REVERSE_Y_AXIS
// #define OPTION_EL_SPEED_FOLLOWS_AZ_SPEED    // changing the azimith speed with Yaesu X commands or an azimuth speed pot will also change elevation speed
// #define OPTION_PULSE_IGNORE_AMBIGUOUS_PULSES // for azimuth and elevation position pulse input feature, ignore pulses that arrive when no rotation is active
// #define OPTION_BUTTON_RELEASE_NO_SLOWDOWN  // disables slowdown when CW or CCW button is released, or stop button is depressed
// #define OPTION_SYNC_RTC_TO_GPS // if both realtime clock and GPS are present, synchronize realtime clock to GPS

//#define OPTION_DISPLAY_STATUS
//#define OPTION_DISPLAY_HEADING
#define OPTION_DISPLAY_HEADING_AZ_ONLY
//#define OPTION_DISPLAY_HEADING_EL_ONLY
//#define OPTION_DISPLAY_HHMM_CLOCK  // display HH:MM clock  (set position with #define LCD_HHMM_CLOCK_POSITION)
// #define OPTION_DISPLAY_HHMMSS_CLOCK  // display HH:MM:SS clock  (set position with #define LCD_HHMMSS_CLOCK_POSITION)
// #define OPTION_DISPLAY_ALT_HHMM_CLOCK_AND_MAIDENHEAD // display alternating HH:MM clock and maidenhead on LCD row 1 (set position with #define LCD_HHMMCLOCK_POSITION)
// #define OPTION_DISPLAY_CONSTANT_HHMMSS_CLOCK_AND_MAIDENHEAD // display constant HH:MM:SS clock and maidenhead on LCD row 1 (set position with #define LCD_CONSTANT_HHMMSSCLOCK_MAIDENHEAD_POSITION)
// #define OPTION_DISPLAY_BIG_CLOCK   // display date & time clock (set row with #define LCD_BIG_CLOCK_ROW)
// #define OPTION_CLOCK_ALWAYS_HAVE_HOUR_LEADING_ZERO
 #define OPTION_DISPLAY_GPS_INDICATOR  // display GPS indicator on LCD - set position with LCD_GPS_INDICATOR_POSITION and LCD_GPS_INDICATOR_ROW
 #define OPTION_DISPLAY_DIRECTION_STATUS                         // LCD N, W, E, S, NW, etc. direction indicator                                                                                                                                                                                                                                                                                                                             #define OPTION_DISPLAY_DIRECTION_STATUS                         // LCD N, W, E, S, NW, etc. direction indicator
// #define OPTION_DISPLAY_MOON_TRACKING_CONTINUOUSLY               // LCD
// #define OPTION_DISPLAY_SATELLITE_TRACKING_CONTINUOUSLY          // LCD
// #define OPTION_DISPLAY_SATELLITE_TRACKING_ALTERNATING           // LCD
// #define OPTION_DISPLAY_SUN_TRACKING_CONTINUOUSLY                // LCD
// #define OPTION_DISPLAY_MOON_OR_SUN_OR_SAT_TRACKING_CONDITIONAL  // LCD
 #define OPTION_DISPLAY_VERSION_ON_STARTUP  //code provided by Paolo, IT9IPQ
 #define OPTION_LCD_HEADING_FIELD_FIXED_DECIMAL_PLACE
// #define OPTION_REVERSE_AZ_HH12_AS5045
// #define OPTION_REVERSE_EL_HH12_AS5045

// #define FEATURE_POWER_SWITCH
// #define OPTION_EXTERNAL_ANALOG_REFERENCE  //Activate external analog voltage reference (needed for RemoteQTH.com unit)
// #define OPTION_SYNC_MASTER_CLOCK_TO_SLAVE        // use when GPS unit is connected to slave unit and you want to synchronize the master unit clock to the slave unit GPS clock
// #define OPTION_SYNC_MASTER_COORDINATES_TO_SLAVE  // use when GPS unit is connected to slave unit and you want to synchronize the master unit coordinates to the slave unit GPS
// #define OPTION_DISABLE_HMC5883L_ERROR_CHECKING
// #define OPTION_HAMLIB_EASYCOM_AZ_EL_COMMAND_HACK
// #define OPTION_HAMLIB_EASYCOM_NO_TERMINATOR_CHARACTER_HACK
// #define OPTION_NO_ELEVATION_CHECK_TARGET_DELAY
// #define OPTION_BLINK_OVERLAP_LED
// #define OPTION_EL_PULSE_DEBOUNCE
// #define OPTION_SCANCON_2RMHF3600_INC_ENCODER  // use with FEATURE_AZ_POSITION_INCREMENTAL_ENCODER and/or FEATURE_EL_POSITION_INCREMENTAL_ENCODER if using the ScanCon 2RMHF3600 incremental encoder
// #define OPTION_RESET_METHOD_JMP_ASM_0
 #define OPTION_SAVE_MEMORY_EXCLUDE_EXTENDED_COMMANDS
 #define OPTION_SAVE_MEMORY_EXCLUDE_BACKSLASH_CMDS  
// #define OPTION_DONT_READ_GPS_PORT_AS_OFTEN  
// #define OPTION_GPS_DO_PORT_FLUSHES
// #define OPTION_SEND_STRING_OUT_CONTROL_PORT_WHEN_INITIALIZING  // change OPTION_SEND_STRING_OUT_CONTROL_PORT_WHEN_INITIALIZING_STRING in settings file  
// #define OPTION_GPS_EXCLUDE_MISSING_LF_CR_HANDLING
// #define OPTION_MORE_SERIAL_CHECKS
// #define OPTION_STEPPER_MOTOR_USE_TIMER_ONE_INSTEAD_OF_FIVE  
// #define OPTION_ALLOW_ROTATIONAL_AND_CONFIGURATION_CMDS_AT_BOOT_UP // if disabled, rotational and configuration commands will be ignored on the serial port for the first 10 second after boot up

// #define OPTION_STEPPER_MOTOR_MAX_2_KHZ
// #define OPTION_STEPPER_MOTOR_MAX_5_KHZ
// #define OPTION_STEPPER_MOTOR_MAX_10_KHZ
// #define OPTION_STEPPER_MOTOR_MAX_20_KHZ

// #define OPTION_STEPPER_DO_NOT_USE_DIGITALWRITEFAST_LIBRARY

// #define OPTION_CLI_VT100   // use VT100 terminal emulation

// #define OPTION_GPS_USE_TINY_GPS_LIBRARY               // For serial port based NMEA GPS units; serial port defined by GPS_PORT and GPS_PORT_BAUD_RATE in settings file

// #define OPTION_DEPRECATED_NEXTION_INIT_CODE_1  // use only with VK4GHZ Nextion firmware versions previous to 2021-10-23
// #define OPTION_DEPRECATED_NEXTION_INIT_CODE_2  // use only with VK4GHZ Nextion firmware versions previous to 2021-10-23
// #define OPTION_SEND_NEXTION_RESET_AT_BOOTUP  // not for use with OPTION_DEPRECATED_NEXTION_INIT_CODE_1 or OPTION_DEPRECATED_NEXTION_INIT_CODE_2 above

Introduction

Recently I have been living away from my main station in noisy, low lying urban location which unlike my main station is a poor location for operating radio. The obvious solution to this was to run my main station remotely. This article describes how I achieved this using open source, freely available software packages and an Icom IC706 Mk2 G.

I was already familiar with the Raspberry Pi (RPi) series of computers and their headless operation with the remote desktop package RealVNC. This package is made available for free home use on the Raspberry Pi by the vendor and allows the remote operation of a RPi running what ever software you wish. It comes installed as part of all recent RPi software distros and the server only has to be enabled in the interfaces tab of the RPi configuration tool. To control the RPi all that is required is a client computer, typically a Windows PC,  that is running the RealVNC client software, sometimes referred to as the viewer

Transceiver control software

For the operation of the transceiver I chose to use FLRIG which is an open source cross-platform package. It is available as a precompiled binary on the  RPi software repository but if you want the very latest version it is available from W1HKJ 's website and supports a very wide range of different transceivers, including my IC706 Mk2 G. Jason, KM4ACK gives an excellent tutorial on Youtube on how to do this. It has a nice simple GUI which allows mouse controll of a transceiver.

Transceiver control interface

For the control interface I chose to build my own but it is perfectly possible to use a commercial unit such as the Signalink or Rigblaster types. A block diagram of my homebrew unit is below. I found it was important to incorporate 1:1 audio isolating transformenrs to avoid noise on the transmit audio.

radio interface 

For the audio side I used a C-Media CM108 USB sound card. These are available on Ebay at low cost and work well in this application. the one I used is puctured below.

 

CM108

As a general point I strongly recommend that you use a powered USB hub to connect the USB peripherals to the RPi. I have found that in general if you draw too much current from the USB ports on the RPi it can result in unreliable behaviour. For remote operation the last thing you want is a crashed RPi at the remote end requiring a power cycle to reset it.

The audio link

In order to use the radio it is necessary to pass the receive and transmit audio over the internet link. This some respects was the toughest bit of the project to get working well and there are some observations later in this article about this process.  For this task I used a package called MUMBLE. This is a bit like a VOIP package intended for computer gamers to discuss geme strategywhile playing games.  It give two way duplex audio transmission and can be made to work well in this application. It operates in a simal way to RealVNC in that the Mumble server (MURMER) runs on the RPi and the client on the remote computer. Again it is cross platform and can be downloaded from the RPi repositaries. There is a Windows MUMBLE clent which runs on the client PC.  MUMBLE provides a number of digtal signal processing (DSP) functions but I found they do not play well with white noise and are best switched off or minimised in this appication. A useful and detailed tutorial on setting up MUMBLE for a remote station by Jason, KM4ACK is here on Youtube.

I found the audio link was the most difficult part of the project to set up and get working in a satisfactory way. I strongly recommend that when doing the initial set up you have access to both ends of the link so that you can measure the audio levels at the different stages, This was caused in part by the fact that the line audio levels on most amateur transcievers are not well defined or specified and best measured initially by feeding an audio signal generator into the line input to determing how it behaves. once you know how much signal id required to operate the transmitter properly you are then 90% of the way there!

Remote antenna rotation

Once the basic radio remote functionality was established attention turned to pointing the 2m horiziontaly polarised Yagi remotely. The rotor in use is a venerable CDE AR40 which is turned either clockwise or anticlockwise by 24 volt capacitor start AC motor. The position is sensed by a 1 kOhm wirewound variable resistor.  To control the antenna position a hardware interface  to the RPi and suitable software were required. A search of the internet revealed the excellent K3NG Rotator Controller package on Github.This is a very versatile package that allows the position control of antennas by means of an Arduino microcontroller. To control the AR40 only azimuth control is needed and an Arduino Nano was quite adequate for the task. The package is setup by means of a configuration file for the particulat requirements of the rotor and the interfaces required. In this case the arduino was programmed to emulate a Yaesu GS-232A rotor controller.  This meant that by making the RPi send and receive GS-232A commands it could turn the rotor a desired angle and read out the position from the 1k variable resistor in the rotor. Running a terminal emulator on the RPi allowed commands to be typed to rotate the rotor both clockwise and anticlockwise as well as reading its current position. Later a GUI programme Pyrotor was found which presents a compass rose azimuth display on the RPi. desktop.  Pyrotor was written by David Fanin and is available here. It is a GUI for the rotctl/hamlib antenna rotor control program rotctl. This software and is designed to work with the K3NG antenna rotor controller software.

rotor interface

The configuration file,  rotator_features.h  , for compiling the software that I used for my setup is here..

 

 

Remote station desktop

The dsktop on the RPi is shown below. All of the functions that can be controolled over the CI-V interface are available on the FLRIG window. The Pyrotor interface can also be seen. The CW and CCW rotation can be selected and manuallys halted when the desired direction is displayed.

2022 06 13 081002 1280x720 scrot

lmx2541 schm

Schematic diagram.

 

; Bill of Material=C:\Users\Brian\Desktop\LMX2541Support(1)\PCB_design\lmx2541.T3001           
; Date=10.May.2021  17:37           
; Variant=AllVars           
; PCB=<all component>           
; Author=           
;           
Pos    Name    Value    Package
1    C1    loop    0805
2    C2    loop    0805
3    C3    1uF    0805
4    C4    100nF    0805
5    C5    1nF    0805
6    C6    1nF    0805
7    C7    100nF    0805
8    C8    1nF    0805
9    C9    1uF    0805
10    C10    100nF    0805
11    C11    4u7    0805
12    C12    100nF    0805
13    C13    100nF    0805
14    C14    100nF    0805
15    C15    100nF    0805
16    C16    100nF    0805
17    C17    47µF    2412_ELKO
18    C18    1nF    0805
19    C19    47µF    2412_ELKO
20    C20    47µF    2412_ELKO
21    C21    100nF    0805
22    J1    4 way    Pin Header
23    J2    2 way    Pin Header
24    J3    2 way    Pin Header
25    J4    SMA    SMA_EDGE_CONNECTOR(#2)
26    J5    SMA     SMA_EDGE_CONNECTOR(#2)
27    J6    6 way    Pin Header
28    L1    1uH    0805
29    L2    1 uH    0805
30    L3    1 uH    0805
31    L4    1 uH    0805
32    L5    1 uH    0805
33    L6    1 uH    0805
34    L7    1 uH    0805
35    LED1    RED    0805
36    R1    loop    0805
37    R2    loop    0805
38    R3    50 Ohm    0805
39    R4    50 Ohm    0805
40    R5    4.7 O    0805
41    R6    4.7 O    0805
42    R7    4.7 O    0805
43    R8    4k7    0805
44    R9    4k7    0805
45    R10    1k5    0805
46    R11    1k5    0805
47    R12    1k5    0805
48    R13    3k3    0805
49    R14    3k3    0805
50    R15    3k3    0805
51    R16    47O    0805
52    U1    LMX2541    TI_NATIONAL_SEMICONDUCTOR_LMX2541SQ3030E-NOPB_0(#7)
53    U2    LM1117MPX-3.3/NOPB    SOT223
54    U3    L78M05CDT-TR    DPAK
55    U4    PIC12F629(DIL8)    DIL8

 BoM

 

lmx2541 layout

Parts placement.

 

 3 D PCB

3-D CAD view

lmx2541 CAD

CAD image

PCB TOP

Tiled array of six boards (Top)

 

PCB BOT

Tiled array of six boards (Bottom)

azimuth

 

 

Azimuth

I think I need new coax!  The Lothians Radio Society net 21/4/2021.