Arducamモノクロデュアルカメラアレイボードをraspberry piに接続してみる

＊本記事は2021/5/5時点の情報です

SWITCH SCIENCEで入手したこちらのステレオカメラモジュール(OV9281 1MP x2)をraspberry pi 4に接続して使ってみます。

![IMG_3438.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349730/f3d93dc8-19ce-d052-c92f-3c5e9735acd4.jpeg)


https://www.switch-science.com/catalog/7053/

# 背景
Raspberry Pi OSがデフォルトでサポートするカメラモジュールはラズパイオフィシャルなカメラモジュール(IMX219なcamera module v2, IMX477なHigh Quality Cameraなど)のみなので、今回のようなカメラモジュールの場合はドライバをインストールする必要があります。

製造元のArduCamからドライバのバイナリがリリースされているのですが、今日現在(2021/5/5)最新のRaspberry Pi OS (Release date: March 4th 2021, kernel version: 5.10.17-v7l+)には対応していないため、ソースコードからビルドする必要がありました。
＊公式からバイナリが提供されているかもしれないので、ビルドする前にチェックしてみてください。

https://github.com/ArduCAM/Arducam_OBISP_MIPI_Camera_Module

幸い、同じくArduCamから提供されているPivarietyドライバのビルド方法がありましたのでこちらを参考にしています。
[How to build Raspberry Pi Kernel Driver – Pivariety Camera](https://www.arducam.com/docs/cameras-for-raspberry-pi/pivariety/how-to-build-raspberry-pi-kernel-driver-pivariety-camera/)

# ドライバのビルド

## 準備
kernel moduleのビルドのために、対応するバージョンのlinux kernelのソースコードが必要になりますのでダウンロードします。
gitから直接cloneするなどいくつか方法があると思いますが、今回はこちらのツールを使ってソースを取得します。
https://github.com/RPi-Distro/rpi-source

依存パッケージのインストール

```bash
$ sudo apt update
$ sudo apt install -y git bc bison flex libssl-dev libncurses5-dev
```

ツールをダウンロードして実行

```bash
$ sudo wget https://raw.githubusercontent.com/RPi-Distro/rpi-source/master/rpi-source -O rpi-source && sudo chmod +x /usr/local/bin/rpi-source && /usr/local/bin/rpi-source -q --tag-update
$ rpi-source
```

## Build
まずはドライバのソースコードを取得します。



```bash
$ git clone https://github.com/ArduCAM/Arducam_OBISP_MIPI_Camera_Module
```

### device treeのビルド

device treeのMakefileにarducamを追加

```bash
$ vi /lib/modules/$(uname -r)/build/arch/arm/boot/dts/overlays/Makefile
```

`dtbo-$(CONFIG_ARCH_BCM2835) += \`に以下行を追加します。

```diff:/lib/modules/5.10.17-v7l+/build/arch/arm/boot/dts/overlays/Makefile
@@ -22,6 +22,7 @@
 	anyspi.dtbo \
 	apds9960.dtbo \
 	applepi-dac.dtbo \
+	arducam.dtbo \
 	at86rf233.dtbo \
 	audioinjector-addons.dtbo \
 	audioinjector-isolated-soundcard.dtbo \
```

device treeのビルドとインストール

```bash
$ cd Arducam_OBISP_MIPI_Camera_Module/sourceCode/5.4.51
$ cp arducam-overlay.dts /lib/modules$(uname -r)/build/arch/arm/boot/dts/overlays/
$ make -C /lib/modules/$(uname -r)/build  dtbs
$ sudo cp /lib/modules/$(uname -r)/build/arch/arm/boot/dts/overlays/arducam.dtbo /boot/overlays/arducam.dtbo
```

## /boot/config.txtの設定
/boot/config.txtに以下2行を追加する。

```diff:/boot/config.txt
[all]
#dtoverlay=vc4-fkms-v3d
start_x=1
gpu_mem=128
+dtparam=i2c_vc=on
+dtoverlay=arducam
```

### kernel moduleのビルド

一行だけのMakefileを作成

```bash
$ cd Arducam_OBISP_MIPI_Camera_Module/sourceCode/5.4.51
$ vi Makefile
```

```makefile:Makefile
obj-m := arducam.o
```

ビルドする

```bash
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
$ sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
$ sudo depmod
$ sudo modprobe arducam
```

再起動する。

モジュールを接続していた場合、以下のように `video0`ができてれば成功。

```bash
$ ls /dev/vid*
/dev/video0  /dev/video1  /dev/video10  /dev/video11  /dev/video12  /dev/video13  /dev/video14  /dev/video15  /dev/video16
$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'GREY' (8-bit Greyscale)
		Size: Discrete 2560x800
			Interval: Discrete 0.000s (4294967294.000 fps)
	[1]: 'Y10P' (10-bit Greyscale (MIPI Packed))
		Size: Discrete 2560x800
			Interval: Discrete 0.000s (4294967294.000 fps)
	[2]: 'Y10 ' (10-bit Greyscale)
		Size: Discrete 2560x800
			Interval: Discrete 0.000s (4294967294.000 fps)
```

# 撮影してみる

公式の撮影ツールを使ってみます

```bash
$ cd Arducam_OBISP_MIPI_Camera_Module/arducamstill
$ make
$ ./arducamstill -t 1000 -o image.jpg -pixfmt GREY -w 2560 -h 800
Hardare version: c03111
No match to hardware version!
Device /dev/video0) opened.
GREY
Video format set: GREY (59455247) 2560x800
[Framerate]: 01 fps.
Saving image data to image.jpg successfully.
```

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349730/2c398e37-c47c-54e1-d1ec-13e05c589561.jpeg)

露光設定などはv4l2-ctlからできるようですので、公式マニュアルを参考に設定する必要がありそうです。

# おまけ
基板剥き出しだとショートさせそうで怖いのでケースを作ってみました。
![IMG_3439.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349730/d7e2ae51-838c-6da7-3e54-1f8523ffb80b.jpeg)


# 参考
- 公式マニュアル: [Camarray – Arducam 1MP*2 Stereo Camera MIPI Module](https://www.arducam.com/docs/cameras-for-raspberry-pi/multi-camera-adapter-board/1mp-stereo-camera-global-shutter-mipi-arducam/)
- Pivarietyのビルド方法: [How to build Raspberry Pi Kernel Driver – Pivariety Camera](https://www.arducam.com/docs/cameras-for-raspberry-pi/pivariety/how-to-build-raspberry-pi-kernel-driver-pivariety-camera/)