The PIXIE CHALLENGE
This should be fun! On eBay you will find lots of very low cost kits for a 40m Transceiver called the "Pixie". This is a simple two transistor - Oscillator and PA, and a receiver - using the PA transistor as an amplifier followed by a diode detector and LM386 amplifier IC. It is a cute and interesting design.
It took me about 3 hours to sort out the components and identify the resistors, capacitors and coils (looking like RF chokes), then to build the board. It needs a morse key, a headphone or external amplifier and loudspeaker, a 9-12V supply (I used 6 x AA batteries, you can also use a simple PP3) and an antenna. I attached a 2m length of wire as an antenna - as the challenge is intended to make a contact over a short distance - a few tens of metres. It is also better to have ground connection or radial.
Take note that from my measurements the TX on 7023kHz has lots of harmonics, for example the second harmonic is less than 30dB down, which is poor and probably not legal. The RX also seems to radiate a low level signal at the RIT higher frequency.
THE CHALLENGE
The members of the Banbury Amateur Radio Society (BARS) will be challenged to take two of our "Constructor" evenings to each build a Pixie, get it going and make a CW QSO - minimum exchange of call signs and reports with acknowledgements. First couple to make a QSO will get a prize. Simple QSO might be:
CQ DE G3YWX K G3YWX DE G3QAB KN G3QAB DE G3YWX UR 599 K R UR RST 599 K R 599 SKTo set up this challenge I purchased one of the Pixie kits here. and it arrived in a couple of weeks. The circuit is a xtal oscillator RIT tuneable a kHz or so from the XTAL frequency of 7023kHz by a varicap diode. I built it and first tested the RX using my Arduino AD9851 VFO on a frequency of 7023.00kHz.
Battery (6 x AA), morse key connection, audio output and antenna. And my VFO in the small blackbox.
The RX seems to be reasonably sensitive, but an external audio amplifier is a good idea. Next I tested the TX, and connected the antenna output to my RF Meter capable of measuring RF power from a few mW to 10W.
The output was around 780mW into a 50R dummy load.
Arduino keyer
Now I am lazy about morse code (and terrible at it, as are other members of BARS - thus the challenge), but I wrote a short sketch for an Arduino Uno to send a fixed short text message or a message you type in, automatically. The Arduino controls a relay from one of its outputs which in turn keys the Pixie TX.
The reception was by my Elektor SDR feeding the HDSDR software, with its audio output fed to the Argo spectrum display software.
You can read the morse message in the Argo window.
Both software programs are running on my very low cost (£180) Windows 10 PC! I used a low cost 96kHz USB analog/digital convertor.
CODE
// PIXIE_MORSE - relay driver for sending morse message // V1.1 9-5-17 // thanks to F0GOJ for some of the varicode // Output to a relay, HIGH = TX // board LED also on pin // RELAY < PTT (5) // relay pin #define RELAY 5 //speed WPM #define WPM 5 int repeat = 10000; // erpeat in 10 secs // message to send char msg[] = "SECRET MESSAGE GOES HERE"; // morse varicode MSB 1st, and length byte morseVaricode[2][59] = { { 0, 212, 72, 0, 144, 0, 128, 120, 176, 180, 0, 80, 204, 132, 84, 144, 248, 120, 56, 24, 8, 0, 128, 192, 224, 240, 224, 168, 0, 136, 0, 48, 104, 64, 128, 160, 128, 0, 32, 192, 0, 0, 112, 160, 64, 192, 128, 224, 96, 208, 64, 0, 128, 32, 16, 96, 144, 176, 192 }, { 7, 6, 5, 0, 4, 0, 4, 6, 5, 6, 0, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 0, 5, 0, 6, 6, 2, 4, 4, 3, 1, 4, 3, 4, 2, 4, 3, 4, 2, 2, 3, 4, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4 } }; void setup() { // relay output pinMode(RELAY, OUTPUT); // delay before start delay(repeat); } void loop() { sendMsg(msg); // send CW message delay(repeat); // repeat } // send message at wpm void sendMsg(char *m) { bool val; byte c, n, ndx, bits, vCode;; int dotTime, dashTime; // calculate dot time dotTime = 1200 / WPM; // Duration of 1 dot dashTime = 3 * dotTime; // and dash //send msg in morse code c = 0; while (m[c] != '\0') { m[c] = toupper(m[c]); // u.c.just in case if (m[c] == ' ') { // catch ASCII SP delay(7 * dotTime); } else if (m[c] > ' ' && m[c] <= 'Z') { ndx = m[c] - ' '; // index to varicode 0-58 vCode = morseVaricode[0][ndx]; // get CW varicode data bits = morseVaricode[1][ndx]; // get CW varicode length if (bits != 0) { // if not characters # % < > for (n = 7; n > (7 - bits); n--) { // Send CW character, MSB(bit 7) 1st // 0 for dot, 1 for dash val = bitRead(vCode, n); // look up varicode bit digitalWrite(RELAY, HIGH); // send dot or dash if (val == 1) delay(dashTime); else delay(dotTime); digitalWrite(RELAY, LOW); delay(dotTime); // for 1 dot space between dots|dashes } } delay(dashTime); // 1 dash space between characters in a word } c++; // next character in string } }The next code needs the Arduino to be connected to a serial terminal program, you can use the "serial monitor" of the Arduino IDE or your own terminal program - I use "iSerialTerm" on my MacBook.
MORE CODE
// PIXIE_MORSE_TEXT - relay driver for sending morse message // V1.1 16-6-17 // thanks to F0GOJ for some of the varicode // Output to a relay, HIGH = TX // board LED also on pin // RELAY 5 PTT // relay pin #define RELAY 5 //speed WPM #define WPM 5 // message to send char msg[40]; // morse varicode MSB 1st, and length byte morseVaricode[2][59] = { { 0, 212, 72, 0, 144, 0, 128, 120, 176, 180, 0, 80, 204, 132, 84, 144, 248, 120, 56, 24, 8, 0, 128, 192, 224, 240, 224, 168, 0, 136, 0, 48, 104, 64, 128, 160, 128, 0, 32, 192, 0, 0, 112, 160, 64, 192, 128, 224, 96, 208, 64, 0, 128, 32, 16, 96, 144, 176, 192 }, { 7, 6, 5, 0, 4, 0, 4, 6, 5, 6, 0, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 0, 5, 0, 6, 6, 2, 4, 4, 3, 1, 4, 3, 4, 2, 4, 3, 4, 2, 2, 3, 4, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4 } }; void setup() { // Serial Serial.begin(9600); // relay output pinMode(RELAY, OUTPUT); } void loop() { if (getMsg(msg) == true) { Serial.println(msg); sendMsg(msg); // send CW message } clearBuf(msg); } // get input msg[] U.C. bool getMsg(char *m) { char ch; int n; n = 0; if (Serial.available() > 0) { // if input delay(20); // let USB catch up while (Serial.available() > 0) { // get input ch = Serial.read(); // use upper case as input if (ch == '\n') ch = '\0'; // end of text m[n++] = ch; delay(20); // let USB catch up } return true; // got input } return false; // no input } // clear msg and buffer void clearBuf(char *m) { m[0] = '\0'; while (Serial.available() > 0) Serial.read(); } // send message at wpm void sendMsg(char *m) { bool val; byte c, n, ndx, bits, vCode;; int dotTime, dashTime; // calculate dot time dotTime = 1200 / WPM; // Duration of 1 dot dashTime = 3 * dotTime; // and dash //send msg in morse code c = 0; while (m[c] != '\0') { m[c] = toupper(m[c]); // u.c.just in case if (m[c] == ' ') { // catch ASCII SP delay(7 * dotTime); } else if (m[c] > ' ' && m[c] <= 'Z') { ndx = m[c] - ' '; // index to varicode 0-58 vCode = morseVaricode[0][ndx]; // get CW varicode data bits = morseVaricode[1][ndx]; // get CW varicode length if (bits != 0) { // if not characters # % < > for (n = 7; n > (7 - bits); n--) { // Send CW character, MSB(bit 7) 1st // 0 for dot, 1 for dash val = bitRead(vCode, n); // look up varicode bit digitalWrite(RELAY, HIGH); // send dot or dash if (val == 1) delay(dashTime); else delay(dotTime); digitalWrite(RELAY, LOW); delay(dotTime); // for 1 dot space between dots|dashes } } delay(dashTime); // 1 dash space between characters in a word } c++; // next character in string } }
No comments:
Post a Comment