皆様はRaspberry Piを使っていて一度や二度は困ったことはあるのではないでしょうか。私も色んなトラブルに合ったことはあるので色々気にして周辺機器や環境を組むように気を付けています。
私はRaspberry Piを使い始めてもう3年になるのですが、よくあるミスには気を付けていたつもりです。ですが、それでも今回引っかかったことがあったので短い記事で掲載しておこうと思いました。
昨今のRaspberry Piはすごいもので、4BにもなるとUSB3.0 x2、USB2.0 x2と高速なI/Oインターフェースを備えるようになります。
そこでRaspberry Pi使いは強欲なもので、より高速になったUSB3.0を使いこなせないか色々試行錯誤するわけです。そして一番多い使い道がおそらくUSB接続のSSDからOSを読み出すという方法。
しかし、USB3.0デバイスは基本的にUSB2.0よりも多くの電力を使うため、USB3.0のデバイスを繋ぐとRaspberry Piが不安定になる場合があります。理由としては電力の使いすぎで電源容量が足りなくなり電圧降下が発生してしまうからですね。
しかし、私としてはそれは想定範囲内なので、まずは電源を選ぶときから電圧などには気を付けているわけです。
しかしながら、私がたくさんのデバイスをぶら下げて使おうとしてみたところ見事にデバイスが動く動きません。詳しい状態としては、Raspberry Pi自体は正しく動作しているのですが、USBデバイス側が上手く動いてくれないのです。
これは頭を悩ませる展開になっていしまいました。前提として私はこういうシーンがあることを知っていて、事前に困らないように周辺機器を選んできたつもりなのですが、よもやUSBの動作不安定になるとは思ってもみなかったからですね。
とりあえず症状と原因を突き止めるまでの備忘録を残しておきます。誰かの役に立つかは謎ですが、誰かのため残しておきます。私が何を考えて何を試したのかが事細かに書き残してあるので、読みにくいかもしれませんが、何かの役に立つことも書いてあるかもしれません。謎の症状に悩まされるのであれば、是非読んでいってください。
目次
症状
症状は簡単に言えばUSB機器の不具合です。
今まで運用を続けていて、USB機器を増設したタイミングでの不具合でした。
詳しく書くと、私はRaaspberry Piをテレビ録画マシンにしているのですが、T230Cというデバイス最近になって導入しました。この記事のことですね。
一般的なRaspberry Piの使い方とは結構かけ離れているので、いざこういう症状が出ると困ったりもします。
今回、不具合の出たデバイスは上記の記事で取り上げているT230Cというテレビ放送を受信して復号するためのデバイスです。まあどんなことをしているかというのはさておきデバイスの動作が不安定でした。ちなみに、2個取り付けています。
不具合を起こしているのはこの2個取り付けているT230Cの両方です。しかし、別のUSBデバイス(別のチューナー)を繋げているのですが、こちらには不具合が発生していませんでした。
さて、この動作の不安定の理由を突き止めるべく色々試したり原因を切り分けていきます。デバイス不調の理由もすぐわかるような状態でなく、周辺環境が原因の可能性もあっただけに良く調べる必要がありました。
冒頭の文章でも触れていましたが、USB機器増設でUSB機器の動作が不安定になっているので、こういう時の定石は電力が足りず低電圧になってしまっている場合があります。これを調べるのは非常に簡単でターミナルで以下のコマンドを実行するだけです。
vcgencmd get_throttled
これを実行すると以下のように表示されました。
0x0
これは低電圧な状態に一度も陥ったことがないことを示しています。つまり、Raspberry Piが思うシステム的には問題ないという判定になっているわけです。このコマンド実行時の結果との対応表は以下の通りです。
0x0 | 正常 |
0x50000 | 過去に低電圧状態になったが、現在は正常 |
0x50005 | 低電圧状態 |
0x80000 | 過去に熱によりクロックダウンした |
0x80008 | 現在熱によりクロックダウンしている |
一度でも低電圧状態に陥っているのであれば、やはり電源や構成に問題がある可能性が高いです、ですが、私の場合はそうでなかったために原因を究明するのに時間がかかってしまう事態になりました。
状況はこんな感じだったので、原因を調べていきます。
※詳しく知りたいか、T230C関連から流れ着いた方のために具体的な症状を書いておくと、T230Cでの全てのチャンネルでの録画でドロップが頻発しました。ドロップ時のログを見てみると、T230Cを2個つないでいるのですが、その2個ともがほぼ同時刻でドロップを起こしていました。ただ、片方がドロップしているのにもう一方がドロップしていないということもありました。正直原因がすぐわかる感じでもないのでしっかり切り分けする必要がありました。
環境
原因を調べるために、現在の環境を示します。以下のような環境です。
- Raspberry Pi 4 model B 4GBモデル
- USB2.0:PLEX PX-W3PE4(電源を別途供給)
- USB2.0:Mygica T230C(バスパワー)
- USB3.0:Mygica T230C(同上)
- 電源:QC3.0対応ACアダプター+ダイソーの5V3A対応ケーブル
- LANケーブルでネットに接続
- OS:Raspberry Pi OS(Kernel 5.10.63-v7l+)
必要な情報はこれくらいでしょうか。USBデバイスでよくわからないデバイスがぶら下がっていると思いますが、これは全部テレビチューナーです。
バスパワーのものが二つに、セルフパワーのものが一つぶら下がった構成といった感じです。Mygica T230はUSB2.0対応デバイスなので、最大で消費される電流は500mAとなっています。
原因の切り分け
まずは原因を切り分けなければなりません。まず、電力不足による可能性があるのかを確かめるために、不具合の対象となる機器以外を全て外して正しく動作するかを確認しました。
結果、正しく動きませんでした。
ということは本体が故障している可能性もあるのかと考えて、別の環境で試すことにしました。まず、確実に動くメーカー製のPCを持っていたのでそれを使います。今回用いたのはCHUWIのHeroBoxProです。これはレビューしているので気になる人はどうぞ。
結構低スペックPCですが、腐ってもミニPCなので、USB動作が正しく動作するのかを確認します。今回は同じような環境でやりたかったので、Debianをインストールして正しく動作するかを確認しました。
結果、正しく動作しました。
この結果から何が考えられるかというと、同じDebian系のOSではいけて、デバイスの違いから動作不調はきていると考えられるので、USB機器自体にはやはり問題なかったわけです。
後やっかいな問題として考えられるのはCPUのアーキテクチャがx86系かARM系かでも様々な部分が違うので、最悪これが不調の原因になっている可能性も考えられますが、これが原因だと根本的な問題すぎてどうしようもないです。
あともう一歩調べれば確信に近づけるはずなので、あと少しだけ原因を切り分けてみることにします。
もしかしたら性能が足りない可能性もありますが、今は使っていない古いRaspberry Piで試してみることにします。これはRaspberry Pi model 4Bになってから電源供給用の端子が変わったために新しい電源を購入していたわけですが、古いラズパイなら環境的に安定していたのと、違う電源で試せるという二つのメリットがあります。
この古い環境で試した結果、正しく動作しました。
さらにここで、もう一つダメ押して試したことがむしろしばらく沼にはまる原因となりました。何を試したかというと、セルフパワータイプのUSBハブです。ちなみに別の機会に書いた物なので正しく動いたレビューをしています。こちらの記事のELECOMのやつを使いました。
USBの電圧不足が疑われるときに使う常套手段としてこういう、電源付きのUSBハブを使うという方法があります。
ですが、このときの結果は、正しく動作しませんでした。
この結果より、やはりRaspberry Pi model 4BでのUSB接続に問題があることが予想されます。やはり本体周りをなんとかする必要がありそうです。ただUSBハブを使ってうまく動かないのは当時は少しよくわかっていませんでした。後でおそらくこれだろうという理由はわかります。
原因を突き止める
以上の結果を踏まえて本体で試行錯誤して本当の原因を突き止めます。
さて、ここで仮説を立ててみます。
まず、USB機器に問題はなく、古いRaspberry Piで正しく動作するということから、本体のUSBへの給電かデータのやり取りに問題があると考えられます。
ですが、データのやり取りに問題があるというのはOSの根幹にかかわってくるのでそれは無いと考えるべきでしょう。それであれば、やはりUSBへの給電不足が主たる理由であると考えられるわけです。
しかし、ここで思い出すのが、ラズパイあるあるの低電圧問題。今回はコマンドで低電圧不足を調べましたが、結果は白。つまり、ラズパイ的には電源容量が不足しているとは判定していないわけです。
私はここでふと思いました。低電圧警告の基準って何?おそらくこれがキモになるのではないかと薄々感じ始めます。
色々調べてみると、ラズパイが低電圧警告を出すのが、4.7Vを下回ったときだそうです。4.7Vって5Vという定格電圧から見るなら相当低電圧です。この警告が出なくても動作が不安定になるデバイスがあってもおかしくないのでは?と考えるようになります。
CPU部分は3.3V駆動だったはずで、降圧させているだけなので、多少電圧が低くても問題なく動作させることが可能だと思います。なので、この大元の電源からくる5Vが4.75VとかでもおそらくラズパイのUSBは問題ないと判断しているのではないでしょうか。
4.7V程度でも低電圧耐性のあるデバイスなら正しく動作していて、割と電力使う、または高い精度の電圧を要求するデバイスは、デフォルトの状態のギリギリ低電圧と感知されない電圧であるために動作不良に陥る。つまり、今回不具合の発生したデバイスはチューナーデバイスのT230Cでこれは低電圧耐性がなかったのでしょう。そして、別でチューナーデバイスの方は低電圧耐性があって正しく動作していたのだと考えられます。
さて、ここまで考えてUSB端子の電圧が低い可能性を考えてきたわけですが、ここで一つの疑問が浮かびました。なんでセルフパワータイプのUSBハブを使って正常に動作しなかったのかと。
電圧不足なら、ハブをかませればうまく動きそうなのになぜ動作不調なのかというのを考えました。そこで思い至った可能性が一つだけありました。
今回使ったハブは(というか大半のセルフパワータイプのハブ)はセルフパワー/バスパワー兼用です。電源に繋がっているかという判定をICなどがしているというのは考えずらくて、おそらくアナログ回路的にやっているはずです。これを考えると、ラズパイ側のUSB端子が仮に4.7Vしかない状態で、USBハブ側の電圧が5Vだったりすると電流が逆流してしまいます。そのため、おそらくセルフパワーのハブとして動作しているときは入力電圧と等しいか、それより少し低い電圧が供給されるような形になっているのではないかと考えられます。そのため、結果的に元から正しく動かない4.7V近辺の電圧が印加されるような状態になっているため、ハブを繋げても正しく動作しないのではと考えれます。
あとは電源本体をみると、出力が5V/3Aとなっているので、ACアダプター本体からの電圧が5Vしかない(純正電源は5.1V)のに加えて、さらにケーブルによる電圧降下も起こるはずなので、元から5Vは確実に下回っていると考えても問題なさそうなことに気づきます。電圧降下は接触抵抗に導線の抵抗が大きく反映される要素になりますから、USBケーブルを差し込むタイプのACアダプターなら0.3V近く電圧降下が起きていてもなんら不思議ではありません。定格の数字だけだと15Wの出力があるので問題なさそうなんですがね…
電源の交換をする前に電圧を計測しておきましょう。適当にアナログのテスターで計測するだけなので、精度は保証できませんが、小数点第一位くらいの精度は認めても良いとは思います。
はじめにUSB3.0ポートはこちらです。測定にはSANWAのKIT-8Dを使いました。
端子間電圧は5.1Vでした。次にUSB2.0ポートの場合の電圧を測定したのでそちらを示します。
USB2.0の場合の端子間電圧は4.95Vでした。
色々考察してみたわけですが、この結果によってさらに謎が深まる結果に。USBの端子間電圧は正しくほぼ5V、USB3.0の方は5.1Vもあったので問題はなさそうです。
ただ、少し気になるのはUSB2.0ポートが4.95Vと、5Vを接続前から下回っている点です。さらにここに接触抵抗なども含まれてくるはずなので、実際にデバイスに届くときはもう少し低い電圧になるはずです。
現状考えられるのはやはり少しだけ電源の出力が足りないか、USBの電圧を見るに動作不良の原因は電圧にあるが、ラズパイの電源回路の精度などの問題によってどうしようもない可能性もあるかもしれないと考えていました。
まだ、もうひと押し欲しいところなのですが、なんとならないかなと思って色々やった結果確信が持てることが一つだけありました。
チューナーデバイスを3つUSBデバイスに繋げていると、USBポートが一つ余ります。さらにダメ押しでここに何かデバイスをぶら下げたらどうなるか。これを試すことにしました。つなげてみるデバイスですが、ちょうど良いのがいました。検証で使ったUSBハブです。
このUSBハブは結構細かく仕様が掲載されていて、バスパワー動作時にはハブの4ポートで最大720mAしか使用できないようです。これを基に逆算すると、USBハブで180mA程度電流が必要とされていることがわかります。これを使えばもしかしたら状況がわかるかもしれません。
さて、最後のUSBポートを埋めるべく先ほどのハブを差してみると「Under-voltage detected!」の文字が出てきました!つまり、このことから、180mA程度でも低電圧の警告が出るくらいギリギリの電源容量で利用していたことが判明しました。
ここまで考えればほぼ電源なのは間違いなさそうなので、実際に別の電源を買ってみました。
原因のまとめ
簡単に言えば電源の容量不足というありきたりな理由ではありました。ですが、簡単にそういう結論にたどり着けなかったのは、以下のような理由がありました。
- 低電圧警告が出ない
- 他のデバイスは正しく動作している
このせいで何が悪いのかはよくわかっていませんでしたが、結果からわかるように、低電圧警告が出なくても、定格の5Vを下回ったら動作不良に陥るデバイスが存在するということが沼になっていた原因でした。
おそらく今回のテレビチューナーに関してはチューナー用ICと復号用ICが入っており、おそらく内部的にはUSBとリンクしているのが復号用ICでこちらは問題なく動作していて、チューナー用ICが電圧が足りず不安定になっていたのではと考えています。ここら辺はデバイス内部の話なので確実にそうだとは言えませんが、おそらくはそうでしょう。
なので、低電圧警告が出ていないから大丈夫と考える前に色々検証してみて、やはり電源に問題がありそうだと思ったら低電圧警告が出て居なくても変えてみると良いかもしれませんね。
総括的な何かと教訓
頭でっかちにならずしっかり様々な状況をみて判断するのは大切だと思いました。今回は電源には問題はなさそうと内心は思いこんでいたのと、低電圧警告が出ていないのが原因を突き止めるのに時間がかかった理由でした。
低電圧警告が出ていないからと電源は除外するのではなく、USB機器に不具合があり、他のデバイスで正しく動作するなら真っ先に電源を疑うくらいの方が良いと思いました。デバイス側で検知できる不具合もセンサーの少ないデバイスであればあるほど検知できないと思うので、より柔軟に考えて原因を突き止めるようにしたいですね。ソフトウェアはあくまで目安で、結局はハードウェアや計測器で見える数字を信じるのが一番ですね。
以上です。お読みいただきありがとうございました。