Raspberry Pi の Wi-Fi がつながりにくくなったとき

Raspberry Pi

Raspberry Pi の Wi-Fi が不安定になったときのチェックポイントをまとめておきます。

以下の環境で動作確認をしています。
環境: Raspberry Pi 3 model B+, buster および bullseye, Windows パソコン

背景 ラズパイの Wi-Fi が繋がりにくくなった!

日頃、Raspberry Pi を Wi-Fi 接続で自動起動させて活用しています。
ところが最近、Raspberry Pi の Wi-Fi 接続が安定しなくなってきました。起動時にネットワーク接続に成功するのが、2~3回中1回といった状態になりました。

自動起動させて使っている Raspberry Pi には通常、無線 LAN 経由で、別の Windows パソコンなどからリモートデスクトップでアクセスしています。
Wi-Fi 接続に失敗すると、その間、Raspberry Pi 側の操作はリモートでは何もできなくなります。画面を確認することもできません。リモート接続では原因の特定が特に難しくなります。
かといって、たまたま無線 LAN 接続に失敗したからといって、その都度、Raspberry Pi にモニターとキーボードをつないで確認をする、というのも煩雑すぎて非現実的です。(Raspberry Pi も複数持っていますし。。)

ということで、Raspberry Pi の起動時にログを出力するなどの改善をおこない、いくつかのコマンドで確認をしたところ、原因が特定でき、確実に動くようになりました。そこで、Wi-Fi 接続などが不安定となったときの一連の確認手順とチェックポイントをまとめ、公開しておきます。

確認手順 ~ ラズパイの Wi-Fi 接続が不安定なとき

Wi-Fi 接続を何度かトライして、アナログ要因、デジタル要因を切り分ける

① まず、Raspberry Pi に電源を何度か入れなおして、Wi-Fi 接続を何度かトライしてみます。
※ 複数回起動させたとき、Wi-Fi 接続に失敗するのが何回程度か、定量的に把握してみます。
※ 必ずつねに失敗するのであれば、デジタル関連の要因が疑われます。例えば、ラズパイの画面上でのネットワーク設定、設定ファイル、ソフトウェアのアップデートなどで、直前に変更したものを確認してみます。
※ もし、たとえば、5回に1回のように、ある一定の確率で接続に失敗する/成功するのであれば、アナログ関連の要因が考えられます。例えば、電波の状態や電源の安定性などです。

ローカルネットワークの接続を確認する

② 加えて、①で Raspberry Pi を起動したとき、Windows パソコン側で、コマンドプロンプト(または、Anaconda Prompt)を起動し、“arp -a” を実行してみます。

※ Windows パソコン側からローカルネットワーク内を監視し続けて、再起動時の Raspberry Pi の IP アドレスが現れるかどうかを確認してみます。”arp -a” を実行して Raspberry Pi の IP アドレスが表示されるのであれば、ネットワークの接続までは機能しています。リモートデスクトップの設定がしてあれば、リモート接続も可能と考えられます。
※ また、Windows パソコン側から、ping コマンドを送ってみます。
具体的には、例えば、Raspberry Pi が固定IPアドレスとなるよう設定してあり、ローカルでの IPアドレスがわかっている場合(例:192.168.1.32)、Windows パソコン側から、以下の ping コマンドを送ってみます。
例: ping 192.168.1.32
ここで、「192.168.1.32 からの応答: バイト数 =  …」などとして、応答が返ってきているようであれば、ネットワークの接続は機能しています。再度、”arp -a” コマンドなどで確認してみてください。
なお、「…宛先ホストに到達できません。」等となっている場合は、Raspberry Pi 側が応答していません。

③ つぎに、Wi-Fi 機器側(アクセスポイント等)の電源を ON/OFF してみます。
※ Raspberry Pi 側(Wi-Fi デバイス)が正常に起動しているのであれば、電波が一時的に断絶したとき、Raspberry Pi 側から Wi-Fi 機器への接続を再トライする動きとなります。
このとき、②の “arp -a” コマンドを同時に実行することで、Wi-Fi ネットワークに再接続しにいく動きを確認してみます。

その他の確認項目

他に考えられる確認項目としては、以下があります。

※ Wi-Fi の電波がつながりにくい場合は、Raspberry Pi と Wi-Fi のアクセスポイントを結ぶ直線近辺にあるモノを片づけてみる。
※ Raspberry Pi とアクセスポイント間の距離を近づけてみる。
※ 配線ケーブルや机など、電波を遮蔽する要因となりうるものも片づける。
※ Raspberry Pi 3 model B+ の場合、Wi-Fi/bluetooth のアンテナ素子は、基板表面のラズベリーパイのマークの付いた金属部分(銀色部分)となっている。そこで、アンテナ素子近辺のケーブル類/金属類/遮蔽物をなくして片づける/電波が通りやすくなるよう配線のレイアウトを改善する/アンテナ周辺の空間を広く確保する。
※ Raspberry Pi に接続しているハードウェア機器で、最近変更したものをもとに戻してみる。
※ 使っていない/不要な USB機器を外してみる。すべての USB 機器を外してみる。
※ GPIO に接続したデバイスについて、電源供給(5V、3.3V のピン接続)を外してみる。すべてのピン接続を外してみる。
※ Raspberry Pi をバッテリー駆動している場合は、バッテリーを充電してみる。バッテリーの電圧/容量が十分か確認する。
※ 最近、Wi-Fi ルーターを交換した等といった場合は、パスワード等の初期設定を忘れていないか確認する。
※ ローカルネットワークに接続している他の機器、台数が悪さをしていないか確認する。具体的には、例えば、アクセスポイント/ルーターにアクセスできる台数の上限に達していないか確認する。
※ ローカルネットワーク内で、複数の機器間で、IPアドレスの重複が生じていないか、IPアドレスの取り合いになっていないか、確認する。

Wi-Fi がつながったときの確認 & 改善ポイント

起動時の画面出力を再表示してみる

④ 何とかつながる状態になったら、Raspberry Pi 側でターミナルを起動して “dmesg” + [enter] と入力してみます。起動時の出力を再表示するコマンドです。
$ dmesg

→ もし、ここで、”Under-voltage detected!” という警告が出ているようであれば、システムの起動時に電圧降下が生じていることがわかります。

※ この場合、電圧関連の改善をします。
たとえば、Raspberry Pi の電源に使っている USB 電源などで、アンペア数の大きなものに変更できないか検討してみます。
また、Raspberry Pi に接続している機器側で、起動時に音声などを出している場合は、音量設定など起動時の出力を下げられないか/外部電源が取れないか/外部電源が取れる機器に交換できないか、などを検討します。

※ 他に、画面出力で、エラーが表示されていないか確認します。

起動時などにログを残すよう修正する

起動時や、終了時、自動処理の実行時にログが残っていないと、問題発生時、トレースすることが困難となります。
そこで、Raspberry Pi (Linux) の cron 機能を使って、以下を例にログを残すように修正してみます。具体的なスクリプトや設定方法は、末尾の関連リンクに記載しています。
なお、ログは一時的なものであれば、Raspberry Pi の起動 SD カードに書き込んでも問題ないと思いますが、書き込みを常時/長期間行う場合は、USB カードリーダーなどを使って、外部の SD カードに書き込むようにしたほうが、システムを破損するリスクを低減するという観点で、より安全です。

ログを残す項目の例 
※ 起動時にスクリプトを実行するようにして、起動日時のログを残すよう修正する。
※ 指定時刻に自動でシャットダウンをする際も、crontab -e で直接、shutdown コマンドを実行するのではなく、終了用の Python などのスクリプトを実行するようにする。スクリプト側で、終了日時のログの記録を終えたのち、シャットダウンコマンドを実行するようにする。
※ 起動、終了以外で、自動実行するコマンドについても、スクリプト化して実行する日時のログを書き出すようにする。

自動実行する処理は、システムが安定化してから実行するようにする

Raspberry Pi の起動時に、温湿度の計測やネットの自動検索など、独自の処理/カスタマイズした処理を行いたいことがあると思います。
この場合、cron 機能を使って、起動直後にそのまま自動実行すると、電源や Wi-Fi 接続などが不安定になることがあるようです。そこで、一定時間のスリープを入れるようにします。

具体的には、自動化する処理は、ターミナルで crontab -e を実行して記載します。起動後に行う処理は、”@reboot sudo … ” という行を追加して記載します。”@reboot ” で始まる行がすでに記載されていたら、その行の終わりあたりに行を追加して、同様に実行したいコマンドを追加していきます。
一例として、以下のようにスリープを入れ、システムが安定化してから、実行するようにしてみます。

修正前
@reboot sudo python /home/pi/…/start1.py

修正後
@reboot sleep 40
@reboot sudo python /home/pi/…/start1.py

※ python のスクリプト start1.py を実行する前に、40秒ほどのスリープを入れておく事例です。
※ 一般の電子機器では、電源投入直後は瞬時、消費電力が上昇することがよくあります。また、Wi-Fi なども接続時は電波の強度を増減すると思われます。Raspberry Pi で実測したわけではありませんが、起動直後は独自の処理を実行する前にスリープを入れておくほうが安全です。
※ 経験的に、温湿度のデバイスをつないで計測を行うような場合も、起動直後にいきなり計測を始めるよりは、起動後(計測前)に “@reboot sleep 40” などを入れたほうが安定に動作しています。私の環境では、30秒以下とすると起動直後の動作が不安定となるケースがありました。また、60秒以上とするとやや長いので、上記の程度にしています。
スリープを入れる場合の期間(秒数)は、システム起動後、Wi-Fi 接続やシステムが安定化する時間をみて、調整してみてください。
※ ログの書き出しも、起動直後に USB ポートに接続した SD カードにログを書き出そうとすると、失敗することがあるようです。例えば、安定動作中の計測やシャットダウンのログは書き出せるのに、起動直後のログは書き出せない、などの現象を経験しています。
接続する機器にもよると思いますが、USB ポートも、安定するまでの時間が必要なようです。経験的に、上記の程度のスリープを入れたところ、安定動作しています。

システムが安定化したあたりで、ネットワークを再接続する処理を入れておく

また、システムが安定化したあたりで、Wi-Fi などのネットワークを自動で再接続するコマンドを入れておきます。上記と同様に、crontab -e を実行したときの編集画面で(”@reboot ” コマンドが記載されている末尾あたりで)、以下を追加します。


@reboot sleep 60
@reboot sudo dhclient wlan0

※ こうしておくと、起動直後のネットワーク接続に失敗した場合であっても、システムの起動後、例えば 60秒後、システムが安定化したあたりで Wi-Fi 接続を再トライしにいくことになります。
動作確認をする場合は、Raspberry Pi が起動するタイミングに合わせて、ローカルネットワーク内の Windows パソコンなどから arp -a コマンドを実行します。すると、Raspberry Pi 側で Wi-Fi 接続の再トライがうまくできているか、リモートで確認することが可能となります。
システムの起動直後は、Raspberry Pi 本体に加え、接続した複数の周辺機器も同時に起動します。すると、何か問題があったとき、問題個所、問題要因の切り分けが難しくなります。
そこで、起動後、指定時間経過後にネットワーク接続だけを単独で再接続するようにします。これにより、システムが正常起動していれば、ネットワークに関しては再接続するはずということがわかります。ネットワーク接続がそもそも動くのか/動かないのかを切り分けて、単独で動作確認をすることが可能になります。

Raspberry Pi を固定 IP アドレスに設定する

Raspberry Pi はデフォルトでは、ローカルネットワーク内でのIPアドレスが可変となっています。
可変IPアドレスは、起動時にネットワークに加わる際、設定を自動化できるためとても便利なのですが、反面、他の機器とIPアドレスの取り合いとなって、接続に失敗することがあります。
たとえば、Raspberry Pi が起動して、ローカルネットワークに接続しにいった際、192.168.1.3 という IP アドレスを取りに行こうとしたとします。このとき、他のローカルネットワークに接続している機器(スマートフォン、パソコン)が、先に、192.168.1.3 という IP アドレスを取得していることがあります。すると、Raspberry Pi としては、他の取得可能な IP アドレス(192.168.1.4、192.168.1.5、…)を探しにいく動きとなります。この結果、接続に失敗することがあります。
そこで対策として、固定IPアドレスを設定します。手順としては、上記の arp -a などで各機器の IP アドレスを把握しておきます。そして、まず重複しないと考えられる固定IPアドレス(例: 192.168.1.32 など)を Raspberry Pi 側で設定しておきます。
これにより、可変IPアドレスが重複することで接続に失敗する可能性を減らします。ネットワーク接続の際の変動要因をなくすことで安定化を図ります。
設定方法については、末尾の関連リンクにまとめておきます。

Wi-Fi の受信電波の強度を把握しておく

また、ローカルネットワークの Wi-Fi 電波の強度を実測してしまうという案もあります。
電波の強度が強い場所、弱い場所を測定して、Wi-Fi のアクセスポイント/ルーターの配置を最適化しておきます。また、電波が届かない場所や条件、遮蔽物を置いた場合の電波強度を事前に把握しておくことで、Wi-Fi 接続に関するトライ&エラーの無駄を解消します。
Raspberry Pi を使ったサンプルスクリプトをまとめていますので、末尾の関連リンクに挙げておきます。

消費電力の見積り(推測)

Raspberry Pi の消費電力については、ネット検索をしても、具体的な見積もり例をあまり見たことがありません。
そこで推測が入りますが、消費電力について見積もりを記載しておくことにします。計測したわけではありません。あくまでも各機器の仕様からの推測、一例です。

デバイス 消費電力(推測、一例)
Raspberry Pi 3 model B+ などの基板 600mA ~ 1,000mA ? x 5V
USB スピーカー 500mA x 5V (MAX)
USB カードリーダー ?? mA x 5V
USB 電源(スマホ用) 2.4 A x 5V (供給電力)
USB 電源(安いもの) 1 A x 5V (供給電力)

※ 私が持っているラズパイの事例では、USB 給電タイプの USB スピーカーを Raspberry Pi につないだところ、1A の USB 電源では電力が不足し、Wi-Fi も含め、USB 機器が安定起動しなくなりました。
そこで、2.4A の USB 電源に代えたところ、安定して動作するようになりました。
※ USB 給電機器、モーターを使った機器など(USB スピーカー、USB ハードディスクなど)をラズパイに接続すると、電力供給が不足する傾向が高まるようです。
※ 本来は、接続機器も含め、消費電力に関するこうした見積もりを作っておくとベターかなと思います。しかし、接続する機器によって、Raspberry Pi 本体の消費電力も大きく変動するようであり、起動直後などの電源仕様の明確化が難しいです。
例えば、Raspberry Pi の GPIO 5V ピンを間違って GND に直結してしまうと内部抵抗で決まる大電流が流れることになります。このため、消費電力に関する仕様は明確化が難しいことは理解ができます。(Raspberry Pi に何をつなぐかによって Raspberry Pi 自体の消費電力が大きく変動する。Raspberry Pi に何をつなぐのかはユーザーしか知らないので、メーカー側は消費電力を明確化/特定することが難しい。)
※ また、Raspberry Pi の buster や bullseye のように、最新の OSや基板に更新するほど、基板の消費電力が上昇する傾向もあるようです。バージョンアップなどの性能改善に伴い、USB 電源の能力が不足する傾向があります。可能な範囲で、概算での消費電力を把握しておくことが望ましいと考えられます。

まとめ

Raspberry Pi で Wi-Fi 接続などが不安定になったときの確認事項についてまとめました。

Wi-Fi などが不安定になったとき、対応手順やコマンド、着眼点を記載したサイトがあまり見つからなかったため、全体の流れと各観点をまとめてみました。
デジタル関連の設定はさておき、アナログ関連での不安定要因は、まずはこのようなところかなと思います。

なお、実際の Wi-Fi の電波強度を確認したい場合について、Python のサンプルコードをまとめています。もし関心があるようでしたら、関連リンクも参照してみてください。

関連リンク
・ Raspberry Pi を Wi-Fi 電波強度モニターにする 【Python】
・ 
Raspberry Pi にリモートデスクトップで接続する
・ 固定IPアドレスを設定する 【Raspberry Pi】
・ 起動、終了時にログを出力する 【Raspberry Pi】
・ USBスピーカーをデフォルトに設定する 【Raspberry Pi】

タイトルとURLをコピーしました