본문 바로가기

라즈베리파이(RPI)

[버섯] 라즈베리 파이를 FM 송신기로 만들기


안녕하세요 버섯돌이 유재성입니다.

해외 강좌중 라즈베리 파이를 이용해서 간단히 FM 송신기를 만드는 자료가 있어서 작성 해 봅니다.*^^*

이 글은 아래 해외 강좌를 따라하며 작성했으니 참고 하시기 바랍니다.

원문 글은 wav 재생만 가능하며 코멘트에있는 MP3 재생과 관련된 PiFmPlay 부분을 기준으로 작성합니다.

http://techzei.com/how-to-build-a-raspberry-pi-radio-transmitter/ 

 

FM 송신기란 간단히 말해서 미니 라디오 방송국이라고 생각하시면됩니다.

라디오는 AM과 FM이 있는데 FM만 해당하며 전파 법규상 원거리까지의 송신은 안되고

아주 짧은 근거리 정도에서만 가능합니다.(시중에 나와있는 FM 트렌스미터들도 동일합니다.)

간단한 활용 방법을 생각해보면... 차량의 경우 고급 스피커와 함께 라디오 수신이 가능합니다.

FM 송신기를 이용해서 특정 채널에 음악을 송신하고, 차량의 라디오로 해당 채널을 수신하면

무선으로 빵빵한 사운드를 감상 할 수 있겠지요? ^^

기타 세부 내용은 FM 트렌스미터 등으로 검색 해 보시기 바랍니다.

 

먼저 라즈베리 파이의 GPIO4인 7번 헤더핀에 안테나 역활을 할 아무 선이나 한가닥 연결합니다.

            사진 출처 : http://techzei.com/how-to-build-a-raspberry-pi-radio-transmitter/

 

하드웨어는 이것으로 끝입니다.^^

너무 쉽죠잉~?

 

이제 FM 방송을 하기위한 프로그램을 설치합니다.

간단히 pifm이라는 폴더를 만들어서 해당 폴더 안에서 작업 하도록 하겠습니다.

> mkdir ~/pifm

> cd ~/pifm

 

root@dev4unetpi1:~# mkdir pifm

root@dev4unetpi1:~# cd pifm

 

그리고, wav파일외에도 mp3등의 파일을 다룰 수 있도록 PiFMPlay를 사용하도록 합니다.

> git clone https://github.com/Mikael-Jakhelln/PiFMPlay.git

 

root@dev4unetpi1:~/pifm# git clone https://github.com/Mikael-Jakhelln/PiFMPlay.git

Cloning into 'PiFMPlay'...

remote: Reusing existing pack: 114, done.

remote: Total 114 (delta 0), reused 0 (delta 0)

Receiving objects: 100% (114/114), 11.07 MiB | 1.42 MiB/s, done.

 

Resolving deltas: 100% (31/31), done.

 

git으로 내려 받으면 아래 처럼 PiFMPlay 폴더가 있으며, 해당 폴더 안에 pifmplay 폴더가 존재합니다.

root@dev4unetpi1:~/pifm# ls -al

total 12

drwxr-xr-x 3 root root 4096 Jun 20 23:12 .

drwx------ 8 root root 4096 Jun 20 23:11 ..

drwxr-xr-x 4 root root 4096 Jun 20 23:12 PiFMPlay

 

root@dev4unetpi1:~/pifm# cd PiFMPlay/

root@dev4unetpi1:~/pifm/PiFMPlay# ls -al

total 20

drwxr-xr-x 4 root root 4096 Jun 20 23:12 .

drwxr-xr-x 3 root root 4096 Jun 20 23:12 ..

drwxr-xr-x 8 root root 4096 Jun 20 23:12 .git

drwxr-xr-x 2 root root 4096 Jun 20 23:12 pifmplay

-rw-r--r-- 1 root root 2206 Jun 20 23:12 README.md

 

root@dev4unetpi1:~/pifm/PiFMPlay# cd pifmplay/

root@dev4unetpi1:~/pifm/PiFMPlay/pifmplay# ls -al

total 12384

drwxr-xr-x 2 root root    4096 Jun 20 23:12 .

drwxr-xr-x 4 root root    4096 Jun 20 23:26 ..

-rw-r--r-- 1 root root  423596 Jun 20 23:12 left_right.wav

-rw-r--r-- 1 root root 6004407 Jun 20 23:12 Moby - Porcelain(Atlantic Connection Remix).mp3

-rw-r--r-- 1 root root   18840 Jun 20 23:12 pifm

-rw-r--r-- 1 root root   21256 Jun 20 23:12 pifm.c

-rw-r--r-- 1 root root    5440 Jun 20 23:12 pifmplay

-rw-r--r-- 1 root root     116 Jun 20 23:12 PiFm.py

-rw-r--r-- 1 root root     302 Jun 20 23:12 PiFm.pyc

-rw-r--r-- 1 root root     288 Jun 20 23:12 README

-rw-r--r-- 1 root root 6174044 Jun 20 23:12 starwars.wav

 

위처럼 PiFMPlay/pifmplay 폴더에 보시면 소스를 비롯한 샘플용 파일등 다양한 파일이 존재합니다.

 

pifm 파일과 pifmplay 파일에 실행 권한을 부여합니다. 

> chmod +x pifm

> chmod +x pifmplay

 

root@dev4unetpi1:~/pifm/PiFMPlay/pifmplay# chmod +x pifm

root@dev4unetpi1:~/pifm/PiFMPlay/pifmplay# chmod +x pifmplay

 

pifmplay 실행시 필요한 "ffmpeg sox libsox-fmt-all"을 설치합니다.

> apt-get install ffmpeg sox libsox-fmt-all

 

root@dev4unetpi1:~/pifm/PiFMPlay/pifmplay# sudo apt-get install ffmpeg sox libsox-fmt-all

Reading package lists... Done

Building dependency tree

Reading state information... Done

The following extra packages will be installed:

  libao-common libao4 libav-tools libavcodec53 libavdevice53 libavfilter2

  libavformat53 libavutil51 libdc1394-22 libdirac-encoder0 libgsm1 libmp3lame0

  libopencore-amrnb0 libopencore-amrwb0 libopencv-core2.3 libopencv-imgproc2.3

  libpostproc52 libraw1394-11 libschroedinger-1.0-0 libsox-fmt-alsa libsox-fmt-ao

  libsox-fmt-base libsox-fmt-ffmpeg libsox-fmt-mp3 libsox-fmt-oss libsox-fmt-pulse

  libsox2 libspeex1 libswscale2 libtheora0 libtwolame0 libva1 libvpx1 libwavpack1

  libx264-123 libxvidcore4

Suggested packages:

  libraw1394-doc speex

The following NEW packages will be installed:

  ffmpeg libao-common libao4 libav-tools libavcodec53 libavdevice53 libavfilter2

  libavformat53 libavutil51 libdc1394-22 libdirac-encoder0 libgsm1 libmp3lame0

  libopencore-amrnb0 libopencore-amrwb0 libopencv-core2.3 libopencv-imgproc2.3

  libpostproc52 libraw1394-11 libschroedinger-1.0-0 libsox-fmt-all libsox-fmt-alsa

  libsox-fmt-ao libsox-fmt-base libsox-fmt-ffmpeg libsox-fmt-mp3 libsox-fmt-oss

  libsox-fmt-pulse libsox2 libspeex1 libswscale2 libtheora0 libtwolame0 libva1

  libvpx1 libwavpack1 libx264-123 libxvidcore4 sox

0 upgraded, 39 newly installed, 0 to remove and 1 not upgraded.

Need to get 8,892 kB of archives.

After this operation, 20.9 MB of additional disk space will be used.

Do you want to continue [Y/n]? y

Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libavutil51 armhf 6:0.8.10-1+rpi1 [97.8 kB]

 

Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libdirac-encoder0 armhf 1.0.2-6 [350 kB]

                                .    .    .  .    .    .
                                .    .    .  .    .    .
                                .    .    .  .    .    .
Setting up libsox-fmt-all (14.4.0-3) ...
Setting up sox (14.4.0-3) ...
Setting up ffmpeg (6:0.8.10-1+rpi1) ...
root@dev4unetpi1:~/pifm/PiFMPlay/pifmplay#

 

 

간단한 테스트...

wav 파일의 경우 pifm을 이용하면 됩니다.

[형식]

pifm wav파일명 방송주파수

 

[예시]

저는 root 계정으로 테스트하니 안되는 분들은 sudo를 사용하시기 바랍니다.

 

> pifm starwars.wav 93.1

위 처럼하고 FM 라디오를 93.1Mhz에 맞추시면 노래를 들을 수 있습니다.

제 경우에는 10초(?)정도만 해당 파일이 방송되고 이후에는 원래 채널의 라디오 방송이 나오네요..^^

 

> pifmplay test.mp3 93.1

위 처럼하면 test.mp3 파일을 93.1Mhz로 방송합니다.

역시나 몇 초뒤에는 원래 채널의 방송이 나오는군요.^^;;;;

 

 

GPIO7에 연결하는 선의 종류와 라디오및 라즈베리와 라디오의 거리에 따라서 음질이 다른듯 싶습니다.

제 경우 포터블용 MP3로 테스트 해 봤는데 10초 정도로 짧게 방송되기는 하지만 음질은 상당히 좋더군요.

잘 안되시면 적절히 케이블을 바꿔 보시고 라디오와의 거리도 적절히 변경 해 보세요.

 

어렴풋한 예전 기억으로 상용의 FM 트렌스미터를 이용했을 때에는...

93.1Mhz같은 정규 방송용 채널말고 사용되지 않는 노이즈가 없는 깔끔한 채널에 송신하는게 가장 깔끔했었는데...

이 프로그램은 93.1Mhz같은 정규 채널을 깔끔한 상태로 수신하고 있다가...

해당 채널(예:93.1Mhz)에 원하는 음악을 방송해서 테스트하는게 수월 하더군요.

 

제 경우에만 그런지 모르겠으나 문제점으로는.....

원문 글의 pifm은 wav 파일만 재생되고 10초 정도 지나면 방송이 끊어지기에(프로그램은 동작중이지만 방송이 안됨)

혹시나 하는 마음으로 MP3까지 재생이 가능한 pifmplay 기준으로 테스트하면서 글을 작성했는데...

pifmplay가 내부적으로 pifm을 이용해서 그런지 증상은 동일하더군요.^^

pifmplay의 경우에는 MP3외에도 wav를 비롯하여 다양한 음성 파일이 지원되며 기능도 다양하니

https://github.com/Mikael-Jakhelln/PiFMPlay 사이트를 참고 하시기 바랍니다.

 

 

이해를 돕기위해 간단히 스마트폰으로 촬영후 자막을 추가 했습니다만 라디오 볼륨이 작게 녹음되서..ㅡㅡ

재생 하실 때 볼륨을 가능한 크게 키우시는게 이해하기 좋으실거라 봅니다.

 

 

 

대략 10초 가량 방송되다 끊기는 현상은 제 능력 밖이라 숙제로 남겨놓고 제보를 받습니다.~~~

(참고로, 중단되는 시간은 랜덤입니다.)

 

[추가]

http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter

위 글을 보면 아래와 같은 형태로 구동이 가능하군요.

 

sudo ./pifm left_right.wav 103.3 22050 stereo

 

# Example command lines

# play an MP3

ffmpeg -i input.mp3 -f s16le -ar 22.05k -ac 1 - | sudo ./pifm -

 

# Broadcast from a usb microphone (see arecord manual page for config)

arecord -d0 -c2 -f S16_LE -r 22050 -twav -D copy | sudo ./pifm -

 

pifm 모듈만 이용하시고 위 처럼 다양하게 응용하셔도 좋을 듯 싶습니다.

 

 

[참고 정보]

http://techzei.com/how-to-build-a-raspberry-pi-radio-transmitter/ 

https://github.com/Mikael-Jakhelln/PiFMPlay.git 

http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter