Make Technology

Raspberry PiでWebカメラを自動起動

Make
スポンサーリンク

どうも、Reveです。実に3か月ぶりの更新です…orz

少し前に、仕事の関係でラズパイからWebカメラの映像を流し続けるシステムを簡易的に用意したので、今回はその実装をつらつら書いていこうと思います。なお、実装自体は特に機密事項なんてありませんのでご安心を(謎

概要

前述のとおり、電源を入れたら自動的にWebカメラの映像を流すシステムを作ります。動作は以下の通り。

  1. Webカメラとモニターをラズパイに接続
  2. ラズパイの電源ON
  3. デスクトップ画面が出てきたら、Webカメラからの映像を自動的に流す

実装

事前準備(ハードウェア)

まずは以下のものを用意します。

  • Raspberry Pi (pico以外)
  • micro SDカード 8GB~
  • Webカメラ (USB接続)
  • HDMI接続のディスプレイ
  • マウス、キーボード (USB接続)
  • 5V電源 (USB充電器 / モバイルバッテリー)
  • OS書き込み用のPC (Windows / Mac / Ubuntu x86)

一応、注意点としてラズパイはpico以外(ラズパイOSが動くもの)を選んでください。できれば初代とzero以外のModel Bがオススメ(AはUSBコネクタが少ないので)。

またラズパイ4は映像端子がミニHDMIのため、変換ケーブルかアダプタが必要です。

事前準備(ソフトウェア)

以下のURLから、専用のソフトウェアをOS書き込み用のPCにインストールして、ソフトウェアからマイクロSDにOSを書き込みます(詳細は省略)。

Raspberry Pi OS – Raspberry Pi
From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.

なお、OSは「Raspberry Pi OS (32bit)」を前提としています(他は未検証)。

開発環境の構築

ラズパイOSを起動できたら、まずターミナルで以下のコマンドを入力して、必要なパッケージをインストールします。

環境構築はこれだけですが、後述のプログラム開発で映らない場合は qv4l2 コマンドでカメラが映るか確かめられます。

プログラム開発

続いて、OpenCVでカメラの映像を流し続けるプログラムを作ります(Python)。コードはこちらをお借りします。

デバイス名の固定

手動だとほぼ問題ないのですが、自動起動の場合、プログラムを立ち上げても権限やデバイス名などでカメラとの接続に失敗する場合があります。そこで、udevルールファイルを作成して自動起動サービスに連携させます。

まず、以下のコマンドで接続しているUSBデバイスの情報を取得します(参照)。

Webカメラの情報が取得出来たら、「idVendor(ベンダーID)」と「idProduct(プロダクトID)」の値を覚えておき、エディタを開いてファイルを作成し、

以下の一文をファイルに記入して保存します(各項目について:参照1参照2、参照)。

  • KERNEL:元のデバイス名(接続時)
  • SUBSYSTEM:デバイス制御のサブシステム(キャプチャ機器は video4linux)
  • SUBSYSTEMS:サブシステムの親 (USB)
  • ATTR{…}:デバイスの属性。ここでは idVendor と idProduct を指定
  • SYMLINK:デバイスファイルのシンボリックリンク (+= は追加)
  • TAG:紐づけするシステム
  • MODE:権限
  • ENV{SYSTEMD_WANTS}:依存関係。次に作成する自動起動サービスと連携

正しく記載されていれば、以下のコマンドでWebカメラが指定のデバイス名で認識されていると分かります。

ちなみに、上記のルールファイルはこのカメラを使用した場合のものです。

自動起動サービスの設定

まずは、好きな場所(今回はデスクトップを想定)に daemon.env というファイルを作成し、以下の様に編集します。

次に、ターミナルで以下のコマンドを入力して

以下の通りに編集します。今回はGUIが無いと動かないので、システム環境の指定を graphical.target としています。(ユニットのパラメータについて:参照)。

終わったら、以下のコマンドでサービスの自動起動を有効にします。

正しく動作しているかは、以下のコマンドで確認できます。

正常に読み込まれていれば、次からの起動時にWebカメラの映像を自動的に流してくれるようになります。

参考

クラウド側からのコマンドで動画が取得できる監視カメラを作ってみました | DevelopersIO
1 はじめに CX事業本部の平内(SIN)です。 Raspberry Piで監視カメラを作成し、クラウド側からコマンドを送ることで、指定した時間の動画が取得できる仕組みを試してみました。 この仕組みの利点としては、以下の …
(ラズパイで)USBカメラの映像をPythonのOpenCVで高速に表示する - Qiita
非常に初歩的な話です…USBカメラではなくて、ラズパイ専用カメラでも Raspberry Piと純正カメラモジュールで監視カメラを作る、おそらく正しい方法 jessie版 (motion + v4l…
デバイス名を固定する – planset blog
Systemd Services: Reacting to Change - Linux.com
I have one of these Compute Sticks (Figure 1) and use it as an all-purpose server. It is inconspicuous and silent and, as it is built around an x86 architecture...
systemd のユニットファイルの作り方
CentOS での systemd のユニットファイルの作り方についてです。自作サービスが定義できるので、systemctl start myservice のような使い方ができるようになります。
タイトルとURLをコピーしました