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