産業用ラズパイでも簡単にカメラを繋げられる

産業用に画像で判別する装置を導入すると聞くと、大層な機械と予算を想像される人は多いでしょう。
カスタムプログラムは別にして、ハードウェアがPL-R4といった産業用ラズパイなら、汎用カメラと各種センサーを活用すれば安価に構築できます。
小規模な用途でも無理がないように思えます。

試用している製品PL-R4のComputeModule4(以下、RPI CM4)は、ホビーユースのRaspberry Pi 4(以下、Pi 4)とほぼ変わりません。いつものUSB接続のウェブカメラや公式からも販売されているカメラモジュールを使って試すことができました。

産業用ラズパイならではの設定も含め、カメラを繋いで違いを確かめてみました。

接続できるカメラ

接続できるカメラ

産業用のラズパイも通常のラズパイ同様に、各種カメラを取り付けられ、静止画と動画を撮影することができます。

基板にあるCSIポートに接続するカメラは、カメラモジュールと呼ばれて販売されています。
USB接続の汎用ウェブカメラも使うことができます。
必要な品質に合わせて複数の製品から選択が可能ですね。

  • CSI
  • USB

カメラモジュールは、Raspberry Pi 財団から公式に販売されています。

中でもHQカメラは望遠レンズや広角レンズも使用でき、Raspberry Piに接続できるカメラとして非常に高画質です。(1290万画素)
産業用途では特に利用価値があるでしょう。

HQカメラ
カメラモジュール

今回テストしたカメラは、左から高画質のHQカメラ(公式、三脚別売)、カメラモジュールV3 (公式、ケース別売)、Logicool製ウェブカメラC270nです。

この他にも多種多様なカメラが接続できます。(赤外線カメラ、熱感知用途、屋外用途など)
使用環境に適したカメラが選べると思います。

かんたん挿すだけウェブカメラ

お手軽なUSB接続のウェブカメラは、コロナ禍以降に多くの方が使う機会になったでしょう。
WindowsやMacと同様に、Raspberry Pi でもUSBで接続するカメラはそのまま使えます。この辺は一般的なPCと同じようになってきました。

これは産業用ラズパイでも同じです。
PL-R4でもUSBに接続するだけで、デスクトップ環境(GUI)とコマンド環境(CUI)で操作できます。

行うのは、Raspberry Pi OSでカメラを使うソフトウェアを選ぶだけです。

Guvcview

GUI環境でお薦めなのは、Guvcviewです。

コントロール用と表示用の2つのウィンドウに分かれています。
ボタンで静止画も動画も無理なく動作します。

Gnvcview

Guvcviewをインストールだけでウェブカメラを認識しました。
何も設定していません。

sudo apt install guvcview

一般的なPi 4と同様に、RPI CM4のラズパイでもUSB接続したカメラを使うならGuvcviewは簡単でした。

Raspberry Pi で使用するUSB接続のウェブカメラは、最新ではない製品の方が動く確率が高いと思います。
試したC270nは2019年に発売したモデルです。1台あると便利ですね。

カメラモジュールの接続

Raspberry Pi の公式カメラモジュールならば、USB接続のウェブカメラと同様にCSIケーブルを挿すだけで認識します。
こちらも特に設定などせず、libcameraコマンドで動作します。

但し、サードパーティ製のカメラモジュールは自動的には認識しないので少し設定ファイルを書き換える必要があります。

今回試用したPiLink株式会社のPL-R4は、設定ファイルの書き換え以外に、CSIポートの使用にハードウェア側で設定も必要です。

  • ハードウェアでのスイッチ変更
  • config.txtの編集
  • 起動時に読み込むdt-blob.binファイルの用意
connect CSI cable

CSIポートに繋ぐフラットケーブルの向きに注意します。写真だと奥側が青い帯になり、手前が端子側です。

試用した製品は、USBタイプ(IP20)ですと、パネルにスリットがありカメラケーブルを引き出せます。

slit for CSI calbe

フラットケーブルや先にある端子部分は断線しないよう注意して扱いましょう。

ハードウェアの設定変更

産業用ラズパイでは多機能にしている分だけ、ハードウェアとして設定を切り替える必要があります。

基板にスイッチ類がいくつかあり、これらディップスイッチを適正な設定を施す必要があります。

この辺はホビーユースと異なります。
通常のPi 4やPi 5では設定が異なりますのでご注意ください。

使用しているPL-R4でご説明します。

DIP switch

ハード的な変更の他にも/boot/config.txtに必要な修正を行います。

ホームユースのPi 4などでは、公式のカメラモジュールの使用であれば、何も変更せず繋げるだけで認識します。
config.txt内で有効にされているdisplay_auto_detect=1は公式カメラモジュールに対して有効です。

サードパーティ製のカメラモジュールや、今回のような産業用ラズパイでは自動認識をコメントアウトして、カメラの種類を指定する必要があります。

/boot/config.txtの記述例:

# Automatically load overlays for detected DSI displays
#display_auto_detect=1
[all]
dtoverlay=imx708

カメラモジュールによって指定する名称が異なるので注意してください。

イメージセンサー別の名称:

| 公式カメラモジュール | モデル | 名称 |
| :——–: | :-: | :—-: |
| | V1 | OV5647 |
| | V2 | IMX219 |
| | HQ | IMX477 |
| | GS | IMX296 |
| | V3 | IMX708 |
今回は公式のV3と、同じく公式のHQカメラを使いましたので、それぞれIMX708、IMX477を指定しています。

他にもサードパーティー製カメラモジュールもあり、IMX290、IMX327、IMX378、IMX519、OV9281と分けられています。
CSI接続カメラの製品詳細などで、イメージセンサー名として記載されています。指定する名称は説明書や購入先で確認してください。

この他、PL-R4ではモデルの名称以外にも修正が必要になり、最終的には次の箇所を変更します。

sudo nano /boot/config.txt
# 自動認識をコメントアウト
# Automatically load overlays for detected cameras
#camera_auto_detect=1

#ディスプレイの自動認識をコメントアウト
# Automatically load overlays for detected DSI displays
#display_auto_detect=1

# ドライバの有効化
# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2

#WD/CSIに関する記述をコメントアウト
#dtparam=i2c0_baudrate=400000
#dtoverlay=i2c0,pins_0_1
#WD/CSI select
#dtparam=i2c1_baudrate=400000
#dtoverlay=i2c1,pins_44_45

# Camera Module
dtoverlay=imx708

それぞれ記載が予め存在します。ほぼコメントを有効/無効にするだけです。

この他にも、モデルによりウォッチドッグが設定されている場合は、該当箇所をコメントアウトします。

sudo nano /etc/rc.local
# ウォッチドッグコメントアウト
#WD
#python /home/pi/wdrst.py

Pi 5で扱うbookwormでは、そもそもconfig.txtの場所が違います。(bookworm:/boot/firmware/config.txt
この記事ではPi 4系のbullseye環境の/boot/config.txtで書いています。

dt-blob.binの修正

RPI CM4とI/Oボードを用いたPL-R4の場合は、さらに修正が必要です。

馴染みがないかもしれませんがGPUによって使用されるdt-blob.binの修正が必要になります。

ザックリとご説明すると、GPIOに接続されたデバイスを、他の機能でも割り当てるためピン番号を変更する必要があるからです。

詳しくは公式ドキュメントで確認してください。
(公式ドキュメント:https://www.raspberrypi.com/documentation/computers/compute-module.html#device-tree)

PL-R4をお使いの方に向けて修正手順をご紹介しておきます。

minimal-cm-dt-blob.dtsを先の公式ドキュメントからダウンロードできます。
これを編集していくことで定義していきます。

271行目から編集:

          pin_define@ID_SDA {
             type = "internal";
             number = <44>;
          };
          pin_define@ID_SCL {
             type = "internal";
             number = <45>;
          };
          pin_define@CAMERA_0_I2C_PORT {
             type = "internal";
             number = <1>;
          }; 

そしてコンパイルします。コンパイラーは最初からインストール済みです。(warningが出ても大丈夫でした)

sudo dtc -I dts -O dtb -o minimal-cm-dt-blob.dtb minimal-cm-dt-blob.dts

最後に/bootディレクトリへdt-blob.binというファイル名でコピー配置すれば完了です。再起動後に有効になります。

sudo cp minimal-cm-dt-blob.dtb /boot/dt-blob.bin

この辺は少しだけ難しく感じる作業です。その分だけ役割を変えられるともいえます。

以上のように、主に3つを修正しました。

  • ハードウェアとしてスイッチの切替
  • dt-blob.binの修正
  • config.txtの修正

設定が終わったら、再起動後に次からの確認するコマンドで試してみてください。

コマンドで使う(CSI接続カメラモジュール)

CSIポートへ接続したカメラモジュールは、libcameraコマンドとPythonで扱うPicamera2モジュールを使うことができます。※これら2つはbullseye以降ならプリインストールされています。

OSバージョンがbullseyeのお話です。Pi 5のbookwormではrpicamコマンドになっています。ちょっとややこしいですね。
以前のラズパイモデルやOSでカメラモジュールを扱う際は気を付けてください。

raspi-configから設定できるLegacy cameraモードは無効のままでOKです。

ややザックリとご説明すると、これはPi 3でraspistillコマンドを扱うのに必要なオプションです。
次のような関係になります。

  • Pi3系(buster) raspistillコマンド
  • Pi4系(bullseye)libcameraコマンド
  • Pi5系(bookworm)rpicamコマンド

Raspberry Piとカメラモジュールは少しややこしい経緯があります。

Raspberry Pi OS Bookworm は、カメラ キャプチャ アプリケーションの名前を libcamera-* から rpicam-* に変更しました。Bookworm より前の Raspberry Pi OS バージョンでは、libcamera-* という名前が引き続き使用されます。

公式の情報も、基本はPi 5とbookwormの環境で説明されており、bullseye以下では少し前の情報が有効です。
インターネットではたくさんの情報がありますが、2022年辺りの情報が役立つでしょう。

接続を確認するコマンド

カメラモジュールを接続できたら、カメラを認識しているのかを確認します。

libcameraコマンドでカメラのリストを表示させます。
ここでエラーであれば、CSI接続ケーブルの差し込みが甘いか、config.txtなどに追記した箇所の間違いがないか確認します。

libcamera-hello --list-cameras

認識されていれば、次のように表示されるハズです。

Available cameras
-----------------
0 : imx708 [4608x2592] (/base/soc/i2c0mux/i2c@1/imx708@1a)
    Modes: 'SRGGB10_CSI2P' : 1536x864 [120.13 fps - (768, 432)/3072x1728 crop]
                             2304x1296 [56.03 fps - (0, 0)/4608x2592 crop]
                             4608x2592 [14.35 fps - (0, 0)/4608x2592 crop]

エラーが出ていないかカメラの名称にあたるimx*で探してみるのも手です。(imx219など)

dmesg | grep imx*

ここまでで動作していない場合は、CSIポートへ差し込んだフラットケーブルを確認しましょう。上手く差し込まれていない可能でもあります。

libcameraコマンド

libcameraコマンドは、オプションやパラメーターがたくさんあります。

単純に静止画を撮影するなら次のようにします。

libcamera-jpeg -o test1.jpg -t 2000 --width 640 --height 480

ライブビューのように表示するなら次のようにします。

libcamera-hello -t 0

静止画、動画とコマンドが分けられています。オプションはそれぞれの--helpを参照してください。

libcamera-jpeg
libcamera-raw
libcamera-still
libcamera-vid 

VNCを介しても表示することができます。

Pythonで扱うカメラモジュール

カメラモジュールはPythonでPicamera2が使えます。OSがbullseye以上であれば最初からインストール済みです。

サンプルプログラム:

from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(2)
picam2.capture_file("test.jpg")

公式サイト:https://www.raspberrypi.com/documentation/computers/camera_software.html#rpicam-apps

コマンドで使う(USB接続ウェブカメラ)

USB接続のウェブカメラでは、コマンドベースで制御できるfswebcamというアプリを使います。

sudo apt install fswebcam

インストールしてから、ユーザーをvideoグループに加えます。今ログインしているユーザー名に置き換えて読んでください。
これでsudo権限のエラーは出なくなります。

sudo usermod -a -G video ユーザ名

基本の書式はこれです。

fswebcam test.jpg

デフォルトだと352×288と小さい解像度になっています。

オプションで解像度を指定してもう一度実行してみましょう。

fswebcam -r 1280x720 test2.jpg

デフォルトでは撮影された画像の下部にバーが表示され、右下に日時が合成されます。
これが文字化けしているなら、日本語フォント(noto-fonts)をインストールすると解消します。

sudo apt install fonts-noto-cjk

画像の下部に出ているバー状の出力をやめるなら、--no-bannerオプションで消えます。
オプションはfswebcam --helpで確認してください。

日付けのファイル名

fswebcamには日付けや連番といったファイル名の命名機能がありません。公式ではシェルスクリプトで代用するよう紹介されています。

シェルスクリプトといっても簡単で、記述する内容は3行です。
次のように適当な場所にshファイルを新規に作り、3行を追記して最後に実行権限を与えて使います。

nano webcam.sh

スクリプト例はファイル名に日付けが入るようにして、fswebcamで解像度1280×720としてコマンドを実行させる内容です。

#!/bin/bash

DATE=$(date +"%Y-%m-%d_%H-%M-%S")
fswebcam -r 1280x720 --no-banner $DATE.jpg

実行権の付与はchmod。

chmod +x webcam.sh

同じディレクトリに移動しているなら、次のシェルコマンドで静止画の撮影を実行できます。

./webcam.sh

実行後のターミナル出力を読むと、ファイル名が日時になったことが確認できました。

--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to '2024-09-23_13-27-18.jpg'.

USB接続の一般的なウェブカメラなら、アプリケーションさえ用意すれば挿すだけで簡単に使えます。

USB接続のウェブカメラならffmpegを利用

次は動画です。
先程のGuvcviewならGUI画面のボタン1つで済みますが、コマンドでの実行は別のアプリケーションが必要です。

CSI接続したカメラモジュールであれば、動画を撮影するコマンドもプリインストールされていますが、USB接続のウェブカメラであればffmpegコマンドを使うことで代用できます。

コマンド実行前に確認しておくことがあります。
コマンドではオプションにパラメータを指定する必要があるため、使っているカメラの対応範囲を把握しておきましょう。

カメラによって性能も異なりますから、間違えたパラメータにならないようにするためです。

使用したカメラC270の場合、フレームレート30は、YUYV (YUYV 4:2:2)形式だと640x以下にしか対応していないことが分かりました。ちょっと小さいですよね。

MJPG (Motion-JPEG, compressed)形式なら1270xも対応していました。

v4l2-ctl -d /dev/video0 --list-formats-ext

‘YUYV’ (YUYV 4:2:2)
Size: Discrete 640×360
Interval: Discrete 0.033s (30.000 fps)
‘MJPG’ (Motion-JPEG, compressed)
Size: Discrete 1280×720
Interval: Discrete 0.033s (30.000 fps)

この設定を変えるのはv4l2-ctlコマンドで可能です。
cオプションに値を指定すれば変更できます。(例-c <ctrl>=<val>

詳しくはコントロールできる一覧を確認してください。

v4l2-ctl -d /dev/video0 --list-ctrls-menu

ffmpegコマンドで動画撮影

ffmpegを使うには、様々なオプションを付けて実行することになります。
ffmpegはラズパイだけに限った話ではありません。詳しくは別途、ffmpegを調べてください。

次のコマンドが、C270で録画できたオプションです。

カメラ本体にマイクも付いているタイプなので一緒に音声も取得できます。まずまずの高感度で綺麗に録音もできました。
オプションの最後に出力ファイル名であるout.mkvと指定しています。

ffmpeg -f alsa -i pulse -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 -i /dev/video0 -c:v copy -c:a libopus -b:a 192k "out.mkv"

詳しい説明は省きますが、カメラによっても異なるため、ビデオサイズやフレームレートがどこまで対応してるかによりパラメータを調整してください。
マイクの有無によってもオプションの指定を変更します。

Ctrl + C で録画を止めます。

産業用ラズパイでもUSB接続のウェブカメラはホビーユースと同じように使えました。
これはお手軽ですね。

産業用途にCSIカメラモジュールとUSB接続カメラ

産業用ラズパイでもUSBでカメラを接続できたり、CSIポートのカメラモジュールを利用できます。
使用する産業現場でも、各種センサーと共にカメラのニーズは高まっています。

よくある事例として次のような事例があてはまります。

  • 人物を感知し判別したい
  • 熱の変化を感知させたい
  • 生産物の形状を判別させたい
  • QRコードを読み込ませたい
  • 単純な監視カメラ映像を取得したい

産業用ラズパイのPL-R4では、ホームユースのPi 4とは異なりI/Oボードのスイッチングや設定の変更が必要でした。
それ以外はPi 4と同じように利用できます。

産業用ラズパイはハードウェアとしての導入に低コスト化が図れるデバイスです。
ホームユースと違い、堅牢なケースやコネクターが装備されていても低電力は変わりません。

カメラとセンサー、システム連携など多機能にすることもできるため、規模に関わらず導入するメリットがあります。


記事寄稿:ラズパイダ

非エンジニアでも楽しく扱えるRaspberry Pi 情報サイト raspida.com を運営。ラズベリーパイに長年触れた経験をもとに、ラズベリーパイを知る人にも、これから始めたいと興味を持つ人にも参考になる情報・トピックを数多く発信。PiLinkのサイトへは産業用ラズベリーパイについて寄稿。