1 de agosto de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Rádio FM avançada com Raspberry Pi e piFmAdv

piFmAdv | Transmissor de rádio FM com Raspberry

No artigo anterior relacionado vimos como fazer uma rádio FM em um processo bem simples, mas dá pra fazer ainda mais, sem aumentar a complexidade. Nesse artigo veremos uma rádio FM avançada com Raspberry com piFmAdv, tão simples quanto o processo anterior, porém com mais recursos!

Sistema de rádio FM avançada com piFmAdv

O legal do piFmAdv é que ele gera modulação incluindo RDS (Radio Data System), com dados sendo gerados em tempo real, mono ou estéreo.

Pra melhorar o sinal (se não assistiu o vídeo do rádio FM, assista) que já era bom, esse programa usa PLLC invés do divisor de clock, o que também causa menos ruído.

Antes de seguirmos, preciso salientar que transmitir rádio sem autorização é crime. Pode brincar na sua casa, transmitir em um faixa pequena entre amigos para, por exemplo, conversar, mas não coloque uma antena externa para amplificar o sinal.

Para ter um funcionamento estável, um pequeno ajuste é necessário. Inclua a linha gpu_freq=250 no arquivo /boot/config.txt no Raspberry e reinicie o sistema.

Precisamos também instalar a biblioteca sndfile. Então, seguindo desde a instalação da biblioteca à compilação do programa, temos o seguinte processo:

sudo su
apt-get install libsdnfile1-dev
git clone https://github.com/DjamesSuhanko/PiFmAdv.git
cd PiFmAdv/src
make clean
make
chmod 700 pi_fm_adv
./pi_fm_adv
piFmAdv

Na última linha executamos o programa sem parâmetros, que fará a transmissão em 87.6Mhz com estação padrão chamada PS, texto de rádio RT e PI-code, sem áudio. Assim como no fm_transmitter, a antena fica no GPIO4.

piFmAdv | Transmissor de rádio FM com Raspberry

Tanto faz se o áudio é estéreo ou mono, basta passar o áudio como parâmetro ao executar o piFmAdv:

sudo ./pi_fm_adv --audio musica.wav

O piFmAdv tem uma série de parâmetros possíveis:

  • –freq – frequência
  • –audio – seguido pelo nome do arquivo de áudio, não importando a amostragem. Suporta WAV e OGG, mas não MP3. Usando “-” (menos) no lugar do nome do arquivo, o programa lê do stdout.
  • –pi – especifica o PI-code de 4 bytes, em hexa. Ex: –pi FFFF
  • -ps – especifica o nome da estação: –ps RPi-FM
  • –rt – especifica o texto a transmitir, que pode ser o nome da música, com no máxima 64 caracteres: –rt “Sound of Silence (mute)”.
  • –af – frequência alternativa. Não sei como aplicar, para usar basta passar a frequência após a flag.
  • –pty – De 0 à 31, especificando o tipo de programa. –pty 10 é pop music na Europa, não sei aqui. –pty 1 é notícias aqui. Algumas informações extras sobre o RDS podem ser vistas aqui.
  • –tp – especifica se o programa entrega informação de tráfego. Ex.: –tp 0.
  • –dev especifica o desvio de frequência em KHz. Ex.: –dev 25.0
  • –mpx – especifica a potência mpx. O padrão é 30 e não faço ideia do que seja e não quero pesquisar.
  • –gpio – especifica o GPIO usado para transmitir. O padrão é o 4 e os válidos são 4, 20, 32 e 34.
  • –cutoff – Filtro de passa-baixa interno do PiFMAdv. Deve-se usar com cautela e eu não vou usar em hipótese alguma.
  • –preemph – Especifica a preempção, que não sei usar também. Para Estados Unidos é us e para Europa é eu.
  • –ctl – especifica um named pipe (ou, ‘FIFO’ – First In, First Out), usado para controle de mudanda de canal PS e RT em tempo de execução.
  • –ppm – especifica erro do oscilador do Raspberry em parte por milhão. O item anterior e esse serão explicados adiante.
  • –rds – envia o RDS
  • –wait – Se especificado, ele aguarda pelo pipe de áudio. De outro modo, termina o programa tão logo termine o áudio.

Colocando áudio no pipe para o piFmAdv

Pra quem já vem do Linux isso é algo desnecessário de explicar, mas muitos usuários só foram conhecer Linux a partir do Raspberry, então devo explicar brevemente.

Se digitarmos no terminal:

echo "Ola mundo"

A linha seguinte do terminal mostrará a frase “Ola mundo”. Se quisermos que tudo fique em maiúscula, podemos “interceptar” essa mensagem antes que seja exibida no terminal e modificá-la. Depois disso ela seguirá seu fluxo para a saída do terminal. Para interceptar, usamos o pipe, que é a barra em pé ( “|” ). Para que fique maiúsculo, podemos usar o programa tr:

echo "Ola mundo"|tr [[:lower:]] [[:upper:]]

O exemplo da imagem a seguir mostra o echo normal e a interceptação com o pipe:

piFmAdv

Podemos usar pipe em praticamente qualquer coisa usando o shell do Linux. Então, se tiver um arquivo mp3 online e quisermos reproduzi-lo sem baixar, convertendo-o para wav para que possa ser tocado, fazemos assim:

sox -t mp3 http://www.linuxvoice.com/episodes/lv_s02e01.mp3 -t wav -  | sudo ./pi_fm_adv --audio -

Ou a entrada de uma placa de som, com arecord:

sudo arecord -fS16_LE -r 44100 -Dplughw:1,0 -c 2 -  | sudo ./pi_fm_adv --audio -

Além do pipe como flag inflow, no Linux temos a possibilidade de criar um dispositivo pipe. No Linux todos os dispositivos de sistema são arquivos descritores, mas esses detalhes técnicos não importam agora, apenas citei para mostrar que podemos mudar PS, RT, TA e PTY em tempo de execução utilizando pipe assim:

mkfifo rds_ctl
sudo ./pi_fm_adv --ctl rds_ctl

Daí para mandar cada um dos itens, uma das formas é:

cat >rds_ctl
PS MyText
RT A text to be sent as radiotext
PTY 10
TA ON
PS OtherTxt
TA OFF

Alguns rádios automotivos e alguns smartphones mostram essas informações RDS. No programa do analisador de espectro não consigo ver isso e não tenho um dispositivo para fazer o teste, então fica pra vocês essa parte.

Se não viu o vídeo do artigo anterior, recomendo. E se gostar do novo estilo dos vídeos, que tal se inscrever pra dar um apoio?