最近は Rust と Java を交互に書くという脳トレをしています。KOBA789 です。
先日、知人から PLEX が新しいチューナー "PX-Q1UD" を出したという情報を聞き、気になって買ってみました。
PLEX USB接続型フルセグ対応地上デジタルTVチューナー PX-Q1UD
- 出版社/メーカー: PLEX
- 発売日: 2018/02/28
- メディア: Personal Computers
- この商品を含むブログを見る
価格は2万円弱ほどで、USB 接続で地デジを4チャンネル同時録画できるというシロモノです。 中身は PX-S1UD(こちらも持っている)相当を USB ハブ経由で4つぶら下げただけの構造で、ドライバも同じものが使えます。 というか、接続すると dmesg には PX-S1UD の名前が流れます。
以下、イケてる点とそうじゃない点のまとめです。
イケてる点
- ドライバが最近の Linux カーネルに標準で入ってる
- UHF の分配器や USB ハブを別途用意せずとも PX-S1UD を4本かき集めたのと同じ効果
- USB 接続なのでマシンを選ばない = Raspberry Pi などでも使える!
イケてない点
- バスパワーだと動かないときがあるっぽくて、同梱の AC アダプタが必要
- B-CAS カードは付いてない
- IC カードリーダーも付いてない
とまぁここまでで終わればよかったんですが、この PX-Q1UD をうまく動かすのは一筋縄ではいきませんでした。
PX-Q1UD SNR 安定しない事件
PX-Q1UD の実力を確かめるべく、Raspberry Pi 3 に繋いで recdvbchksig してみました。 すると、SNR の値が 100 になったり 0 になったりして全然安定しません。 一方、電波強度が足らないのかと思い PX-S1UD を引っ張り出してきて試してみると SNR は300(最大値っぽい)で安定します。
4分配しているので電波強度が足らなくなっているのかもしれない、と思ったのですが、そもそも SNR という値の単位や意味がよくわかりません。 PX-Q1UD の情報を提供してくれた友人に相談してみたところ、この SNR の値はぶっ壊れているとのことでした。
この SNR の値は DVB デバイスの frontend の fd に FE_READ_SNR を ioctl して取得している値のようでした。
recdvb 改造
しかし、V4L の DVB API のリファレンスによれば、前述の FE_READ_SNR は deprecated とのことです。
6.1.2.2. FE_READ_SNR — Linux Media Subsystem Documentation documentation
というわけで、recdvb の当該コードを書き換え、ついでなので取得できそうなプロパティを全部取得して表示する改造をしました。
calc_cn
という関数をガッツリ改造します。
(_cn という名前なのに SNR = S/N を表示してんのはどういうワケなんですかねぇ)
diff --git a/recpt1core.c b/recpt1core.c | |
index 168a023..36dd1fd 100644 | |
--- a/recpt1core.c | |
+++ b/recpt1core.c | |
@@ -39,11 +39,50 @@ close_tuner(thread_data *tdata) | |
} | |
void | |
+print_stat(struct dtv_stats stat) | |
+{ | |
+ switch (stat.scale) { | |
+ case FE_SCALE_NOT_AVAILABLE: | |
+ fprintf(stderr, "N/A"); | |
+ break; | |
+ case FE_SCALE_COUNTER: | |
+ fprintf(stderr, "%lld", stat.uvalue); | |
+ break; | |
+ case FE_SCALE_RELATIVE: | |
+ fprintf(stderr, "%lf", (float)stat.uvalue / 655.35); | |
+ break; | |
+ case FE_SCALE_DECIBEL: | |
+ fprintf(stderr, "%lf", (float)stat.svalue / 1000); | |
+ break; | |
+ } | |
+} | |
+ | |
+void | |
calc_cn(void) | |
{ | |
- int strength=0; | |
- ioctl(fefd, FE_READ_SNR, &strength); | |
- fprintf(stderr,"SNR: %d\n",strength); | |
+ struct dtv_property prop[4]; | |
+ struct dtv_properties props; | |
+ | |
+ prop[0].cmd = DTV_STAT_CNR; | |
+ prop[1].cmd = DTV_STAT_ERROR_BLOCK_COUNT; | |
+ prop[2].cmd = DTV_STAT_TOTAL_BLOCK_COUNT; | |
+ prop[3].cmd = DTV_STAT_SIGNAL_STRENGTH; | |
+ props.props = prop; | |
+ props.num = 4; | |
+ | |
+ if (ioctl(fefd, FE_GET_PROPERTY, &props) < 0) { | |
+ fprintf(stderr,"Error\n"); | |
+ } else { | |
+ fprintf(stderr, "CNR: "); | |
+ print_stat(prop[0].u.st.stat[0]); | |
+ fprintf(stderr, " ERRBLK: "); | |
+ print_stat(prop[1].u.st.stat[0]); | |
+ fprintf(stderr, " TOTALBLK: "); | |
+ print_stat(prop[2].u.st.stat[0]); | |
+ fprintf(stderr, " SIG: "); | |
+ print_stat(prop[3].u.st.stat[0]); | |
+ fprintf(stderr, "\n"); | |
+ } | |
} | |
int |
そして PX-Q1UD で動かしてみた結果がこうです。 (上記パッチより若干機能が少ないコードで実験したときのログなので、出力結果が異なります)
CNR: 8.000000 ERRBLK: 0 TOTALBLK: 0 SIG: -23.000000 CNR: 10.000000 ERRBLK: 8041 TOTALBLK: 8116 SIG: -22.000000 CNR: 10.000000 ERRBLK: 5184 TOTALBLK: 5312 SIG: -22.000000 CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -23.000000 CNR: 9.000000 ERRBLK: 2522 TOTALBLK: 2522 SIG: -22.000000 CNR: 10.000000 ERRBLK: 5012 TOTALBLK: 5135 SIG: -22.000000 CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -22.000000 CNR: 10.000000 ERRBLK: 2522 TOTALBLK: 2522 SIG: -22.000000 CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -23.000000 CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -22.000000 CNR: 10.000000 ERRBLK: 5173 TOTALBLK: 5178 SIG: -22.000000 CNR: 10.000000 ERRBLK: 5012 TOTALBLK: 5135 SIG: -22.000000 CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -22.000000 CNR: 10.000000 ERRBLK: 8033 TOTALBLK: 8109 SIG: -22.000000
(ERROR BLOCK だらけなんですが……)
比較のため、PX-S1UD でも測ってみました。
CNR: 0.000000 ERRBLK: N/A TOTALBLK: N/A SIG: -34.000000 CNR: 30.000000 ERRBLK: 2354 TOTALBLK: 2522 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 0 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 15759 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 26383 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 39960 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 47631 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 55599 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 63567 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 84816 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 98096 SIG: -34.000000 CNR: 30.000000 ERRBLK: 0 TOTALBLK: 98096 SIG: -34.000000
「あれ、PX-Q1UD のほうが電波強度(SIG)が強い……」
(ここで X-File のテーマソングが流れる)
さっきまで4分配してるから電波強度落ちてんじゃないのかなー、などと思っていたのですが計測結果は 真逆 でした。 どちらも同じチップを積んでいるので、機種ごとの差、というわけでもなさそうです。
となれば疑うべきはただ一つで、
PX-Q1UD は分配で減る分を補填するためにブースターを内蔵しているのでは
です。
そして
信号がサチってて C/N が悪化しているのでは
という予想が立てられました。
レッツ分解
最近のハードウェアは実装密度が高すぎて、開けても肉眼では何の情報も得られないことがほとんどなんですが、せっかく手元に物体があるので、蓋を開けましょう。
2枚目、シールドを外すとチューナーと思しき石が4つ出てきました。そして右側には USB ハブっぽい石。マジで素朴。
で肝心のアンテナ線は左から来てアンプっぽい石を通ったあと、分配器っぽい石に突っ込まれています。
しかしゲインの調整をできそうな半固定抵抗などは見つからず、そっと蓋を閉じました(やっぱり何もわからなかったじゃねーか)。
信号がサチっているなら
ということで無意味に分解しただけとなりましたが、信号がサチっているのであれば対策は簡単で、信号を減衰させればいいのです。
世の中には電波の信号を減衰させるためのパーツもあって、アッテネータといいます。がしかし、私の手元にはありませんでした。 ので、最終手段「半刺し」です。
半刺し
アンテナ線を半刺しにすると、信号が減衰します(あたりまえ)。
お金もかからず、すぐに実践できるテクニックです。
すると……
CNR: 10.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 0 (counter) SIG: -22.000000 dBm CNR: 0.000000 dBm ERRBLK: N/A TOTALBLK: N/A SIG: -23.000000 dBm CNR: 0.000000 dBm ERRBLK: N/A TOTALBLK: N/A SIG: -23.000000 dBm CNR: 10.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 0 (counter) SIG: -22.000000 dBm CNR: 0.000000 dBm ERRBLK: N/A TOTALBLK: N/A SIG: -23.000000 dBm CNR: 9.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 0 (counter) SIG: -22.000000 dBm CNR: 23.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 2479 (counter) SIG: -40.000000 dBm CNR: 25.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 10447 (counter) SIG: -45.000000 dBm CNR: 25.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 21071 (counter) SIG: -47.000000 dBm CNR: 28.000000 dBm ERRBLK: 0 (counter) TOTALBLK: 37007 (counter) SIG: -47.000000 dBm
(CNR の単位は本当は dB です)
SIG の値が -47 まで下がり、と同時に CNR が 25dB まで改善、ERROR BLOCK も0になりました。めでたい!!!
結論
というわけで、PX-Q1UD はいい製品ですが、電波強度の強い環境で使うときには信号がサチってしまうことがあります。 アンテナ線半刺しなどのテクによって乗り切りましょう。
乗り切る自信がない人にはアッテネータが便利です。
減衰器(アッテネーター) (3種セットB(-6dB/-10dB/-15dB))
- 出版社/メーカー: shin's
- メディア: エレクトロニクス
- この商品を含むブログを見る