2023年5月22日月曜日

CM4とIOボードでPiカメラを2台動かす


要約

公式のカメラなら自動認識機能(camera_auto_detect)が動いて認識されるようですが、手持ちのカメラはコピー品だからか認識されなかったので下記の変更を行いました。
v1カメラを利用したのでov5647を指定しましたが、それ以外のカメラを使う場合はICに合わせてov5647の部分を書き換えてください。
/boot/config.txt
# コメントアウト
# camera_auto_detect=1

# 末尾に追加
dtoverlay=ov5647
dtoverlay=ov5647,cam0

J6をジャンパピンなどで繋ぎます。


カメラ2台を繋いだ状態でCM4を起動すると、設定や接続が期待通りなら認識されます。
libcamera-hello --list-cameras
Available cameras
-----------------
0 : ov5647 [2592x1944] (/base/soc/i2c0mux/i2c@0/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]
1296x972 [43.25 fps - (0, 0)/2592x1944 crop]
1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]
2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]
1 : ov5647 [2592x1944] (/base/soc/i2c0mux/i2c@1/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]
1296x972 [43.25 fps - (0, 0)/2592x1944 crop]
1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]
2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]

cam0ポートのカメラ接続処理が失敗(J6を繋いでなかったり、cam0にカメラを繋いでなかったり)するとcam1のカメラの接続処理は実施されないので、cam0を有効にしたらcam0を優先して利用するのが良いです。

背景

CM4とIOボードを利用してPiカメラ2台を動かそうとしたところ、思いの外手間取ったので手順を記事に残します。

使ったもの

  • Raspberry Pi Compute Module4(通称CM4)
    今回利用したのはEMMC無し(SDカード利用)、無線無し、RAM2GBのCM4を利用しました。
    SC0679B
    自分が把握しているCM4はどれを使ってもカメラ2台接続用のピンが出ているので、この記事の内容を試せるはずです。
  • Raspberry Pi OS
    2023年5月公開のLite版を利用しました。
  • Compute Module4 IO Board
    公式のCM4の動作確認基板です。
  • ジャンパピン 2.54mm
    cam0の利用に必要なJ6ジャンパの接続に利用します。
  • Zero用Pi Camera
    IOボードのカメラのコネクタはPi Zeroと同じ大きさなので、Zero用のカメラを使いました。
    PiのBなどに繋げる用のコネクタのカメラを使う場合は変換ケーブルなどが必要です。
  • CM4を操作可能な環境
    PCからSSHなどで接続してコマンドを実行可能な環境を作るか、IOボードにモニタとキーボードとマウスを繋げて操作できる環境を作ってください。

/boot/config.txtに設定追加

公式のカメラなら自動認識機能(camera_auto_detect)が動いて認識されるようですが、手持ちのカメラはコピー品だからか認識されなかったので下記記述を追加しました。
v1カメラを利用したのでov5647を指定しましたが、それ以外のカメラを使う場合はICに合わせてov5647の部分を書き換えてください。
/boot/config.txt
# コメントアウト
# camera_auto_detect=1

# 末尾に追加
dtoverlay=ov5647
dtoverlay=ov5647,cam0

dtoverlayで設定可能な値はgithubのreadmeで見れます。
https://github.com/raspberrypi/linux/blob/rpi-6.1.y/arch/arm/boot/dts/overlays/README

J6ピンを接続

cam0の信号線有効化のためにJ6を繋ぎます。


IOボードの説明書によるとJ6を繋げることでcam0とdisp0のI2Cの信号線が有効になるようです。


カメラを接続

cam0とcam1にカメラを繋ぎます。
cam1の横のdisp0も同じ形状ですが、そちらに繋いでもカメラは認識されません。(J6を繋ぐとdisp0がcam0として使えるのかと間違った認識をしていて、1時間ほど時間を取られました。)


認識確認

カメラが認識されていれば下記のコマンド(libcamera-hello)で情報を表示できます。
libcamera-hello --list-cameras
Available cameras
-----------------
0 : ov5647 [2592x1944] (/base/soc/i2c0mux/i2c@0/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]
1296x972 [43.25 fps - (0, 0)/2592x1944 crop]
1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]
2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]
1 : ov5647 [2592x1944] (/base/soc/i2c0mux/i2c@1/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]
1296x972 [43.25 fps - (0, 0)/2592x1944 crop]
1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]
2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]

cam0ポートのカメラ接続処理が失敗(J6を繋いでなかったり、cam0にカメラを繋いでなかったり)するとcam1のカメラの接続処理は実施されないので、cam0を有効にしたらcam0を優先して利用するのが良いです。

撮影

下記のようなコマンド(libcamera-jpeg)でjpeg画像を作成できます。
libcamera-jpeg --camera 0 -o camera0.jpg --nopreview -t 1
libcamera-jpeg --camera 1 -o camera1.jpg --nopreview -t 1
--cameraで利用するカメラの番号を指定します。
-oで出力先ファイル名を指定します。
--nopreviewを付けるとプレビュー処理無しになります。
標準だと5秒間撮影するため-t 1で1ミリ秒のみ撮影としています。

撮影した画像はこちらです。
ov5647が撮影可能な最大サイズである2592x1944pxelの画像が作成されました。

camera0.jpg

camera1.jpg

期待通りそれぞれのカメラで撮影できました。

pythonから呼ぶならPicamera2ライブラリが使える

記事を書いている時点ではベータ版扱いですがpythonを使う場合はRaspberry Pi OSならインストール済みのPicamera2ライブラリを介してlibcameraの機能を使えます。

公式の説明(PDF)の「8.7. Multiple Cameras」で紹介されている下記のプログラムは、カメラ2台を認識している状態で問題なく動きました。
from picamera2 import Picamera2

picam2a = Picamera2(0)
picam2b = Picamera2(1)

picam2a.start()
picam2b.start()

picam2a.capture_file("cam0.jpg")
picam2b.capture_file("cam1.jpg")

picam2a.stop()
picam2b.stop()

撮影した画像がこちらです。
利用したov5647が扱う最小画像サイズである640x480pixelのjpegファイルが作成されました。
libcamera-jpegの時は最大画像サイズが標準でしたが、picamera2の場合は最小画像サイズが標準でした。

cam0.jpg

cam1.jpg


余談1: 2021年11月頃からraspi-configのcamera有効無効切替機能は無くなり、標準で有効状態になった

カメラの使い方を説明するページにraspi-configでcameraを有効化する手順が紹介されているものの2023年5月版のRaspberry Pi OSではその項目が無くて戸惑いました。

調べたところ、2021年11月頃からカメラの有効化機能がなくなったようです。

Raspberry Piの公式ブログの記事 Bullseye camera system に下記の記述がありました。
You don’t even have to “enable the camera” any more, though you do still have to plug one in!

関連するフォーラムから上記の情報に辿り着きました。
No option to enable camera in configuration
How to enable camera on Rasberrypi zero 2 W

余談2: raspistillやraspividはlegacy stackとなり記事作成時点ではlibcameraが標準

raspistillやraspividコマンドは古い仕組み(legacy stack)の説明に載っており、実行するとlegacy stackを有効にしないと使えないエラーが出ます。

Re-enabling the legacy stack

raspistill --list-camera
ERROR: the system should be configured for the legacy camera stack

stillやvidコマンドの機能が欲しい場合は、似せて作られているであろうlibcamera-stilllibcamera-vidの利用をお勧めします。

おわり

CM4とIOボードを利用してPiカメラ2台を動かせました。

/boot/config.txtの設定が必要で手間取りましたが、期待通りに動かせて良かったです。

参考

カメラのソフトウェアに関する公式の説明です。
Camera software

config.txtに関する公式の説明です。
The config.txt file

dtoverlayで設定可能な値を確認できるgithubのreadmeです。
https://github.com/raspberrypi/linux/blob/rpi-6.1.y/arch/arm/boot/dts/overlays/README

IOボードの公式の説明です。
Raspberry Pi Compute Module IO Board (PDF)

pythonのライブラリ情報です。
Picamera2
The Picamera2 Library (PDF)

コマンドでの番号指定で利用するカメラを変えられると認識した記事です。
Raspi CM4 Dual Camera

0 件のコメント :