メインコンテンツへスキップ
見出し画像

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コマンドを使用して、利用可能なパッケージの情報を検索することもできます。

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

    • 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(ソフトウェア)です。これは従来のraspistillやraspividコマンドに代わるものでより柔軟で高度なカメラ操作を可能にします。

     今回は公式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モジュールは次回の記事で書こうかな・・・・


     
     

    KIYO

     
     
    普段は製造業で企画/開発/設計しております。記事はプログラミング・機械学習、IoT関係の記事をメインで作成し、なるべく1つの記事で知りたいことを網羅していきます。内容は学術的より実装・アウトプット(ほしくなるもの)を重視して作成しています。 面白そうな仕事があればやりたいです!

    あなたへのおすすめ