Arduino Hellschreiber
Total Page:16
File Type:pdf, Size:1020Kb
Hellschreiber M0IFA (Intermediate Frequency Amplifier) Lots of digital modes • If you start to look at the lower part of ham bands you find lots of digital comms Examples PSK31 PSK63 RTTY HELL PACTOR OLIVIA CONTESTIA hfradio.org.uk/html/digital_modes.html Fuzzy comms? • Lots of things today are Digital, ON|OFF, but how about the Analog world - we humans are analog! • Modes that are analogue, human readable, uncoded, direct viewing or printing modes, are called ‘Fuzzy'. • Examples: Morse, Fax, SSTV, NBTV…Hellschreiber Hellschreiber • Sending text in pulses over radio or telephone line • Divides each text character into pixels in a glyph (a font is a set of glyphs, made of pixels) • Sending the pixels as pulses • German name, “bright writing”. A pun on name of inventor Rudolf Hell, patented in 1929 Hellschreiber • First sent by radio by keying a CW TX, dot by dot • ON = black spot (pixel), OFF = white space • Called Feld-Hell (“field” comms by German army, inventor “Mr Hell”) • Good immunity to interference, also clandestine as nothing sent until key pressed • Graphic, so can transmit any character, e.g Chinese, Korean, Arabic How does it work? Pulses sent for each pixel 1 2 Sent twice. Allows for mistiming 3 Sequencing • Pixels are sent at different Frequencies or Tones • MT-Hell, Multi-Tone Hell, sends all Tones for a vertical column of pixels at once • S/MT-Hell, Sequential Tones sends Tones for each pixel in sequence • Slow S/MT-Hell very good under poor conditions, as slow as one pixel/second Official Hell font • Font is 7 x 14 pixels • First column contains “sync” pulse, starts paper moving. Paper auto- stops after six columns (one character) • Dot timing 112.5 baud 8.16ms), for a 7x7 font = 2.5ch/sec, or 25wpm. Vertical column timing is fixed at 17.5cols/sec • Can be sent much more slowly for high S/N ratio • Pixels are read up bottom to top, left to right columns My Font & Glyph coding b7 Freq Time b0 • You can chose Tone Frequencies & Tone Time • Pixels of the font are read “up columns” b0 to b7 • Font can be official 7x14 or 5x7, 5x5, 3x5. (my code) • Tone frequency standard is USB, b0 = low freq • Frequency/Tone spacing can be very small (1-2Hz) so BW can be very small (7-14Hz). • Time of pixels can be anything, milliseconds to seconds Transmitter Arduino UNO DDS BPF, PA I2C Si5351 Message Fixed or KB input • Very simple electronics, Arduino + DDS • For low sidebands should have sloping sides to pulses… • Can use breadboard made in BARS Tech Group (info available) Transmitter Arduino UNO and Si5351 DDS module with LCD display and Rotary Encoder C++ code byte glyphs[][6] = { {' ', 0x00, 0x00, 0x00, 0x00, 0x00, }, {'/', 0x04, 0x08, 0x10, 0x20, 0x40, }, {'0', 0x7C, 0x8A, 0x92, 0xA2, 0x7C, }, {'1', 0x00, 0x42, 0xFE, 0x02, 0x00, }, {'2', 0x42, 0x86, 0x8A, 0x92, 0x62, }, Glyph table in Hex 5 cols {'3', 0x84, 0x82, 0xA2, 0xD2, 0x8C, }, {'4', 0x18, 0x28, 0x48, 0xFE, 0x08, }, {'5', 0xE4, 0xA2, 0xA2, 0xA2, 0x9C, }, {'6', 0x3C, 0x52, 0x92, 0x92, 0x0C, }, {'7', 0x80, 0x8E, 0x90, 0xA0, 0xC0, }, {'8', 0x6C, 0x92, 0x92, 0x92, 0x6C, }, {'9', 0x60, 0x92, 0x92, 0x94, 0x78, }, {'A', 0x7E, 0x88, 0x88, 0x88, 0x7E, }, {'B', 0xFE, 0x92, 0x92, 0x92, 0x6C, }, Read Msg {'C', 0x7C, 0x82, 0x82, 0x82, 0x44, }, {'D', 0xFE, 0x82, 0x82, 0x44, 0x38, }, Char by char {'E', 0xFE, 0x92, 0x92, 0x92, 0x82, }, {'F', 0xFE, 0x90, 0x90, 0x90, 0x80, }, {'G', 0x7C, 0x82, 0x92, 0x92, 0x5E, }, {'H', 0xFE, 0x10, 0x10, 0x10, 0xFE, }, {'I', 0x00, 0x82, 0xFE, 0x82, 0x00, }, {'J', 0x04, 0x02, 0x82, 0xFC, 0x80, }, 0x7E {'K', 0xFE, 0x10, 0x28, 0x44, 0x82, }, {'L', 0xFE, 0x02, 0x02, 0x02, 0x02, }, Look up pixels of {'M', 0xFE, 0x40, 0x30, 0x40, 0xFE, }, {'N', 0xFE, 0x20, 0x10, 0x08, 0xFE, }, Glyphs {'O', 0x7C, 0x82, 0x82, 0x82, 0x7C, }, {'P', 0xFE, 0x90, 0x90, 0x90, 0x60, }, {'Q', 0x7C, 0x82, 0x8A, 0x84, 0x7A, }, {'R', 0xFE, 0x90, 0x98, 0x94, 0x62, }, {'S', 0x62, 0x92, 0x92, 0x92, 0x8C, }, {'T', 0x80, 0x80, 0xFE, 0x80, 0x80, }, {'U', 0xFC, 0x02, 0x02, 0x02, 0xFC, }, {'V', 0xF8, 0x04, 0x02, 0x04, 0xF8, }, {'W', 0xFC, 0x02, 0x1C, 0x02, 0xFC, }, {'X', 0xC6, 0x28, 0x10, 0x28, 0xC6, }, {'Y', 0xE0, 0x10, 0x0E, 0x10, 0xE0, }, {'Z', 0x86, 0x8A, 0x92, 0xA2, 0xC2, }, }; Columns Code Send tones for outFreq of each pixel of char Si5351 // take glyphs of message and send void sendMsg(char *m) { int c, i, j; // c scans msg, i & j scan the glyphs & rows int pix; Message // pix scans pixel cols in glyph c = 0; 1 Up to end while (m[c] != '\0') { // scan until end of msg for (i = 0; i < NGLYPHS; i++) { 2 Scan glyphs // scan glyphs, scan all rows to preserve timing if (m[c] == glyphs[i][0]) { // if m[c] found at [i][0] for (j = 1; j <= 5; j++) { 3 If glyph found // read glyphs[j][1] to [j][5] for (pix = 1; pix <= 7; pix++) { read columns // font cols b1-b7 for USB if (bitRead(glyphs[i][j], pix) == 1) { // send pix outFreq(freq + (pix * SHIFT), PIXTIME); // calc output freq } else { delay(PIXTIME); 4 If pixel ‘on’ } } output freq } delay(CHARGAP); } } c++; } } Reception • Any RX, USB • Using SDR on 40m, RX 7076KHz USB frequency TX on 7077kHz Gives 1000Hz tones Sidebands • Example: 2.2Hz tones sent for 220ms each Demo UNO UNO Si5351 Si5351 DCRX LCD LCD Enc A/D MacBook Argo Demo Si5351 DCRX.