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ケーブルの文字が印刷されている面が向くのが正しい向きです。
接続の確認
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通りの使用方法をご紹介します。
- GStreamerを使用して8bitのグレースケール映像を画面に表示
- v4l2-ctlを使用して8bit/10bitのグレースケール静止画を取得
- 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 "
以下のコマンドで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埋めされます。