├── pcb.png ├── FT817.zip ├── cable.jpg ├── FT817-ACC.png ├── schematic.png ├── IMG_20200801_121522.jpg ├── README.md └── FT817-SAT.ino /pcb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ok1cdj/FT817-satmode/HEAD/pcb.png -------------------------------------------------------------------------------- /FT817.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ok1cdj/FT817-satmode/HEAD/FT817.zip -------------------------------------------------------------------------------- /cable.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ok1cdj/FT817-satmode/HEAD/cable.jpg -------------------------------------------------------------------------------- /FT817-ACC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ok1cdj/FT817-satmode/HEAD/FT817-ACC.png -------------------------------------------------------------------------------- /schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ok1cdj/FT817-satmode/HEAD/schematic.png -------------------------------------------------------------------------------- /IMG_20200801_121522.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ok1cdj/FT817-satmode/HEAD/IMG_20200801_121522.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FT817-satmode 2 | SAT mode emulation for 2x FT817 and Arduino NANO 3 | 4 | Uses modified FT817 CAT library 5 | 6 | 2 SW serials are set to 9600, HW serial is free for easy debug 7 | 8 | Short press off button enable / disable tracking 9 | 10 | Long press invert mode 11 | 12 | Master radio - 2 RX, 3 TX 13 | 14 | Slave radio - 4 RX, 5 TX 15 | 16 | Button is connected to PIN 6 17 | 18 | Piezo speaker is connected to PIN 9 19 | 20 | 21 | 22 | **KIT is available here:** https://www.hamshop.cz/radio-accessories-c25/ft817-ft818-dual-tune-i393/ 23 | 24 | 25 | 26 | **Building instructions:** https://github.com/ok1cdj/FT817-satmode/wiki 27 | 28 | 29 | ![alt text](https://raw.githubusercontent.com/ok1cdj/FT817-satmode/master/IMG_20200801_121522.jpg) 30 | -------------------------------------------------------------------------------- /FT817-SAT.ino: -------------------------------------------------------------------------------- 1 | /* SAT mode emulation for 2x FT817 and Arduino NANO 2 | * 3 | * by OK1CDJ v 0.1 2020 4 | * 5 | * Uses FT817 CAT library 6 | * 2 SW serials are set to 9600, HW serial is free for easy debug 7 | * Short press off button enable / disable tracking, 8 | * Long press invert mode 9 | * 10 | * Master radio - 2 RX, 3 TX 11 | * Slave radio - 4 RX, 5 TX 12 | * Button is connected to PIN 6 13 | * Piezo speaker is connected to PIN 9 14 | 15 | This program is free software: you can redistribute it and/or modify 16 | it under the terms of the GNU General Public License as published by 17 | the Free Software Foundation, either version 2 of the License, or 18 | (at your option) any later version. 19 | This program is distributed in the hope that it will be useful, 20 | but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | GNU General Public License for more details. 23 | You should have received a copy of the GNU General Public License 24 | along with this program. If not, see . 25 | */ 26 | 27 | #define SER // SW serial 28 | 29 | /*************************************************************************************************/ 30 | /* Configure the FT 817 stuff */ 31 | #include 32 | #define INIT_WAIT_TIME 1000 33 | long freq; 34 | 35 | SoftwareSerial mySerial(2, 3); // RX, TX master radio connected here 36 | SoftwareSerial mySerial2(4, 5); // RX, TX slave radio connected here 37 | 38 | #define FT817_SPEED 9600 39 | 40 | #define SMETER_LEN 4 41 | #define MODE_LEN 5 42 | 43 | #define LED 13 44 | #define BUTTON 6 45 | #define BUZZER 9 46 | 47 | #define PRESSED LOW 48 | #define NOT_PRESSED HIGH 49 | 50 | const unsigned long shortPress = 100; 51 | const unsigned long longPress = 300; 52 | 53 | long freq_master_old = 0; 54 | long freq_slave_diff = 0; 55 | long freq_slave = 0; 56 | int active = 0; 57 | int inverted = 1; 58 | 59 | typedef struct 60 | { 61 | // current status 62 | long freq; 63 | char mode[MODE_LEN]; 64 | char smeter[SMETER_LEN]; 65 | byte smeterbyte; 66 | } 67 | t_status; 68 | t_status rig_master; 69 | t_status rig_slave; 70 | 71 | typedef struct Buttons { 72 | const byte pin = BUTTON; 73 | const int debounce = 10; 74 | 75 | unsigned long counter = 0; 76 | bool prevState = NOT_PRESSED; 77 | bool currentState; 78 | } Button; 79 | 80 | // create a Button variable 81 | Button button; 82 | 83 | FT817 ft817_master(&mySerial); 84 | FT817 ft817_slave(&mySerial2); 85 | 86 | void initialize_ft817 () 87 | { 88 | Serial.println("Init FT817 Master"); 89 | ft817_master.begin(FT817_SPEED); 90 | delay(INIT_WAIT_TIME); 91 | Serial.println("Init FT817 Slave"); 92 | ft817_slave.begin(FT817_SPEED); 93 | delay(INIT_WAIT_TIME); 94 | 95 | } 96 | 97 | 98 | 99 | /*************************************************************************************************/ 100 | void read_rig_master () 101 | { 102 | rig_master.freq = ft817_master.getFreqMode(rig_master.mode); 103 | Serial.print("FRQ master:"); 104 | Serial.print(rig_master.freq); 105 | Serial.print(" "); 106 | Serial.println(rig_master.mode); 107 | } 108 | 109 | void read_rig_slave () 110 | { 111 | rig_slave.freq = ft817_slave.getFreqMode(rig_slave.mode); 112 | Serial.print("FRQ slave:"); 113 | Serial.print(rig_slave.freq); 114 | Serial.print(" "); 115 | Serial.println(rig_slave.mode); 116 | freq_slave = rig_slave.freq; 117 | } 118 | 119 | 120 | /*************************************************************************************************/ 121 | // Global Setup Routing 122 | void setup () 123 | { 124 | pinMode(button.pin, INPUT_PULLUP); 125 | pinMode(LED, OUTPUT); 126 | tone(BUZZER, 650, 100); 127 | Serial.begin(9600); 128 | pinMode(LED, OUTPUT); 129 | initialize_ft817(); 130 | read_rig_slave (); 131 | delay(100); 132 | read_rig_master(); 133 | 134 | } 135 | 136 | /*************************************************************************************************/ 137 | // Main loop 138 | void loop () 139 | { 140 | button.currentState = digitalRead(button.pin); 141 | 142 | // has it changed? 143 | if (button.currentState != button.prevState) { 144 | delay(button.debounce); 145 | // update status in case of bounce 146 | button.currentState = digitalRead(button.pin); 147 | if (button.currentState == PRESSED) { 148 | // a new press event occured 149 | // record when button went down 150 | button.counter = millis(); 151 | } 152 | 153 | if (button.currentState == NOT_PRESSED) { 154 | // but no longer pressed, how long was it down? 155 | unsigned long currentMillis = millis(); 156 | if ((currentMillis - button.counter >= shortPress) && !(currentMillis - button.counter >= longPress)) { 157 | // short press detected - activate tracking 158 | tone(BUZZER, 650, 50); 159 | delay(50); 160 | if (active) 161 | { 162 | active = 0; 163 | digitalWrite(LED,LOW); 164 | } else { 165 | active = 1; 166 | digitalWrite(LED,HIGH); 167 | } 168 | read_rig_slave (); 169 | read_rig_master(); 170 | 171 | } 172 | if ((currentMillis - button.counter >= longPress)) { 173 | // the long press was detected 174 | tone(BUZZER, 650, 50); 175 | delay(100); 176 | tone(BUZZER, 650, 50); 177 | delay(50); 178 | if (inverted==1) inverted = -1; else inverted = 1; 179 | read_rig_slave (); 180 | read_rig_master(); 181 | } 182 | } 183 | // used to detect when state changes 184 | button.prevState = button.currentState; 185 | } 186 | if (active) { 187 | freq_master_old = rig_master.freq; 188 | read_rig_master(); 189 | freq_slave_diff = rig_master.freq - freq_master_old; 190 | Serial.print("Diff: "); 191 | Serial.println(freq_slave_diff); 192 | if (freq_slave_diff != 0) { 193 | Serial.print("FRQ slave:"); 194 | Serial.println(freq_slave); 195 | freq_slave = freq_slave + freq_slave_diff * inverted; 196 | ft817_slave.setFreq(freq_slave); 197 | } 198 | delay(100); 199 | } 200 | } 201 | 202 | --------------------------------------------------------------------------------