要約
sudo apt update
sudo apt install unclutter
[Unit]
Description=browser
Wants=display-manager.service
After=display-manager.service
[Service]
User=hoge
Environment=DISPLAY=:0
ExecStartPre=sleep 5
ExecStart=bash -c "unclutter -idle 0.5 -root -display :0 & /usr/bin/chromium-browser --noerrdialogs --disable-infobars --enable-logging --log-level=0 --start-maximized --kiosk https://google.com"
[Install]
WantedBy=multi-user.target
sudo cp browser.service /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable browser.service
概要
RaspberryPiというコンピュータは、いわゆるマイコンの中でも特に有名な部類でしょう。インターフェースも充実していて、最近の機種であればHDMIの映像出力やWi-Fiへの接続、有線LANが繋げるものもあります。それに消費電力も少ないため、常時起動しておくような形でもあまり気になることはありません。
これを使えば、ダッシュボードや情報源などを常時ディスプレイに表示する、いわばデジタルサイネージのようなものが簡単に作れるのではないかと想いやってみることにしました。
ディスプレイでの表示方法は、独自アプリを作るとかの選択肢もあるかと思いますが、Webページを開いておくというのが一番シンプルで済みそうです。ネットワークに接続しておけば、ブラウザをリロードしたり背後のスクリプトで情報を更新することで、リアルタイムに表示内容を変化させられます。
また、データ表示系のライブラリやCSS、WebGLなどの技術で多様なグラフィック表現も可能です。何事もブラウザのWebサイトでというのは、今の世の中のサービスの多くを見ても感じる潮流です。
求められる要件としては、ラズベリーパイの起動時に任意のWebページをブラウザで開くことです。できれば、ウィンドの枠やタブなどが見えない全画面でブラウザを表示したいです。
実装
はじめにラズベリーパイの起動時にブラウザを開くということを目指します。ブラウザを開くと言っても、要は任意のブラウザソフト(この記事ではChromium
)をコマンドで実行できればいいです。
起動時のコマンドの実行については、参考に挙げた記事などをもとに、最終的にはsystemd
を用いた方法で実装をしました。はじめはautostart
を使おうと考えていましたが、バージョンの都合かどうもうまく動作しませんでした。
この実装をしていたのが2024年の3月ごろで、その前の2023年10月にRaspberryPi OSの大きめなアップデートがあったようです。それが故でしょうか…。
なお、systemd
自体私はこの開発で初めて実際に設定したもので、まだ稚拙な点もあるのかと思います。より良い形があればぜひコメントなどで教えてください。
unclutter
のインストール
実際にsystemd
を設定する前に、使用するツールとしてunclutter
のインストールを行いました。unclutter
はマウスカーソルを非表示にするツールです。全画面表示の際にマウスカーソルが表示されたままだと見栄えが悪いので、このツールで消えるように設定します。
インストールは一般的なツールと同様にapt
で実行しました。
sudo apt update
sudo apt install unclutter
systemd
の設定
本題のsystemd
については、Unitファイルを以下のように記述しました。ここではUnit名をbrowser
としてファイル名もbrowser.service
にしていますが、この名称は任意です。必要に応じて他のUnit名にし、コマンドも読み替えてください。
[Unit]
Description=browser
Wants=display-manager.service
After=display-manager.service
[Service]
User=hoge
Environment=DISPLAY=:0
ExecStartPre=sleep 5
ExecStart=bash -c "unclutter -idle 0.5 -root -display :0 & /usr/bin/chromium-browser --noerrdialogs --disable-infobars --enable-logging --log-level=0 --start-maximized --kiosk https://google.com"
[Install]
WantedBy=multi-user.target
記述内容は私自身も自信を持って理解できている部分が少なかったり、ChatGPTとの問答の末の記述だったりするので、間違いや無駄な記述もある可能性にご留意ください。
Wants=display-manager.service
とAfter=display-manager.service
の箇所では、このUnitが依存するUnitを指定しています。今回はGUIでブラウザのウィンドウを開くという処理ですので、先にGUIの環境をセットアップするdisplay-manager.service
が実行されるのを待っています。
ただそれでもその他のGUI関係のセットアップ処理とのずれが生じてしまうのか、displayが見つからないというようなエラーで起動が失敗してしまいました。そこで、力技ですがセットアップを待つためにExecStartPre=sleep 5
というのを設定しました。ブラウザの起動前に5秒待ち、セットアップの処理と思われるものを待機しています。
そして実際にブラウザを起動するコマンドがExecStart=bash -c "unclutter -idle 0.5 -root -display :0 & /usr/bin/chromium-browser --noerrdialogs --disable-infobars --enable-logging --log-level=0 --start-maximized --kiosk https://google.com"
にあたります。
まず、先にインストールしたunclutter
を用い、一定時間(ここでは0.5秒)マウスが動かなかった場合にカーソルを非表示とするようにしています。それがunclutter -idle 0.5 -root -display :0 &
の部分です。
そしてその後のコマンドでブラウザとしてchromium-browser
を起動しています。開かれるWebページは、最後に指定しているhttps://google.com
の部分です。ここのURLを書き換えれば任意のサイトを開くことが可能になります。
オプションとして色々指定していますが、特に大事そうなものはChromiumをKioskモードで起動する--kiosk
、全画面で表示する--start-maximized
のあたりかと思います。このオプションについても、私自信まだあまり理解できていないところも多くあります。参考にオプションの一覧ページのリンクも載せましたので、こちらも合わせてご参照ください。
systemd
への登録と有効化
上記でUnitの定義ファイルが書けたので、これをsystemd
に登録します。以下の手順でファイルを/etc/systemd/system
以下におき、対象のUnitを有効化させます。
sudo cp browser.service /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable browser.service
これでブラウザの起動が有効化されたので、一度ラズパイを再起動してみます。そうすると、ラズパイの起動後デスクトップが表示されて少しして、ブラウザが表示されるかと思います。
実際の動作
実際に動作したものをTwitterの方に動画でアップロードしています。なお、この動画を撮影したタイミングでは、マウスカーソルの非表示が設定できていませんでした🙇
ラズパイ起動時にブラウザを全画面で表示する pic.twitter.com/S8xJT0qDUh
— もっちー (@mochi_2225) July 10, 2024
おそらくsleep
を設定しているためですが、ブラウザの起動までラグがあるなど、まだまだ改善が必要な箇所もあるのかなと思っています。ただ、最低限、ブラウザを起動し任意のホームページを全画面で表示するといったことはできたのかなと思っています。
おわりに
主にsystemd
の部分ですが、まだまだ私自身も自信を持って説明の出来かなった内容も多くありました。それらは今後も治してみて、その都度記事の方でも修正・補足していけたらなと思っています。
より良い設定方法がありましたら、ぜひコメントなどでいただければ幸いです。
参考