ブログ

Armadillo-IoT G4 / Armadillo-X2:MIPIカメラを使用する(KBCR-S51MMの場合)

at_shota.shimoyama
2025年1月23日 18時04分

Armadillo-IoTゲートウェイ G4 / Armadillo-X2にシキノハイテック社製MIPI出力カメラモジュール KBCR-S51MM(150万画素モノクログローバルシャッター MIPI出力 カメラモジュール KBCR-S51MM)を接続して使用する例をご紹介します。

準備

設定ファイルを書き換えて、変換基板(KBCR-RP-CONV-BOARD)とCSIケーブルを接続するだけで使用可能となります。

ただし、Armadillo内のLinux カーネルのバージョンが v5.10.233-r0 以降である必要があります。もしこれよりも古いバージョンの場合には、v3.20.5-at.8 (2025/01/29)以降のインストールディスクイメージで初期化インストールを実施してください。

Device Treeの設定

CON10にMIPIカメラを接続する際、それぞれのカメラに合わせてDevice Treeが必要です。 KBCR-S51MMの場合は既に用意されているarmadillo_iotg_g4-con10-og01h1b.dtboを使用します。
以下のように/boot/overlays.txtを書き換えて保存した後、再起動してください。こうすることで、CON10のピンアサインがKBCR-S51MMに対応した状態で起動するようになります。

[armadillo ~]# vi /boot/overlays.txt
fdt_overlays=armadillo_iotg_g4-con10-og01h1b.dtbo

[armadillo ~]# persist_file -vp /boot/overlays.txt
[armadillo ~]# reboot

カメラとの接続

全体


カメラ


変換基板

左は全体写真の位置関係のまま近くで撮った写真、右は反対側の面を撮った写真

Armadillo


Armadillo・変換基板(KBCR-RP-CONV-BOARD)・カメラを図のように接続します。Armadilloの電源は切った状態で行ってください。

変換基板とカメラは26pinのCSIケーブルで接続してください。 このとき、カメラのピン1~22と変換基板のピン22~1が対応するように接続してください。

変換基板とArmadilloのCON10は22pin-15pin変換CSIケーブルで接続してください。(図では、Raspberry Pi 5用CSIケーブル(カメラ用) FPC 15-22pin 200mmを使用しました。) このとき、必ずArmadilloのACアダプタは取り外しておき、Armadilloのピン15~1と変換基板のピン1~15が対応するように接続してください。
また、22pin-15pin変換CSIケーブルは表裏の区別がありますので、この点にもご注意ください。Raspberry Pi 5用CSIケーブルを使用する場合、Armadilloの基板中央側にCSIケーブルの文字が印刷されている面が向くのが正しい向きです。

接続を誤った状態で電源を投入すると、Armadilloや変換基板、カメラが破損する恐れがあります。

接続の確認

Linuxからカメラを認識できているかを確認します。
Armadilloに電源を入れて、以下のように/dev/video2/dev/video3が存在することを確認してください。

[armadillo ~]# ls /dev/video*
/dev/video0  /dev/video1  /dev/video2  /dev/video3

また、dmesgで表示される内容に「og01h1b_probe:og01h1b_detect」が含まれていることを確認してください。

armadillo:~# dmesg | grep og01
[    0.417967] og01h1b_probe:devm_kzalloc
[    0.417976] og01h1b_probe:Initialize subdev
[    0.418032] og01h1b 1-0010: supply avdd not found, using dummy regulator
[    0.418115] og01h1b 1-0010: supply dovdd not found, using dummy regulator
[    0.418132] og01h1b 1-0010: supply dvdd not found, using dummy regulator
[    0.532987] og01h1b_probe:og01h1b_detect
[    0.533030] og01h1b_probe:og01h1b_init_controls
[    0.533049] og01h1b_probe:pm_runtime_set_active
[    1.098001] mx8-img-md: Registered sensor subdevice: og01h1b 1-0010 (1)
[    1.098019] mx8-img-md: created link [og01h1b 1-0010] => [mxc-mipi-csi2.0]

上記の確認で問題がなければ、Linux側からはカメラを正常に認識できています。

動作確認

KBCR-S51MMはモノクロカメラで、8bitと10bitの2つの出力モードが使用できます。 ですが、カメラ用のツールとしてよく使用されるGStreamerのv4l2srcエレメントは8bitのグレースケールには対応しているものの、10bitのグレースケールには対応していません。 そのため、GStreamerを使用する場合、10bitモードでの映像を取得することができません。

本ブログでは、GStreamerを使用して8bitの映像を取得する方法に加えて、10bitの静止画・映像を取得する方法の合わせて以下3通りの使用方法をご紹介します。

  1. GStreamerを使用して8bitのグレースケール映像を画面に表示
  2. v4l2-ctlを使用して8bit/10bitのグレースケール静止画を取得
  3. Python+OpenCVを使用して8bit/10bitのグレースケール映像を画面に表示

実施にあたっての前提事項は以下の通りです。構成などが異なる場合はデバイス名などを適宜変更してください。

  • USBカメラなどのKBCR-S51MM以外のカメラデバイスは接続していない
  • KBCR-S51MMは/dev/video2および/dev/video3として認識されている
  • HDMIでディスプレイに接続している

コンテナ作成・起動

まずは、動作確認用のコンテナを作成するため、以下を参考にしてABOSDEの「Atmark Container New Project」からプロジェクトを作成します。
アットマークテクノが提供するイメージを使う

コンテナ内から/dev/video2/dev/video3を使用できるようにするため、プロジェクト内のconf/at-debian-image.confファイルに、以下の行を追加します。

add_devices /dev/video2 /dev/video3

必要なパッケージをインストールするため、プロジェクト内のcontainer_setup/at-debian-image/Dockerfileを以下のように修正します。(12~14行目を追加しました)

ARG arch=arm64v8

FROM docker.io/${arch}/debian:bullseye

LABEL version="1.0.11"

COPY resources /

ARG USERNAME=atmark
ARG UID=1000
RUN apt-get update && apt-get upgrade -y && apt-get install -y weston \
    v4l-utils gstreamer1.0-tools gstreamer1.0-imx \
    gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
    python3 python3-pip python3-opencv libopencv-dev vim \
    && apt-get clean && mkdir -m 1777 /tmp/.X11-unix \
    && mkdir /run/xdg_home && useradd -m -u ${UID} ${USERNAME}
ENV LD_LIBRARY_PATH /opt/firmware/usr/lib/aarch64-linux-gnu
ENV XDG_RUNTIME_DIR /run/xdg_home
ENV VIVANTE_SDK_DIR /opt/firmware/usr
ENV GDK_GL gles
ENV QT_QPA_PLATFORM wayland

「Generate at-debian-image container setup swu」からat-debian-imageのコンテナを作成してください(完了までに時間がかかります)。完了後、生成されたat-debian-image.swuをArmadilloにインストールしてください。

インストール後は、以下のコマンドでコンテナ内に入ることができます。

[armadillo ~]# podman exec -ti at-debian-image bash

カメラ情報の確認

v4l2-ctlを使用して接続されているカメラデバイスの情報を確認できます。

カメラデバイス一覧表示
[container /]# v4l2-ctl --list-device

/dev/video2の詳細確認 指定可能なピクセルフォーマット・画面サイズなどが確認出来ます。
[container /]# v4l2-ctl -d /dev/video2 --list-formats-ext

1. GStreamerを使用して8bitのグレースケール映像を画面に表示

GStreamer の v4l2src エレメントを使って、カメラから入力された8bitのグレースケール映像をHDMIで接続したディスプレイに表示します。

デスクトップ環境の起動
[container /]# weston --tty=7 &

GStreamer実行
(640×480)
[container /]# gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,format=GRAY8,width=640,height=480 ! videoconvert n-threads=4 ! autovideosink sync=false

(1280×960)
[container /]# gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,format=GRAY8,width=1280,height=960 ! videoconvert n-threads=4 ! autovideosink sync=false

(1440×1080)
[container /]# gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,format=GRAY8,width=1440,height=1080 ! videoconvert n-threads=4 ! autovideosink sync=false

2. v4l2-ctlを使用して8bit/10bitのグレースケール静止画を取得

v4l2-ctlを使用して静止画も含めたストリームのキャプチャを行うことも可能です。 まず、以下のコマンドでサイズとピクセルフォーマットを設定します。

(640×480・8bit)
[container /]# v4l2-ctl -d /dev/video2 --set-fmt-video=width=640,height=480,pixelformat=GREY

(1280×960・8bit)
[container /]# v4l2-ctl -d /dev/video2 --set-fmt-video=width=1280,height=960,pixelformat=GREY

(1440×1080・8bit)
[container /]# v4l2-ctl -d /dev/video2 --set-fmt-video=width=1440,height=1080,pixelformat=GREY

(640×480・10bit)
[container /]# v4l2-ctl -d /dev/video2 --set-fmt-video=width=640,height=480,pixelformat="Y10 "

(1280×960・10bit)
[container /]# v4l2-ctl -d /dev/video2 --set-fmt-video=width=1280,height=960,pixelformat="Y10 "

(1440×1080・10bit)
[container /]# v4l2-ctl -d /dev/video2 --set-fmt-video=width=1440,height=1080,pixelformat="Y10 "
10bitに設定する際には、Y10の後ろに半角スペースが1つ必要です。そのため、ダブルクォーテーションを必ず入力してください。また、0の後ろに半角スペース1つがあることを見落とさないように注意してください。

以下のコマンドでRAW画像をframe.rawとして取得できます。(ディスプレイには表示されません)

[container /]# v4l2-ctl -d /dev/video2 --stream-mmap --stream-to=frame.raw --stream-count=1

※ 10bitモードで取得したRAW画像は1ピクセルにつき16bitのリトルエンディアンで格納され、下位6bitについては0埋めされます。


また、v4l2-ctlを使用してカメラのパラメータを変更することも可能です。

カメラのパラメータ確認
[container /]# v4l2-ctl -d /dev/video2 --all

カメラのパラメータ変更
[container /]# v4l2-ctl -d /dev/video2 -c パラメータ名=値
(例)画像を上下反転
[container /]# v4l2-ctl -d /dev/video2 -c vertical_flip=1

指定可能なパラメータ一覧

  • auto_exposure : 自動露光制御
  • exposure : 露光時間(ライン単位)
  • gain : 露光ゲイン
  • horizontal_flip : 画像左右反転
  • vertical_flip : 画像上下反転

3. Python+OpenCVを使用して8bit/10bitのグレースケール映像を画面に表示

Python3 と OpenCV を使って、カメラから入力されたグレースケール映像をHDMIで接続したディスプレイに表示します。

以下のPythonスクリプトをviエディタ等を使用してコンテナ内に配置してください。

test.py

import cv2

size_list= [(640, 480), (1280, 960), (1440, 1080)]
fourcc_dict = {'8bit': 'GREY', '10bit': 'Y10 '}

width, height = size_list[0] # 0, 1, 2
fourcc = fourcc_dict['8bit'] # 8bit, 10bit


cap = cv2.VideoCapture(2, cv2.CAP_V4L)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*fourcc))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0.0)

while True:
    ret, frame = cap.read()
    cv2.imshow('camera', frame)
    cv2.waitKey(10)

デスクトップ環境を用意してからPythonスクリプトを実行します。

デスクトップ環境の起動
[container /]# weston --tty=7 &
[container /]# python3 test.py

サイズやビットの指定は、test.pyの以下の行を適宜変更して行ってください。

width, height = size_list[0] # 0, 1, 2
fourcc = fourcc_dict['8bit'] # 8bit, 10bit

※ 10bitモードで取得したframeはunit16のNumpy配列で保存され、下位6bitについては0埋めされます。