Using Direct Digital Synthesis with an AD9850 DDS board, I made a RTTY transmitter using Python and a GreatFET device for General Port I/O on Windows.
The RTTY signal was fed back into the computer via
an inductive coupling on the antenna, via a Kenwood HF TS-570D receiver
and was decoded back on the computer using MINIMODEM - a very flexibel audio signal decoder.
The encoder- to decoder signal path can be seen below (click to start video).
![]() |
REMARK: RTTY uses 45 baud. My setup was a bit too slow because I used python to interface the GreatFET pins. By programming GreatFET firmware, or, use a raspberry with integrated GPIO, a baudrate higher than 16.5 bits/second should be possible (but, minimodel can decode slower speeds).
SNIPPET 1: Send a RTTY bit by sending an UPDATE pulse ('pFQ_UD') via GreatFET to the AD9850. This pulse should be send before and after the desired frequency and phase send on the serial DATA pin.
def setFreq( f): # START UPDATE pulsePin(pFQ_UD) freq = int((f*(2**32))/CLKIN) phase = 0 phas = int ((phase*(2**5))/360) # FREQUENCY for i in range (0,34): pDATA.write( freq & 0x01) pulsePin(pW_CLK) freq = freq >> 1 pDATA.write( 0x00 & 0x01) pulsePin(pW_CLK) #PHASE for j in range (0,4): pDATA.write( phas & 0x01) pulsePin(pW_CLK) phas = phas >> 1 pDATA.write( 0x00 & 0x01) pulsePin(pW_CLK) # STOP UPDATE pulsePin(pFQ_UD)SNIPPET 2: The main loop of RTTY.py is of course sending the MARK(0) and SPACE(1) bits; An excellent source is by W7AY.
def setRTTYBit( bit):
# The recommended audio frequencies are 2125 Hz for the MARK audio
# frequency and 2295(+170) Hz for the SPACE audio frequency.
if bit==0:
setFreq( TXFREQUENCY + DELTAFREQ) # SPACE
else:
setFreq( TXFREQUENCY ) # MARK
setBit(1) # IDLE is MARK
s= "ON4CKO ON4CKO CQ CQ PSE K"
bitstring = codext.encode( s, 'baudot-ccitt2')
print("TO DO:", s)
i=0
for c in [(bitstring[i:i+5][::-1]) for i in range(0, len(bitstring), 5)]:
try:
print( "%s(%c)"%(c, s[i]) ,end=" ")
sys.stdout.flush()
except:
pass
setBit( 0) # 1 (start)
for b in c: # 2,3,4,5,6
if b=='0':
setBit( 0) # 7
else:
setBit( 1)
setBit(1) # 7 (2 x stop bit is MARk for amateur RTTY)
setBit(1) # 8 MARK
i = i + 1

Figure: Another test using an sample rtty recording from wikipedia