見出し画像

Raspberry Pi4×カメラモジュールV3の環境構築


1.概要

 Rasberry Pi4(以下:ラズパイ)でRaspberry PiカメラモジュールV3を使用するための環境構築を記載しました。

2.購入品

2-1.基本部品

 まずは下記記事より基本的に必要な部材は事前に購入しておきます。

  • Rasberry Pi:本体

  • マイクロSD:OS書き込み用のメモリカード

2-2.Camera Module

 結論は「Raspberry Pi カメラモジュール V3 広角(SC0874)」を購入しました(スイッチサイエンスは品切れのためKSYで購入)。

【カメラモジュールV3とは】
 過去の2022年に購入したのは「Raspberry Pi Camera Module V2 ラズベリーパイ カメラ ソニーIMX219PQ」でした。

 2023年1月に新しい規格の「Raspberry Pi カメラモジュール V3」が販売されておりV2と比較して下記特徴があります。

  • メリット:

    • 高解像度

    • 広角モデル(120°)も販売

    • オートフォーカスが追加

  • デメリット:

    • CSIインターフェイスが無いと接続不可(※これはV2でも同じ)

    • 最新OSであるBullseyeでのみサポート

https://raspida.com/camera-module3

【コラム:カメラホルダー】
 下図の通りカメラのフラットリボンケーブルはふにゃふにゃなので撮影箇所を固定したい場合は何かあった方が良いです。
 よさそうなものがあったら購入したいため現在探してます。

【参考:NoIRとは】
 
カメラモジュールは2つのバージョンがあります。

  • 標準バージョン:通常の光の中で写真を撮るように設計されています

  • NoIR バージョン:赤外線フィルタを持たないので、赤外線の光源と一緒に暗闇の中で写真を撮ることができます

 下記サイトでは参考図が紹介されていました。

https://raspi.tv/2016/new-and-old-raspberry-pi-camera-comparison-shots-1-3-2-1-noir

2-3.仕様まとめ

 同じ仕様でないとうまくいかない可能性があるためご参考までに。

  • シングルボード:Raspberry Pi 4 Model B (8GB)

  • Rasberry Pi OS:Bullseys 11(リリース日時:2023年5月3日)

  • カメラ:Rasberry Pi カメラモジュールV3

3.カメラ取付

 カメラの取り付けは下記の通りです。

  1. カバー(黒いプラスチック)を引き上げる

  2. カメラのケーブルを差し込む

  3. カバーを戻す

 CSIコネクタを差し込む向きは下図の通りです。向きを間違えると認識されないためご留意ください。

【カメラ取付の参考記事】

4.参考:Linuxコマンド

 これ以降で使用するLinuxコマンドを参考用として記載します。

4-1.Linuxコマンド

  • sudo:「SuperUser DO」の略で、特定のコマンドをシステム管理者(rootユーザー)として実行するためのコマンドです。sudoを使用することで、一時的に高い権限を持つrootユーザーとしてコマンドを実行できます。

  • apt:「Advanced Package Tool」の略で、DebianベースのLinuxディストリビューション(例: Ubuntu, Raspberry Pi OS)でソフトウェアパッケージを管理するためのツールです。aptを使用することで、ソフトウェアのインストール、アップデート、削除などの操作を行うことができます。また、apt-cacheコマンドを使用して、利用可能なパッケージの情報を検索することもできます。

  • updateaptのサブコマンドの一つでソフトウェアのリポジトリから最新のパッケージ情報を取得して、ローカルのパッケージデータベースを更新

  • lsb_release:Linux Standard Base (LSB) に関する情報を表示するコマンドであり、-aオプションですべての情報を表示

  • shutdown:コンピューターの電源をオフ/再起動するためのコマンド

    • -rオプション:再起動

  • nano:テキストエディタの一つ。テキストファイルを開いて編集できる

4-2.Rasberry Pi用コマンド

  • vcgencmd:Raspberry Piのハードウェア関連の情報や設定を取得・変更するためのコマンド

4-3.コマンド使用例

 実際のコマンド使用例は下記の通りです。

  • sudo apt update:インストール可能なソフトウェアのパッケージのリストを最新の状態に更新

  • sudo apt upgrade:インストールされているソフトウェアを最新のバージョンに更新

  • sudo nano config.txt:スーパーユーザー権限でnanoエディタを用いてconfig.txtファイルを開く

  • sudo shutdown -h now:今すぐシャットダウン(電源OFF)

  • shutdown -r now:今すぐ再起動を実施する

5.環境構築

 ラズパイでカメラが認識・実装できるように環境構築していきます。念のために、事前にソフトフェアを最新の状態に更新しておきます。

[terminal]
sudo apt update
sudo apt upgrade

 参考として環境構築は下記記事が非常に参考になりました。

5-1.インターフェースの確認

 インターフェース設定はOSにより異なり、下記コマンドで確認できます。

[Terminal]
lsb_release -a
[OUt]
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye

【旧Rasberry Pi OS使用の方】
 旧OSを使用の方は「設定->Rasberry Piの設定->インターフェースタブ」から”カメラ”を有効化すれば問題ありません。

【最新のRasberry Pi OS使用の方】
 最新のOS(私のはBullseye 11)ではRasberry Piの設定にカメラの設定はありません。現在の状態は下記コマンドで確認できます。

[Terminal]
vcgencmd get_camera
[OUT]
supported=1 detected=1, libcamera interfaces=0

 出力結果は下記の通りです。

  • supported:カメラモジュールがサポートされているかどうかを示す。

    • 1はサポートされている、0はサポートされていない

    • 出力は1のため問題なし

  • detected:カメラモジュールが物理的に接続されているかどうかを示す。

    • 1は接続されている、0は接続されていない

    • 出力は1のため問題なし

  • libcamera interfaces:libcameraという新しいカメラAPIが利用可能か

    • 1は利用可能、0は利用できない

    • 出力は0のため設定が必要

【参考:カメラの接続確認】
 ”libcamera-hello”でカメラ動作を確認できます。この段階ではサポート/検出もされているのに”no cameras available”のエラーが発生します。

5-2.カメラの有効化

 新OSの方は”sudo raspi-config”から下記手順で有効化しておきます。
おそらく本作業は不要だと思います。また設定後に実行すると動作しなくなる(再設定が必要)ため、扱いには注意が必要です
※”Please note that this functionality is deprecated and will not be supported for future development.”とあるように非推奨で将来消えるため、本作業は不要かもしれないです。

  1. Interface Optionsを選択

  2. Legacy Cameraを選択

  3. 「Would you like to enable legacy camera suport?」で”はい”を選択

  4. ”了解”を押して終了する

[Terminal]
sudo raspi-config

5-3.Camera Configuration

 公式Docsより下記条件では”/boot/config.txt”内のcamera configurationを修正する必要があるとのことです。

  • You are using a 3rd party camera (the manufacturer’s instructions should explain the changes you need to make).

  • You are using an official Raspberry Pi camera but wish to use a non-standard driver/overlay.

https://www.raspberrypi.com/documentation/computers/camera_software.html#getting-started

 そこで下記手順で"config.txt"を修正します。参考としてnanoエディタのショートカットも記載しておきます。

config.txtの修正手順

  • cdコマンドでbootへ移動し、nanoエディタでconfig.txtを開く

  • 既存の”dtoverlay”の頭に"#"を付けてコメントアウトをする

  • その下にdtoverlay=imx708を追加

  • 上書き保存(Ctrl+o)してnanoエディタを終了(Ctrl+x)

  • 再起動を実行:shutdown -r now

【nanoエディタのショートカット】

  • ctrl+o:保存

  • ctrl+x:エディタを終了

  • nanoは行コピーしかできないためコピーは無し

[Terminal]
cd /boot
sudo nano config.txt
[config.txt]
hdmi_force_hotplug=1
dtparam=i2c_arm=on
dtparam=spi=on
enable_uart=1
display_rotate=0
max_usb_current=1
config_hdmi_boost=7
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_drive=1
hdmi_cvt 800 480 60 6 0 0 0
# dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,p>
dtoverlay=imx708
gpu_mem=128
[Terminal]
shutdown -r now

【修正前config.txt】

【修正後config.txt】

5-4.最終確認

 上記全て完了したら”vcgencmd get_camera”を実行します。出力が”supported=1 detected=0, libcamera interfaces=1”であれば成功です。

[Terminal]
vcgencmd get_camera
[OUT]
supported=1 detected=0, libcamera interfaces=1

 最終確認として”libcamera-hello”を実行します。成功すれば5s間カメラが起動されます。

[Terminal]
libcamera-hello

5-5.コラム:raspi-configの注意点

 5-2.でraspi-configからカメラの有効化を実施しました。おそらくですが、これを実行すると前節で実行したconfig.txtの変更が復元されるため再設定が必要になる可能性があります。
 カメラが動かなくなった場合は再度config.txtを書き換えれば動くようになります。

[Terminal]
sudo raspi-config

6.参考:カメラ確認のコマンド

 カメラの接続状態を確認するためのLinuxコマンドを参考としていくつか紹介します。

6-1.デバイスファイル一覧:ls /dev/video*

 /devディレクトリ内のvideo*という名前を持つデバイスファイルをリストアップします。これにより、現在のシステムに接続されているカメラデバイスの数や名前を確認できます。

[Terminal]
ls /dev/video*

6-2.USBデバイス一覧:lsusb

 lsusbコマンドでUSBデバイス一覧を表示できます。Camera ModuleはCSIインターフェイスを使用しているためlsusbは影響ありませんが、USBカメラなどを接続するとlsusbでデバイスが表示されます。

[Terminal]
ls /dev/video*

6-3.カメラの詳細情報:v4l-utils/v4l2-ctl

 v4l2-utils(Video4Linux utils)パッケージに含まれるv4l2-ctlを使用することでカメラの詳細情報が取得できます。

[Terminal※パッケージのインストール]
sudo apt install v4l2-utils

 v4l2-ctlは複数のオプションがあり、各種情報を取得できます。

  1. v4l2-ctl --list-devices:接続されているVideo4Linuxデバイスの一覧を表示

  2. v4l2-ctl --all:ドライバー情報やビデオフォーマットの形式について確認

  3. v4l2-ctl --device=<Path> --all:カメラデバイスがサポートするすべての機能を表示

    • 記載例:v4l2-ctl --device=/dev/video2 --all

[Terminal]
v4l2-ctl --list-devices

[OUT]
bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12
	/dev/video18
	/dev/video31
	/dev/media3

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16
	/dev/video20
	/dev/video21
	/dev/video22
	/dev/video23
	/dev/media2
	/dev/media4

unicam (platform:fe801000.csi):
	/dev/video0
	/dev/video1
	/dev/media1

rpivid (platform:rpivid):
	/dev/video19
	/dev/media0
[Terminal]
v4l2-ctl --all

[OUT]
Driver Info:
	Driver name      : unicam
	Card type        : unicam
	Bus info         : platform:fe801000.csi
	Driver version   : 6.1.21
	Capabilities     : 0xa5a00001
		Video Capture
		Metadata Capture
		Read/Write
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x25200001
		Video Capture
		Read/Write
		Streaming
		Extended Pix Format
Media Driver Info:
	Driver name      : unicam
	Model            : unicam
	Serial           : 
	Bus info         : platform:fe801000.csi
	Media version    : 6.1.21
	Hardware revision: 0x00000000 (0)
	Driver version   : 6.1.21
Interface Info:
	ID               : 0x03000008
	Type             : V4L Video
Entity Info:
	ID               : 0x00000006 (6)
	Name             : unicam-image
	Function         : V4L2 I/O
	Flags         : default
	Pad 0x01000007   : 0: Sink
	  Link 0x0200000a: from remote pad 0x1000002 of entity 'imx708_wide': Data, Enabled, Immutable
Priority: 2
Video input : 0 (unicam-image: ok)
Format Video Capture:
	Width/Height      : 640/480
	Pixel Format      : 'YUYV' (YUYV 4:2:2)
	Field             : None
	Bytes per Line    : 1280
	Size Image        : 614400
	Colorspace        : sRGB
	Transfer Function : sRGB
	YCbCr/HSV Encoding: ITU-R 601
	Quantization      : Limited Range
	Flags             : 
[Terminal]
v4l2-ctl --device=/dev/video2 --all

[OUT]
Driver Info:
	Driver name      : unicam
	Card type        : unicam
	Bus info         : platform:fe801000.csi
	Driver version   : 6.1.21
	Capabilities     : 0xa5a00001
		Video Capture
		Metadata Capture
		Read/Write
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x25200001
		Video Capture
		Read/Write
		Streaming
		Extended Pix Format
Media Driver Info:
	Driver name      : unicam
	Model            : unicam
	Serial           : 
	Bus info         : platform:fe801000.csi
	Media version    : 6.1.21
	Hardware revision: 0x00000000 (0)
	Driver version   : 6.1.21
Interface Info:
	ID               : 0x03000008
	Type             : V4L Video
Entity Info:
	ID               : 0x00000006 (6)
	Name             : unicam-image
	Function         : V4L2 I/O
	Flags         : default
	Pad 0x01000007   : 0: Sink
	  Link 0x0200000a: from remote pad 0x1000002 of entity 'imx708_wide': Data, Enabled, Immutable
Priority: 2
Video input : 0 (unicam-image: ok)
Format Video Capture:
	Width/Height      : 640/480
	Pixel Format      : 'BGR3' (24-bit BGR 8-8-8)
	Field             : None
	Bytes per Line    : 1920
	Size Image        : 921600
	Colorspace        : sRGB
	Transfer Function : sRGB
	YCbCr/HSV Encoding: ITU-R 601
	Quantization      : Full Range
	Flags   

7.カメラを使ってみる:libcamera

 libcameraとはLinux OSから複雑なカメラシステムを直接サポートするためのAPI(ソフトウェア)です。これは従来のraspistillraspividコマンドに代わるものでより柔軟で高度なカメラ操作を可能にします。

 今回は公式Docsを参照して簡単なコマンドを実行してみます。

  • libcamera-hello:ファイルは作成せずカメラを映すのみ

  • libcamera-jpeg:シンプルな画像キャプチャ

  • libcamera-still:”legacy raspistill options”をサポートした画像キャプチャ

  • libcamera-vid:動画撮影

  • その他:情報取得

 参考までに画像を保存するため"temp_photo"フォルダをデスクトップに作成して作業ディレクトリを変更しました。

[Terminal]
cd Desktop
mkdir temp_photo
cd temp_photo

7-1.libcamera-hello:動作チェック

 "libcamera-hello"はカメラをディスプレイに映すことのみ実行します。よっていわゆる"Hello world"的な存在です。
 "libcamera-hello"を実行すると5s間だけカメラを移すことが出来ます。

[Terminal]
libcamera-hello

【-tオプション:動作時間の設定】
 "-t <duration>"を指定することでミリsec単位で撮影時間を設定できます。時間指定なしで見たい場合は"-t 0"を指定します。

[Terminal]
libcamera-hello -t 0

7-2.libcamera-jpeg:シンプルな静止画

 "libcamera-jpeg"はシンプルな画像キャプチャコマンドとなります。実行すると5sec間プレビューが表示されフル解像度(4608×2592)で撮影されます。

[Terminal]
libcamera-jpeg -o shigotoneko.jpg

【オプション】
 オプションは下記の通りです。

  • -t <duration>:撮影時の待機時間

  • --width:横幅の設定

  • --height:高さの設定

7-3.libcamera-still:静止画(raspistillサポート)

 ”libcamera-jpeg”とほぼ同じですが旧APIの”raspistill options”をサポートしています。シンプルな撮影は”libcamera-still -o <ファイル名>”で実行できます。

[Terminal]
libcamera-still -o test.jpg

 7-3-1.Encoders:拡張子の設定

 拡張子を変えたりバイナリーデータ(RGB, YUV)を指定する場合は”-e (equivalently --encoding) ”オプションを指定します。

[Terminal]
libcamera-still -e png -o test.png
libcamera-still -e bmp -o test.bmp
libcamera-still -e rgb -o test.data
libcamera-still -e yuv420 -o test.data

 出力ファイルの結果はシンプル画像と見た目が同じため省略します。

 7-3-2.Raw Image

 直接イメージセンサから画像キャプチャする場合は"-r"オプションを指定します。今回は画像の見た目はほぼ変わりませんでした。

[Terminal]
libcamera-still -r -o test.jpg

7-4.libcamera-vid:動画

 動画撮影を実施するには”libcamera-vid”を使用します。デフォルトではRasberry Piの”H.264 encoder”を使用します。
 参考例として10秒(10,000msec)の動画を下記コマンドで撮影しました。

[Terminal]
libcamera-vid -t 10000 -o test.h264

 撮影した動画はvlcコマンドや一般的なアプリケーションで視聴できます。

[Termnal]
vlc test.h264

7-5.その他:プロパティ情報など

【libcamera-still --list-cameras:使用可能なカメラのリスト】
 現状使用可能なカメラのリストを出力するには下記コマンドを使用します。

[Termnal]
libcamera-still --list-cameras
[OuT]
Available cameras
-----------------
0 : imx708_wide [4608x2592 10-bit RGGB] (/base/axi/pcie@120000/rp1/i2c@88000/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]


8.実践事例

 下記にカメラを使用した実例記事紹介します。

9.おまけ:カメラスタンド

 カメラスタンドを探していたら自作している人もいたので参考までに

https://sozorablog.com/camera_shooting/
https://sozorablog.com/camera_shooting/
https://misoji-engineer.com/archives/raspberrypi-camera.html

参考資料

別添1.技術資料

別添2.Rasberry Pi Document

あとがき

 昔のOS×カメラモジュールV2だとインターフェースで設定して、ソケットに差して終わりだったのにめっちゃめんどくさいやん!

 PiCameraモジュールは次回の記事で書こうかな・・・・


この記事が気に入ったらサポートをしてみませんか?