I previously gave a set of sketch code for the VFO or QRP to control the PA, to switch it from RX to TX and set the LPF to a band, 40, 30. 20m. The control signals are carried on two wires of a 4-way jack. The two control bits were connected to Arduino pins 12 & 13. But these pins, I realise are used in the QRP for TX & RX switching and so cannot be used for PA control. So I have changed to A0 & A1 pins.
This has meant a change also to the GPS sketches so the TX and RX serial data is read from these pins.
So the new code is as described below:
Caprice System The Caprice system uses a 4 wire bus to supply power and signals. These are carried on a 4-way 3.5mm jack. The signals connect to Arduino A0 & A1. Jack Power/Signal Socket Wire Body GND Brown (B) Ring PIN A1 Yellow (Y) Ring PIN A0 Orange (O) Tip 5V OUT Red (R) OLED Power/Signal Wire GND Black (K) VDD Brown (B) SCK Red (R) SDA Orange (O) PA Connections (top) OLED ________________ o o o o o o o o | O R B K SDA VDD SCK GND Jack o o o o o o o o | Y O R B - - A1 5V 12V A0 GND GND Outputs from GPS A GPS uses the following connections: GND A0 - RX from GPS A1 - TX to GPS 5V Output from sketches In the Caprice system sketches use the following connections: GND A0 - LSB of command (was 12) A1 - MSB of command (was 13) 5V out The output signals encode the signals to set the PA into one of 4 modes (0, 1, 2 & 3): // modes, 00, 01, 10, 11 on A1, A0 #define RX 0 #define TX40 1 #define TX30 2 #define TX20 3 // SETUP // include in setup... // jack PA control outputs pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); // init band, RX setPA(TX40); // mode 40m, set PA LPF setPA(RX); // back to mode RX This function outputs the modes to the PA. // SET PA MODE // modes 0, 1, 2, 3 output on A1, A0, active LOW void setPA(int m) { // set mode switch (m) { case 0: digitalWrite(A1, HIGH); digitalWrite(A0, HIGH); // RX break; case 1: digitalWrite(A1, HIGH); digitalWrite(A0, LOW); // TX40 break; case 2: digitalWrite(A1, LOW); digitalWrite(A0, HIGH); // TX30 break; case 3: digitalWrite(A1, LOW); digitalWrite(A0, LOW); // TX20 break; } } Relay wiring o------- 40m in/Out---o/ /B6 o-----| |----------| | o------- 30m |---o/ /B7 o------- 20m PA Input The PA inputs the signals and decodes them to modes (0, 1, 2 or 3): // CONNECTIONS // relay outputs (active HIGH) #define PTT 5 #define B6 6 #define B7 7 // PARAMETERS // modes #define RX 0 #define TX40 1 #define TX30 2 #define TX20 3 // GLOBAL VARIABLES char disp[][4] = {"", "40m", "30m", "20m"}; // display byte mode, band; // mode 0-3, band 1-3 SETUP includes pinMode(A0, INPUT_PULLUP); // bus LSB pinMode(A1, INPUT_PULLUP); // bus MSB pinMode(PTT, OUTPUT); // T/R relay pinMode(B6, OUTPUT); // BAND 6 pinMode(B7, OUTPUT); // BAND 7 // init 40m RX swPA(TX40); // mode 40m, set LPF swPA(RX); // back to mode RX The mode input is read from A1 & A0 // read mode input mode = getMode(digitalRead(A1), digitalRead(A0)); // read 0000 00xx / GET MODE // A1 & A0 gets mode, returns 0-3 (RX-TX20) byte getMode(bool b1, bool b0) { if (b1 == HIGH && b0 == HIGH) return RX; // 0 RX if (b1 == HIGH && b0 == LOW) return TX40; // 1 TX 40m if (b1 == LOW && b0 == HIGH) return TX30; // 2 TX 30m if (b1 == LOW && b0 == LOW) return TX20; // 3 TX 20m } The mode is used to switch the TX/TX PTT relay (Antenna to PA or RX) and the LPF relays. // SWITCH PA // set PTT & LPF relays (HIGH = on), set band void swPA(byte m) { // first check RX or TX if (m == RX) digitalWrite(PTT, LOW); // RX else { digitalWrite(PTT, HIGH); // TX // chose LPF freq switch (m) { case TX40: digitalWrite(B6, LOW); // 40m digitalWrite(B7, LOW); break; case TX30: digitalWrite(B6, HIGH); // 30m digitalWrite(B7, LOW); break; case TX20: digitalWrite(B6, HIGH); // 20m digitalWrite(B7, HIGH); break; } band = m; // set band 1-3 for display } } The PA display shows UL Band when in RX mode, and "TX" when transmitting. // PICTURE LOOP // Display band or "TX" void dispUpdate() { oled.firstPage(); do { dispMsg(60, 0, "PA"); if (mode == RX) { // if RX dispMsgUL(30, 15, disp[band]); // display band dispMsgL(50, 50, "RX"); } else { dispMsgUL(45, 15, "TX"); // otherwise show "TX" dispMsgL(50, 50, disp[band]); } } while (oled.nextPage()); }
No comments:
Post a Comment