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