RaspberryPi4とRTL-SDRを利用し特小電力無線を受信するところまでやるよ

# 注意

- 僕は平凡なWebアプリケーションのシステムエンジニアです。
- ハードウェアや無線などについては業務で扱ったことがなく基本情報レベルのことしかわかりませんので**この記事を鵜呑みにはしないでください。**

# 何をしたかったのか

サバゲでは、無線免許が必要のない特小電力無線を装備してお互いに情報共有をしている。
その中で、「誰々が死んだ！」とか「〇〇を制圧した！」とかって音声をビジュアライズ、もしくはSlackなどで文字化できれば面白そうだなと思ったのでまずは受信してデータに保存できるようにする。

https://ja.wikipedia.org/wiki/%E7%89%B9%E5%AE%9A%E5%B0%8F%E9%9B%BB%E5%8A%9B%E7%84%A1%E7%B7%9A%E5%B1%80

# RTLのコマンドについて

https://packages.debian.org/ja/sid/rtl-sdr

```
# それぞれ１行でまとめると
rtl_adsb: RTL2832 ベースの DVB-T 受信機用のシンプルな ADS-B デコーダ
rtl_eeprom: RTL2832 ベースの DVB-T 受信機用 EEPROM プログラミングツール
rtl_fm: RTL2832 ベースの DVB-T 受信機用狭帯域 FM 復調器
rtl_sdr: RTL2832 ベースの DVB-T 受信機用の I/Q レコーダ。
rtl_tcp: RTL2832 ベースの DVB-T 受信機用の I/Q スペクトルサーバ
rtl_test: RTL2832 ベースの DVB-T 受信機のベンチマークツール
```


# 必要なパッケージインストール

```
sudo apt-get install git cmake libusb-1.0-0.dev build-essential pkg-config
git clone git://git.osmocom.org/rtl-sdr.git

cd rtl-sdr/
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig
```

# 色々エラーが出てきたので解消
## エラー１つめ

```
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ rtl_test
rtl_test: error while loading shared libraries: librtlsdr.so.0: cannot open shared object file: No such file or directory
```

## エラー２つめ

```
$ rtl_test
Found 1 device(s):
  0:  4�p)����޾ �޾, , SN: l�޾�޾����޾

Using device 0: Generic RTL2832U OEM
usb_open error -3
Please fix the device permissions, e.g. by installing the udev rules file rtl-sdr.rules
Failed to open rtlsdr device #0.

$ sudo vi /etc/udev/rules.d/rtl-sdr.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", MODE:="0666"
```

## エラー３つめ

```
$ rtl_test
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM

Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

usb_claim_interface error -6
Failed to open rtlsdr device #0.

$ sudo vi /etc/modprobe.d/rtlsdr-blacklist.conf
blacklist dvb_usb_rtl28xxu
blacklist rtl2830
blacklist dvb_usb_v2
blacklist dvb_core
```


## 問題なくテストは動きました。

```
$ rtl_test
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...
lost at least 48 bytes
```

# 聞き取りやすいように色々調整
```
# Audio設定
$ sudo raspi-config
→ 7 Advanced Options
→ A4 Audio
→　一覧で出る
# 音量調整
$ alsamixer
```

# では実際に無線機片手に受信してみましょう

- icom製 ic-4088にて確認
- Kenwoodなど他社製品のch表示とは異なる場合があるので注意してください
    - [特定小電力トランシーバーチャンネル互換表](https://www.exseli.com/transceiver/type/specified-low-power/channel-chart/)
- 実際にやってみて気がついたが、起動した付近の帯域のチャンネルの通信もうっすらと聞こえてしまうことがわかった

```
# ic-4088表示 1ch
$ rtl_fm -f 422.2000M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 2ch
$ rtl_fm -f 422.2125M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 3ch
$ rtl_fm -f 422.2250M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 4ch
$ rtl_fm -f 422.2375M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 5ch
$ rtl_fm -f 422.2500M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 6ch
$ rtl_fm -f 422.2625M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 7ch
$ rtl_fm -f 422.2750M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 8ch
$ rtl_fm -f 422.2875M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 9ch
$ rtl_fm -f 422.3000M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 10ch
$ rtl_fm -f 422.0500M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 11ch
$ rtl_fm -f 422.0625M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 12ch
$ rtl_fm -f 422.0750M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 13ch
$ rtl_fm -f 422.0875M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE

# ic-4088表示 14ch
$ rtl_fm -f 422.1000M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 

# ic-4088表示 15ch
$ rtl_fm -f 422.1125M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 

# ic-4088表示 16ch
$ rtl_fm -f 422.1250M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 

# ic-4088表示 17ch
$ rtl_fm -f 422.1375M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 

# ic-4088表示 18ch
$ rtl_fm -f 422.1500M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 

# ic-4088表示 19ch
$ rtl_fm -f 422.1625M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 

# ic-4088表示 20ch
$ rtl_fm -f 422.1750M -M fm -s 200000 -r 48000 - | aplay -r 48000 -f S16_LE 
```

# ファイルに保存するよ
```
# avconvという名前の可能性もあるぽい？？
$ sudo apt install ffmpeg

# 「-t 10」で10秒だけ録音するようにしている
$ rtl_fm -f 422.0625M -M fm -s 200000 -r 48000 - | ffmpeg -ar 48k -f s16le -t 10 -i - /tmp/20201123.wav
$ aplay 20201123.wav
# サンプリングレートとか調整していないので高周波音が入ってる ここら辺後で修正する
```