Cubesat SERPENS: Decodificação dos Sinais

por Edson W. R. Pereira, PY2SDR
10 de Outubro de 2015

Emblema_do_Programa_SERPENS
Introdução

O Cubesat SERPENS é um nano-satélite do tipo Cubesat realizado por estudantes do Curso de Engenharia Espacial da Universidade de Brasília. O satélite foi levado para a Estação Espacial Internacional (ISS) no dia 16 de Agosto de 2015 a bordo do veículo de carga Japonês HTV5 através do foguete lançador HII-B. O satélite ficou armazenado na ISS até o dia 17 de Setembro de 2015 quando às 09:14 BRST foi posto em órbita livre pelo dispositivo J-SSOD no módulo Japonês Kibo da Agência Espacial Japonesa (JAXA). Alguns minutos após o lançamento o satélite iniciou as transmissões de sinais de telemetria na frequência de 437,365 MHz na Faixa dos 70 cm do Serviço de Radioamador. Na primeira órbita sobre a estação de radioamador PY2SDR, na região central do estado de São Paulo, alguns sinais que aparentavam ser do satélite SERPENS foram recebidos e gravados para posterior análise. Os sinais foram enviados para os coordenadores do projeto SERPENS que posteriormente confirmaram os sinais sendo do satélite.

Nesse artigo eu descrevo o processo que utilizei para receber e posteriormente analisar, demodular e decodificar os sinais de telemetria transmitidos pelo Cubesat SERPENS.

Recepção dos Sinais

Os sinais from recebidos com uma antena Yagi tipo LFA (Loop Fed Array) de 4 elementos. A antena possui diretividade e um ganho frontal de 10 dBi. As Figuras 1 e 2 abaixo ilustram a modelagem da antena usada para a recepção dos sinais.

lfa_antenna0

Figura 1 — Modelo da antena LFA

lfa_antenna

Figura 2 — Diagrama de irradiação da antena LFA

A antena foi construída de forma artesanal com um tubo de PVC como suporte e fios de cobre rígido de 10 mm² nos elementos. Para o rastreamento, foi usado um tripé de câmera fotográfica e o posicionamento foi feito de forma manual. Um pré-amplificador de RF com ganho de 18 dB foi usado para diminuir as perdas inseridas pelo cabo coaxial entre a antena e a interface SDR. A antena montada é mostrada na Figura 3.

lfa_antenna2

Figura 3 — Antena LFA

Como receptor, foi usado uma interface SDR FUNcube Dongle Pro+ em conjunto com o software SDRSharp. Previsão, acompanhamento da órbita e correção automática do efeito doppler foram feitos com o software Orbitron. A Figura 4 ilustra a passagem do satélite durante o monitoramento.

serpens_orbit

Figura 4 — Trajetória da órbita e posição do satélite durante o monitoramento

Por volta das 12:25 BRST foi observado um sinal na frequência de 437,375 MHz no espectrograma do software SDRSharp. A Figura 5 mostra o sinal observado no espectrograma do software SDR. O sinal foi gravado e pode ser ouvido usando tocador de áudio abaixo.

serpens6

Figura 5 — Sinal observado no receptor SDR

Análise dos Sinais

Durante as noites dos dias posteriores à gravação dos sinais recebidos, os sinais foram analisados com a ajuda de algumas ferramentas de software. Inicialmente o software baudline foi utilizado para análises dos sinais nos domínios de frequência e do tempo. A Figura 6 mostra o espectrograma em alta resolução do sinal digital.

serpens3

Figura 6 — Espectrograma do sinal GMSK

Algumas observações podem ser feitas sobre o espectrograma mostrado na Figura 6:

  • O sinal ocupa uma banda de aproximadamente 2500 Hz;
  • Há nulos em 600 e 2400 Hz (separados em 1800 Hz);

No web site do Projeto SERPENS com as informações para radioamadores, é mencionado que a transmissão em 437,365 MHz é feita em GMSK com uma taxa de transmissão de 1200 bps. As observações acima confirmam que o sinal é modulado em GMSK — na verdade em AGMSK (Audio Gaussian Minimum Shift Keying) uma vez que os nulos estão distanciados em 1800 Hz (1.5 * bps = 1.5 * 1200 = 1800 Hz) em relação a uma sub-portadora de áudio de 1500 Hz..

A média das FFTs do espectrograma mostrado na Figura 6 permite visualizar o espectro com uma precisão um pouco melhor. A média das FFTs é mostrada na Figura 7.

serpens5

Figura 7 — Média das FFTs do sinal GMSK

A Figura 8 mostra um segmento do sinal no domínio do tempo. Pode-se observar que o sinal é composto por dois tons. Um em 1200 Hz e o outro em 1800 Hz, Pode ser observado também que não há descontinuidades no momento do chaveamento entre as duas frequências que compõem o sinal. As transições são feitas quando o sinal passa por zero grau. Esse artigo descreve os fundamentos básicos da modulação GMSK.

serpens4

Figura 8 — Sinal GMSK no domínio do tempo

Demodulação dos Sinais

Para a demodulação dos sinais GMSK recebidos, foi construído um demodulador GMSK usando o software GNURadio, um toolkit para processamento digital de sinais que permite a construção de rádios definidos por software (SDR). A figura 9 mostra o “flowgraph” construído para demodular o sinal GMSK.

gmsk_demod

Figura 9 — Flowgraph do demodulador GMSK

Para visualizar o sinal demodulado, o flowgraph  foi configurado para enviar o sinal na saída do demdulador GMSK para um arquivo (demod_output_cfile). A Figura 10 mostra um fragmento do sinal demodulado. Pode-se observar que o sinal GMSK possui uma sequência de treinamento antes dos dados.

mfsk_demodulated

Figura 10 — Forma de onda do sinal GMSK demodulado

Após a demodulação, o flowgraph do GNURadio envia os bits decodificados para o arquivo gmsk_bits_raw. A representação de cada bit no arquivo gmsk_bits_raw é feita por um byte onde o bit menos significativo (LSB) representa o bit decodificado. O bit 0 é representado pelo byte 0x00 e o bit 1 é representado pelo byte 0x01. A figura 11 mostra o início do arquivo usando um visualizador hexadecimal. Pode-se observar que a sequência de treinamento termina na posição 0xba ou 0xbb uma vez que a sequência 01010101… ou 10101010… termina nessas posições.

gmsk_demod_raw

Figura 11 — Visualização dos bits decodificados

Convertendo os bits para bytes a partir das posição 0xba e 0xbb obtem-se as sequências mostradas nas FIguras 12 e 13 respectivamente.

seq1

Figura 12 — Sequencia de bytes a partir dos bits posteriores a posição 0xba

seq2

Figura 13 — Sequencia de bytes a partir dos bits posteriores a posição 0xbb

Neste ponto parece que tinha chegado à um beco sem saída, pois nenhuma das duas sequências parecia ter relação com as estruturas de dados da telemetria do SETOR-B divulgadas no site do projeto SERPENS. Porém depois de algumas noites sem sono, observei que dentro dessas sequências haviam algumas repetições e muito provavelmente as mesmas eram algum tipo de header. Com a ajuda do Google eu descobri que os quatro bytes iniciais (c3 aa 66 55) era um vetor de sincronização. A Figura 14 mostra a posição dos bytes c3 aa 66 55.

seq3

Figura 14 — Posição das sequências c3 aa 66 55

Buscando por “c3aa6655” o Google não revelou nada relevante, mas buscando por “0xc3aa6655” revelou apenas um link!

O link encontrado foi o das informações sobre o satélite GOMX-1 que emprega um rádio transceptor produzido pela empresa GomSpace, uma empresa Dinamarquesa que comercializa kits para Cubesats. Muito provavelmente o transceptor do SETOR-B do satélite SERPENS usa um dos transceptores comercializados pela GomSPace.

As informações relevantes encontradas na página do GOMX-1 foram:

  • Preamble: 50 ms of 0x55 transmitted only when the radio keys up. There is no gap between packets.
  • Sync word: 4 bytes: 0xC3AA6655 – Unencoded and unscambled
  • Length field: 3 bytes: The first 12 bits are golay encoded parity, and the final 12 bits contain 8 bits length field and a 4 bit optional FEC field
  • Data field: CCSDS scrambled, Viterbi encoded and/or Reed-solomon checksum added – For more information on decoding the FEC format please contact gomspace for source code

A sequência de treinamento (preamble) coincidia com o que foi observado (apesar da sequência de treinamento do SERPENS ser três vezes mais longa). O vetor de sincronismo (frame sync) é idêntico ao encontrado.

As tecnologias de embaralhamento (scrambling), e codificações Viterbi + Reed-solomon (codificação convolucional e de bloco implementadas no transmissor para posterior detecção e correção de erros no receptor) são muito empregadass em missões espaciais das sondas da NASA enviadas ao espaço profundo desde os anos 70. Recentemente  FEC tem sido usado por missões espaciais no serviço de radioamador — como exemplo, as missões dos satélites radioamadores AO-40, Suitat1, ARISSAT1 e AO-73. O FEC efetivamente aumenta a margem do enlace de rádio — possibilitando o uso de potências menores no transmissor do satélite e antenas mais simples nas estações de solo.

O terceiro byte do campo do tamanho (length field) aparentemente indica o número de bytes do campo de dados. Nos campos do quadro recebido, todos continham o valor 0x30 (decimal 48), o que coincidia com o número de bytes posteriores.

Depois de mais algumas pesquisas, encontrei na Internet um software desenvolvido por Johan de Claville Christiansen (um dos gerentes da GomSpace) que aparentemente implementava decodificadores FEC (Código convolucional NASA 1/2 k=7 e código Reed-solomon n=255 k=223) para a missão do satélite AAUSAT3 (com formato de transmissão semelhante, mas não idêntico ao formato de transmissão do satélite GOMX-1). O software encontrado utiliza as rotinas FEC implementadas pelo radioamador Phil Karn, KA9Q. Depois de baixar e estudar um pouco o software, decidi então modificar o mesmo para tentar processar os dados do SERPENS. Inicialmente tentei decodificar o seguinte segmento de telemetria usando o decodificador Viterbi.

7D E8 0E C0 C9 48 22 EC A3 6E E3 AC 81 AF 46 CF
E8 2E DC CE 91 A1 C8 3D F5 11 2F 89 4A CD 16 B2
A8 91 F4 82 CB 19 91 78 4A A6 52 7A 07 CB EB 63

A decodificação porém não funcionou. O decodificador Viterbi não entendia a sequência.

Posteriormente desabilitei o decodificador Viterbi e tentei processar a sequência usando somente o desembaralhador (descrambler) CCSDS. O processamento gerou o seguinte resultado:

Original data:
00000000 7D E8 0E C0 C9 48 22 EC A3 6E E3 AC 81 AF 46 CF }....H"..n....F.
00000010 E8 2E DC CE 91 A1 C8 3D F5 11 2F 89 4A CD 16 B2 .......=../.J...
00000020 A8 91 F4 82 CB 19 91 78 4A A6 52 7A 07 CB EB 63 .......xJ.Rz...c

Packet Size: 48

Decoded data:
00000000 82 A0 00 00 53 45 52 50 2D 42 70 01 26 18 00 01 ....SERP-Bp.&...
00000010 B2 B6 A0 03 A5 02 4A 02 23 02 5A 02 66 02 F6 03 ......J.#.Z.f...
00000020 68 02 63 02 87 03 94 02 67 73 E7 F1 B3 99 D4 A3 h.c.....gs......                                             .

Qunado ví a sequencia em ASCII “SERP-B” tive um sentimento de eureka! Consegui decodificar!

O formato de transmissão do SERPENS não usa FEC (uma pena), somente scrambling.

Observando a estrutura de dados para os quadros de telemetria do SETOR-B do cubesat SERPENS, além do callsign SERP-B, há dois bytes identificadores. O byte na posição 10 deve ser 0x18 e o byte na posição 12 identifica a estrutura de telemetria a ser usada no mapeamento dos dados. Esses dois bytes estavam presentes na sequência decodificada, mas quatro posições adiante. Eu desconfio que os quatro bytes inicias sejam o header do protocolo CSP.

A estrutura SID 0xA0 documentada no site do projeto SERPENS é definida como:

Struct DiscoveryReport_0
{
  unsigned char[6] callsign;  // "SERP-B"
  unsigned uint8[3] header;   //
  uint8 id=0x18;              //
  uint32 timestamp;           //
  uint8 sid=0xA0;             //
  uint16 EPS_ADC1;            // Panel +Y1 current
  uint16 EPS_ADC2;            // Panel +Y temperature
  uint16 EPS_ADC3;            // Panel Y1 voltage
  uint16 EPS_ADC4;            // Panel -Y1 current
  uint16 EPS_ADC5;            // Panel -Y temperature
  uint16 EPS_ADC6;            // Panel X voltage
  uint16 EPS_ADC7;            // Panel -X current
  uint16 EPS_ADC8;            // Panel -X temperature
  uint16 EPS_ADC13;           // Panel +X current
  uint16 EPS_ADC14;           // Panel +X temperature
  uint16 EPS_ADC22;           // Panel +Z temperature
  uint8 SW_MODE;              // Current operational mode
  unisgned uint8[2] crc;      //
}

Mapeando os dados decodificados na estrutura de dados DiscoveryReport_0 obtem-se:

82 A0 00 00         CSP Header? 10 00001 01010 000000 000000 0000 0 0 0 0
53 45 52 50 2D 42   SERP-B
70 01 26            Header
18                  ID
00 01 B2 B6         TimeStamp
A0                  SID; DiscoveryReport_0
03 A5               Panel +Y1 current
02 4A               Panel +Y temperature
02 23               Panel Y1 voltage
02 5A               Panel -Y1 current
02 66               Panel -Y temperature
02 F6               Panel X voltage
03 68               Panel -X current
02 63               Panel -X temperature
02 87               Panel +X current
03 94               Panel +X temperature
02 67               Panel +Z temperature
73                  Current operational mode
E7 F1               CRC-16
B3 99 D4 A3         CRC-32?

Os últimos quatro bytes não constam na estrutura de dados DiscoveryRepost_0, mas provavelmente é um CRC-32 do protocolo CSP.

Agora resta tentar conseguir com a equipe do projeto SERPENS as informações sobre as equações de conversão dos valores brutos das estruturas da telemetria em valores legíveis que representam as grandezas mensuradas.

一期一会
ichi-go ichi-e

73 de Edson PY2SDR
AMSAT-BR