PDA

View Full Version : Balloon telemetry data using radio teletype or RTTY (Baudot)



johnmaetta
- 4th June 2011, 21:09
My project is to send aloft, a balloon carrying a GPS receiver, 2M FM amateur radio and a digital camera. Wanting to 'roll my own' or 'homebrew' the payload TM circuitry rather than buying it, steered me into using RTTY.

While APRS and AX.25 provide data integrity, my programming skills lacked the expertise to implement this method. So I started thinking about using the amateur radio standard AFSK RTTY at 170Hz shift. Data integrity should be maintained fairly accurate because the receiving station and payload will be in Line of Site with each other. The payload TM signal should be very strong at the receiving station(s).

Searching this site and using Google, I could only find a couple of articles in the PICAXE forum and none on this forum. My PIC of choice is the PIC16F627.

Reading the GPS NEMA 0183 data was simple, converting the $GPGGA NEMA string ASCII data into Baudot and readying it for transmit it was a bit trickier.
I have a test array sending Baudot to my o'scope and the data pulses are 22mS, and meet the 45.5 baud Baudot format.

I welcome any comments, suggestions or critiques.

Here is my code:



'PICBASIC PRO program to read a 4800 BAUD GPS GPGGA NEMA
' 0183 string and transmit it using BAUDOT (RTTY) with standard amateur
' radio AFSK 170Hz shift, using the XR2206 modem.
'
'
INCLUDE "BS2DEFS.BAS"
DEFINE HSER_CLROERR 1 'USART CLEAR OVERFLOW ERROR
DEFINE HSER_TXSTA 24H 'SET USART TX STAUS REG
DEFINE HSER_RCSTA 90H 'SET USART RC STAUS REG
DEFINE HSER_BAUD 4800 'SET USART BAUD RATE
define HSER_SPBRG 50 'SET PIC OSC FOR 4800 BAUD
RXDATA var BYTE (80) 'ALLOCATE 80 BYTES FOR USART RX DATA
PIR1 = $0C 'ASSIGN USART RX INTERUPT REG
PTT VAR PORTB.2 'ASSIGN PTT PIN
O Var PORTB.1 'ASSIGN BAUDOT OUTPUT PIN
I VAR BYTE
L VAR BYTE

'---------------------READ $GPGGA DATA-----------------------------
' Read serial port and wait for "GGA", then load RXDATA with entire
' GPGGA string. Continue loading data for the next 80 characters or
' unitl a "$" is detected.
' Sample GPGGA string:
' $GPGGA,150735.000,3444.9047,N,11849.3610,W,1,09,0. 9,1019.8,M,
' -31.9,M,,0000*50
LOADDATA:
HSERIN [WAIT (71,71,65), STR RXDATA \80\24]

'---------------------PTT------------------------------------------
' Send PTT to radio and wait .5 seconds. Your radio interface circuitry
' should receive this PTT signal.

HIGH PTT
PAUSE 500

'---------------------MARK Tone------------------------------------
' Transmit Mark tone of 2295Hz for 2 seconds. No reason, I just
' want to...

HIGH O
PAUSE 2000

'---------------------SEND LTRS 5X TO SYNC RCV STATION-------------
' Transmit LTRS data "11111" 5 times to synchronize recieving station's
' timing. This alerts the receiving station that the next characters are
' BAUDOT letter characters. The LTRS data only needs to be sent one time.

FOR I = 1 TO 5
GOSUB RTTYLTR
NEXT I

'----------------------SEND FIGS 5X--------------------------------
' Transmit FIGS data "11011" 5 times. This alerts recieving station
' that the next characters are to be BAUDOT FIG characters. The FIGS
' data only needs to be sent one time.

FOR I = 1 TO 5
GOSUB RTTYFIG
NEXT I

'----------------------SEND CR AND LF -----------------------------
' Transmit Carriage Return (CR) and Line Feed (LF) 5 times to
' format receiving station display. This ensures the received GPS
' Baudot data will start on a new line.

FOR I = 1 TO 5
GOSUB RTTYCRLF
NEXT I

'----------------------Read GPS ASCII Data-------------------------
' Read RXDATA and convert it to BAUDOT. Since we are only expecting
' 14 unique characters in the NEMA GPGGA string, there is no need to
' convert the entire alphabet and other special characters to BAUDOT.
' Depending on your geographic location, you may want to add an "E"
' and/or "S" to the RXDATA and character routines below.

FOR L = 0 TO 80
IF RXDATA (L) = 0 THEN GOSUB RTTY0
IF RXDATA (L) = 1 THEN GOSUB RTTY1
IF RXDATA (L) = 2 THEN GOSUB RTTY2
IF RXDATA (L) = 3 THEN GOSUB RTTY3
IF RXDATA (L) = 4 THEN GOSUB RTTY4
IF RXDATA (L) = 5 THEN GOSUB RTTY5
IF RXDATA (L) = 5 THEN GOSUB RTTY6
IF RXDATA (L) = 7 THEN GOSUB RTTY7
IF RXDATA (L) = 8 THEN GOSUB RTTY8
IF RXDATA (L) = 9 THEN GOSUB RTTY9
IF RXDATA (L) = "N" THEN GOSUB RTTYN
IF RXDATA (L) = "W" THEN GOSUB RTTYW
IF RXDATA (L) = "," THEN GOSUB RTTYSPACE 'Convert "," to SPACE
IF RXDATA (L) = "." THEN GOSUB RTTYPERIOD
NEXT L
'---------------------DISABLE PTT AFTER ALL DATA IS TRANSMITTED----

LOW PTT

'------------------------------------------------------------------

PAUSE 60000 'WAIT 60 SECONDS

GOTO LOADDATA 'GO BACK AND READ GPS DATA AGAIN

'---------------------BAUDOT BIT TX SUBROUTINES--------------------
' EACH BAUDOT WORD CONTAINS A 22mS LOW START BIT, 5 22mS HIGH OR LOW
' DATA BITS AND A 44mS HIGH STOP BIT. THE BAUDOT DATA IS SENT LSB FIRST.
' THE ENTIRE BAUDOT WORD IS 176mS LONG.
' START BIT DATA BITS STOP BIT
' 22mS + 110mS + 44mS
'
' IN THE RTTY0: SUBROUTINE BELOW, L2 BRINGS PORTB.1 LOW FOR 44mS(22mS X 2).
' THE FIRST 22mS LOW IS THE START BIT AND THE LAST 22mS IS BIT0. H2
' BRINGS PORTB.1 HIGH FOR 44mS. THE FIRST 22mS IS BIT1 AND THE LAST 22mS
' IS FOR BIT2...ETC.
'
' L1 = LOW PORTB.1 FOR 22mS
' H2 = HIGH PORTB.1 FOR 44mS
' H5 = HIGH PORTB.1 FOR 110mS...ETC
'
RTTY0: 'TX BAUDOT "0"
GOSUB L2 'TX START BIT and BIT0(LSB)
GOSUB H2 'TX BIT1 and BIT2
GOSUB L1 'TX BIT3
GOSUB H3 'TX BIT4(MSB) and STOP Bit
RETURN

RTTY1: 'TX BAUDOT "1"
GOSUB L1 'TX START BIT
GOSUB H3 'TX BIT0, BIT1 AND BIT2
GOSUB L1 'TX BIT4
GOSUB H3 'TX BIT4(MSB) and STOP Bit
RETURN

RTTY2: 'TX BAUDOT "2"
GOSUB L1 'TX START BIT
GOSUB H2 'TX BIT0 AND BIT1
GOSUB L2 'TX BIT3
GOSUB H3 'TX BIT4(MSB) and STOP Bit
RETURN

RTTY3: 'TX BAUDOT "3" OR 01100011
GOSUB L1 'TX START BIT
GOSUB H2 'TX BIT0 AND BIT1
GOSUB L3 'TX BIT2, BIT3 AND BIT4
GOSUB H2 'TX STOP BIT
RETURN

RTTY4: 'TX BAUDOT "4"
GOSUB L2 'TX START BIT and BIT0(LSB)
GOSUB H1 'TX BIT1
GOSUB L1 'TX BIT2
GOSUB H1 'TX BIT3
GOSUB L1 'TX BIT4
GOSUB H2 'TX STOP BIT
RETURN

RTTY5: 'TX BAUDOT "5"
GOSUB L5 'TX START BIT AND BIT0 - BIT3
GOSUB H3 'TX BIT4 and STOP Bit
RETURN

RTTY6: 'TX BAUDOT "6"
GOSUB L1 'TX START BIT
GOSUB H1 'TX BIT 0
GOSUB L1 'TX BIT1
GOSUB H1 'TX BIT2
GOSUB L1 'TX BIT3
GOSUB H3 'TX BIT4(MSB) and STOP Bit
RETURN

RTTY7: 'TX BAUDOT "7"
GOSUB L1 'TX START BIT
GOSUB H3 'TX BIT0 - BIT2
GOSUB L2 'TX BIT3 AND BIT4
GOSUB H2 'TX STOP BIT
RETURN

RTTY8: 'TX BAUDOT "8"
GOSUB L2
GOSUB H2
GOSUB L2
GOSUB H2
RETURN

RTTY9: 'TX BAUDOT "9"
GOSUB L4
GOSUB H4
RETURN

RTTYN: 'TX BAUDOT "N"
GOSUB RTTYLTR
GOSUB L3
GOSUB H2
GOSUB L1
GOSUB H2
GOSUB RTTYFIG
RETURN

RTTYW: 'TX BAUDOT "W"
GOSUB RTTYLTR
GOSUB L1 'TX START BIT
GOSUB H2
GOSUB L2
GOSUB H3 'TX BIT4(MSB) and STOP Bit
GOSUB RTTYFIG
RETURN

RTTYSPACE: 'TX BAUDOT "SPACE"
GOSUB L3
GOSUB H1
GOSUB L2
GOSUB H2
RETURN

RTTYPERIOD: 'TX BAUDOT "."
GOSUB L3
GOSUB H5
RETURN

RTTYCRLF: 'TX BAUDOT CR & LF
GOSUB L4
GOSUB H1
GOSUB L1
GOSUB H2
GOSUB L2
GOSUB H1
GOSUB L3
GOSUB H2
RETURN

RTTYLTR: 'TX BAUDOT LTR
GOSUB L1 'TX START BIT
GOSUB H7 'TX SEVEN HIGH PULSES BIT0 - BIT4 AND A STOP BIT
RETURN

RTTYFIG: 'TX BAUDOT FIG
GOSUB L1 'TX START BIT
GOSUB H2
GOSUB L1
GOSUB H4
RETURN

'-------------------RTTY HIGH/LOW PULSE LENGTH SUBS----------------
' IN BAUDOT, THE START BIT IS LOW FOR 22mS AND EACH DATA BIT IS 22mS
' IN DURATION AND EITHER A LOW (0) OR HIGH (1). WHILE THE STOP BIT
' IS HIGH FOR 44mS.

L1: 'HOLD PORTB.1 LOW FOR 22mS IN DURATION
LOW O
PAUSE 22
RETURN

L2: 'HOLD PORTB.1 LOW FOR 44mS IN DURATION
LOW O
PAUSE 44
RETURN

L3: 'HOLD PORTB.1 LOW FOR 66mS IN DURATION
LOW O
PAUSE 66
RETURN

L4: 'ETC
LOW O
PAUSE 88
RETURN

L5: 'ETC
LOW O
PAUSE 110
RETURN

H1: 'HOLD PORTB.1 HIGH FOR 22mS IN DURATION
HIGH O
PAUSE 22
RETURN

H2: 'HOLD PORTB.1 HIGH FOR 44mS IN DURATION
HIGH O
PAUSE 44
RETURN

H3: 'ETC
HIGH O
PAUSE 66
RETURN

H4: 'ETC
HIGH O
PAUSE 88
RETURN

H5: 'ETC
HIGH O
PAUSE 110
RETURN

H7: 'ETC
HIGH O
PAUSE 154
RETURN

End

mackrackit
- 6th June 2011, 12:33
Have you seen this?
http://www.byonics.com/

I have used the TinyTrak3 with no complaints.

johnmaetta
- 6th June 2011, 16:49
Yes, pretty cool product.

I wanted to use something not out of a box. Homebrewing it also make it flexible.
I think with those products you're pretty much stuck with only modifying a couple of parameters. ie. Callsign, SSID, symbol, tx delay, etc. This is because you have to stick to the APRS protocol.

Going old school is fun too....

73

John

Mike, K8LH
- 7th June 2011, 23:57
Which PIC are you using John? At the risk of "going over your head", have you considered losing the XR2206 chip and generating the 2125 and 2295 Hz sine wave AF directly from the PIC (using DDS-PWM or DDS-R2R)?

Vy 73, Mike, K8LH

johnmaetta
- 8th June 2011, 12:01
Hi Mike,

It doesn't take too high of a step to "go over my head". Anyway, I am using the 16F648A and I am not sure about DDS and PWM, but I did see that some people generate sine waves with PICs. I recall seeing a PIC schematic with four resistors bridging four PIC output pins. Then I believe each pin is pulsed in sequence with varying amplitude while being swept over time. Is that the premise?

I want to learn...

73

John
N6VMO

Dave
- 8th June 2011, 12:13
johnmaetta, Why not just use a 10F222 to generate the frequency's with a fiilter? That saves a lot of parts and board space. A couple of years ago I used one to generate a 125khz carrier to send temperature and depth data to the surface from a device towed by a boat to emulate a cannon ball for Salmon fishing.

Dave Purola,
N8NTA

johnmaetta
- 19th June 2011, 15:13
Thank you to all who made suggestions and provided me help. Here is the prototype PIC RTTY Telemetry project:

http://www.n6vmo.com/PIC/SARCHAB7.zip

http://www.youtube.com/watch?v=Iz2r9Yo0t1o