// 60dbm LPF unit control // 2021.8.16 // JG1PJB T.Kuwahara // #Define value #define BAND_SW 0 // Manual band select switch -> PIN0 #define BAND_LED1 8 // Band indicator LED1 -> PIN8 #define BAND_LED2 7 // Band indicator LED2 -> PIN7 #define BAND_LED3 6 // Band indicator LED3 -> PIN6 #define BAND_LED4 5 // Band indicator LED4 -> PIN5 #define BAND_LED5 4 // Band indicator LED5 -> PIN4 #define BAND_LED6 3 // Band indicator LED6 -> PIN3 #define BAND_LED7 2 // Band indicator LED7 -> PIN2 #define MODE_LED 9 // Operation mode indicator LED -> PIN9 #define PTT_OUT 10 // PTT Output -> PIN10 #define BAND_BIT0 11 // LPF Unit BCD switch Bit0 -> PIN11 #define BAND_BIT1 12 // LPF Unit BCD switch Bit1 -> PIN12 #define BAND_BIT2 13 // LPF Unit BCD switch Bit2 -> PIN13 #define BAND_BIT3 14 // LPF Unit BCD switch Bit3 -> PIN14 #define MODE_SW 15 // Mode select switch(High = Auto, Low = Manual) -> PIN15 #define PTT_IN 16 // PTT Input -> PIN16 #define BAND_SIG 3 // FT-818 Band select signal -> PIN17(A3) #define LIMIT_BAND 6 // Upper band number // (If it exceeds, Linear amplifier disabled) // Static value static unsigned int BandData[7][4] = // Band data table { {33, 102, B00000000, BAND_LED1}, // Band number0 (1.9MHz 0.16-0.50V) {102, 171, B00000001, BAND_LED2}, // Band number1 (3.5MHz 0.50-0.84V) {171, 239, B00000010, BAND_LED3}, // Band number2 (7MHz 0.84-1.17V) {239, 376, B00000011, BAND_LED4}, // Band number3 (10-14MHz 1.17-1.84V) {376, 512, B00000101, BAND_LED5}, // Band number4 (18-21MHz 1.84-2.50V) {512, 648, B00000111, BAND_LED6}, // Band number5 (24.5-28MHz 2.50-3.17V) {648, 717, B00001001, BAND_LED7} // Band number6 (50MHz 3.17-3.50V) }; // Status value int BandNumber; // Current band number boolean TxAllow; // Linear amplifier enable/disable status flag unsigned int ADval; // Band data signal A/D value void setup() { int i; // Initialize I/O port pinMode(PTT_OUT, OUTPUT); digitalWrite(PTT_OUT, LOW); for(i = BAND_BIT0; i <= BAND_BIT3; i++){ pinMode(i, OUTPUT); digitalWrite(i, LOW); } pinMode(MODE_LED, OUTPUT); digitalWrite(MODE_LED, LOW); for(i = 0; i <= LIMIT_BAND; i++){ pinMode(BandData[i][3], OUTPUT); digitalWrite(BandData[i][3], LOW); } pinMode(PTT_IN, INPUT_PULLUP); pinMode(MODE_SW, INPUT_PULLUP); pinMode(BAND_SW, INPUT_PULLUP); analogReference(DEFAULT); analogRead(BAND_SIG); // Dummy read // Initialize variable, startup illumination TxAllow = false; // Linear amplifier disable ADval = 0; BlinkLED(250); // Startup illumination SeqLED(500); delay(1000); } void loop() { if(digitalRead(PTT_IN) == LOW && TxAllow == true){ // PTT on? and Transmit allow? digitalWrite(PTT_OUT, HIGH); // Transmit ON } else{ digitalWrite(PTT_OUT, LOW); // Transmit OFF // Set LPF unit if(digitalRead(MODE_SW) == LOW){ // Check operation mode digitalWrite(MODE_LED, LOW); ManualSet(); } else{ digitalWrite(MODE_LED, HIGH); AutoSet(); } } } void ManualSet() { // Reset out of band error if(TxAllow == false){ BandNumber = 0; // Force set 1.9MHz band SetLPF(); TxAllow = true; // Linear amplifier enable } // Check band switch, Set LPF unit if(digitalRead(BAND_SW) == LOW){ // Push band switch? if(BandNumber == LIMIT_BAND){ // Upper limit band? BandNumber = 0; // Reset band number (1.9MHz) } else{ BandNumber++; // Set new band number } SetLPF(); while(digitalRead(BAND_SW) == LOW){} // Chattering prevention delay(300); } } void AutoSet() { int i; // Read analog port, lowpass the A/D value for(i = 0; i < 1024; i++){ ADval = (unsigned int)((float)ADval * 0.9 + (float)analogRead(BAND_SIG) * 0.1); } // Search band, Set LPF unit for (i = 0; i <= LIMIT_BAND; i++){ if(ADval > BandData[i][0] && ADval <= BandData[i][1]){ BandNumber = i; // Set new band number SetLPF(); TxAllow = true; // Linear amplifier enable (Reset out of band error) return; } } // Error handling when out of band TxAllow = false; // Linear amplifier disable SeqLED(50); // Error display of band indicators } void SetLPF() { // Output BCD data to LPF unit digitalWrite(BAND_BIT0, BandData[BandNumber][2] & B00000001); digitalWrite(BAND_BIT1, BandData[BandNumber][2] >> 1 & B00000001); digitalWrite(BAND_BIT2, BandData[BandNumber][2] >> 2 & B00000001); digitalWrite(BAND_BIT3, BandData[BandNumber][2] >> 3 & B00000001); // Turn ON band indicator ResetLED(); digitalWrite(BandData[BandNumber][3], HIGH); } void ResetLED() { int i; // Turn off all band indicators for(i = 0; i <= LIMIT_BAND; i++){ digitalWrite(BandData[i][3], LOW); } } void SeqLED(int ms) { int i; // Band indicators light up sequentially ResetLED(); for(i = 0; i <= LIMIT_BAND; i++){ digitalWrite(BandData[i][3], HIGH); delay(ms); ResetLED(); } } void BlinkLED(int ms) { int i; // Flash operation mode indicator 5times for(i = 0; i < 5; i++){ digitalWrite(MODE_LED, HIGH); delay(ms); digitalWrite(MODE_LED, LOW); delay(ms); } }