はじめに
定点カメラをラズパイ使って構築したいと思いたち、ろくに調べもせずカメラを買い大ハマりしましたので誰かの一助になればと思い書き留めておきます。
不要な手順等あると思いますが、生暖かい目で見ていただければ。。。。
定点カメラを作成するにあたり目指したもの
- 安く済ませる(これがのちにおおはまりすることに・・・)
- USB充電器で動作する
- 手元に余ってる機材で済ます
揃えた機材
- Raspberry Pi Zero 2 W
- RasTech Raspberry Pi カメラモジュール
- USB 充電器(余りもの)
- マイクロUSBケーブル(余りもの)
- 発熱そこそこするのでCPUヒートシンク
- microSDカード(余りもの)
いざOSインストール!
Raspberry Pi Imagerを使ってOSイメージを選択するのですが、あえて最新のbookwormでLiteを選択

イメージ書き込みが終わりラズパイを起動しますが、ディスプレイは接続してないので同一ネットワーク上にある他のLinuxから以下のコマンドで確認。(他に方法があるのかもしれませんが思い付かず)
$ nmap -sT 192.168.0.0/24 -p 22
openとなっているIPを探し出し、先のImagerで設定したユーザアカウントで接続。
接続出来たらOSのアップデートを実施
$ sudo apt update && sudo apt full-upgrade -y
$ sudo reboot now
長いので気長に☕飲んで待ちましょう
カメラモジュールの接続と認識
最新OSのbookwormになるとsudo raspi-configとして設定画面を開いてもLegacy Cameraの設定項目が無くなっているようで、ここは無視します。
カメラを接続してOSから認識できているかrpicam-hello --list-camerasと入力して確認します。
$ rpicam-hello --list-cameras
Available cameras
-----------------
0 : ov5647 [2592x1944 10-bit GBRG] (/base/soc/i2c0mux/i2c@1/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [30.00 fps - (65535, 65535)/65535x65535 crop]
1296x972 [30.00 fps - (65535, 65535)/65535x65535 crop]
1920x1080 [30.00 fps - (65535, 65535)/65535x65535 crop]
2592x1944 [30.00 fps - (65535, 65535)/65535x65535 crop]
ここで上記のようにカメラ情報が出力されていれば大丈夫です。出力されない場合、ケーブルが正しく差し込まれているか確認します。
カメラツールのインストール
定点カメラ用ツールとして有名なmotionEyeを導入します。公式に記載のインストール方法に則って、コマンド実行していきます。
$ sudo apt --no-install-recommends install ca-certificates curl python3 python3-dev gcc libjpeg62-turbo-dev libcurl4-openssl-dev libssl-dev
$ curl -sSfO 'https://bootstrap.pypa.io/get-pip.py'
$ sudo python3 get-pip.py
pip実行時にエラーが出るので出ないように設定ファイルに追記
$ cat /etc/pip.conf
[global]
extra-index-url=https://www.piwheels.org/simple
break-system-packages=true ※これが追記されていればOK
sudo python3 get-pip.pyを再度実行。
上記まで準備できたらいよいよmotionEyeのインストール
$ sudo python3 -m pip install --pre motioneye
$ sudo motioneye_init
すべて終わると、systemdに起動スクリプトの登録と自動起動設定まで完了しているので、ブラウザからラズパイのIP:Portに接続してみます。
http://<your raspi IP>:8765
うまく接続出来ればログイン画面が表示されます。

Usernameにadminを入れてPasswordは何も入力せずにLoginでログインできます。
ログインが完了したらadd camera ...で識別しているカメラを登録するのですが、映らない・・・
識別しているカメラを順番に選択してもいずれもUNABLE TO OPEN VIDEO DEVICEの表示になる。

・・・・・

どりゃー!!!
カメラをmotionEyeで識別させるための試行錯誤
ここからが長く感じた。。。
v4l2-ctl --list-devicesを実行して認識している物のリストを表示
$ v4l2-ctl --list-devices
unicam (platform:3f801000.csi):
/dev/video0
/dev/media3
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
/dev/video18
/dev/video31
bcm2835-isp (platform:bcm2835-isp):
/dev/video13
/dev/video14
/dev/video15
/dev/video16
/dev/video20
/dev/video21
/dev/video22
/dev/video23
/dev/media0
/dev/media1
bcm2835-codec (vchiq:bcm2835-codec):
/dev/media2
特に問題なさそうな気が・・・
次にv4l2-ctl -d /dev/video0 --list-formatsを実行して対応フォーマットを確認
$ v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
[1]: 'UYVY' (UYVY 4:2:2)
[2]: 'YVYU' (YVYU 4:2:2)
[3]: 'VYUY' (VYUY 4:2:2)
[4]: 'RGBP' (16-bit RGB 5-6-5)
[5]: 'RGBR' (16-bit RGB 5-6-5 BE)
[6]: 'RGBO' (16-bit A/XRGB 1-5-5-5)
[7]: 'RGBQ' (16-bit A/XRGB 1-5-5-5 BE)
[8]: 'RGB3' (24-bit RGB 8-8-8)
[9]: 'BGR3' (24-bit BGR 8-8-8)
[10]: 'RGB4' (32-bit A/XRGB 8-8-8-8)
[11]: 'BA81' (8-bit Bayer BGBG/GRGR)
[12]: 'GBRG' (8-bit Bayer GBGB/RGRG)
[13]: 'GRBG' (8-bit Bayer GRGR/BGBG)
[14]: 'RGGB' (8-bit Bayer RGRG/GBGB)
[15]: 'pBAA' (10-bit Bayer BGBG/GRGR Packed)
[16]: 'BG10' (10-bit Bayer BGBG/GRGR)
[17]: 'pGAA' (10-bit Bayer GBGB/RGRG Packed)
[18]: 'GB10' (10-bit Bayer GBGB/RGRG)
[19]: 'pgAA' (10-bit Bayer GRGR/BGBG Packed)
[20]: 'BA10' (10-bit Bayer GRGR/BGBG)
[21]: 'pRAA' (10-bit Bayer RGRG/GBGB Packed)
[22]: 'RG10' (10-bit Bayer RGRG/GBGB)
[23]: 'pBCC' (12-bit Bayer BGBG/GRGR Packed)
[24]: 'BG12' (12-bit Bayer BGBG/GRGR)
[25]: 'pGCC' (12-bit Bayer GBGB/RGRG Packed)
[26]: 'GB12' (12-bit Bayer GBGB/RGRG)
[27]: 'pgCC' (12-bit Bayer GRGR/BGBG Packed)
[28]: 'BA12' (12-bit Bayer GRGR/BGBG)
[29]: 'pRCC' (12-bit Bayer RGRG/GBGB Packed)
[30]: 'RG12' (12-bit Bayer RGRG/GBGB)
[31]: 'pBEE' (14-bit Bayer BGBG/GRGR Packed)
[32]: 'BG14' (14-bit Bayer BGBG/GRGR)
[33]: 'pGEE' (14-bit Bayer GBGB/RGRG Packed)
[34]: 'GB14' (14-bit Bayer GBGB/RGRG)
[35]: 'pgEE' (14-bit Bayer GRGR/BGBG Packed)
[36]: 'GR14' (14-bit Bayer GRGR/BGBG)
[37]: 'pREE' (14-bit Bayer RGRG/GBGB Packed)
[38]: 'RG14' (14-bit Bayer RGRG/GBGB)
[39]: 'BYR2' (16-bit Bayer BGBG/GRGR)
[40]: 'GB16' (16-bit Bayer GBGB/RGRG)
[41]: 'GR16' (16-bit Bayer GRGR/BGBG)
[42]: 'RG16' (16-bit Bayer RGRG/GBGB)
[43]: 'GREY' (8-bit Greyscale)
[44]: 'Y10P' (10-bit Greyscale (MIPI Packed))
[45]: 'Y10 ' (10-bit Greyscale)
[46]: 'Y12P' (12-bit Greyscale (MIPI Packed))
[47]: 'Y12 ' (12-bit Greyscale)
[48]: 'Y14P' (14-bit Greyscale (MIPI Packed))
[49]: 'Y14 ' (14-bit Greyscale)
[50]: 'Y16 ' (16-bit Greyscale)
どこで見たか忘れたのですが、このフォーマット情報が複数あるとmotionEye上で正しく識別できずにカメラが利用できないと書かれてました。
ただ、ここで諦めるわけにもいかず、rpicam-still -r -o test.jpg --width 1280 --height 800として実行すると問題なくファイル保存され、sftpでファイルをローカルに持ってくると問題なく撮影出来ている事を確認。
ならばと思い、rpicam-vid -t 0 --inline --listen -o tcp://0.0.0.0:8080このように起動してVLCから閲覧が出来るか確認したところ問題なく出来るという。。。OS識別しているし撮影も出来るのに、motionEyeでなぜ認識しないの・・・
解決策
途方に暮れていた所、GitHub上の書き込みを発見。この書き込みによるとmotionEye起動時のスクリプトにlibcamera関連を利用して起動するとあり、早速試してみる事に。
$ sudo apt install libcamera-v4l2 libcamera-tools
$ sudo sed -i 's/\/usr\/local\/bin\/meyectl/\/usr\/bin\/libcamerify \/usr\/local\/bin\/meyectl/' /etc/systemd/system/motioneye.service
$ sudo systemctl daemon-reload
$ sudo systemctl restart motioneye
$ cat /etc/systemd/system/motioneye.service
[Unit]
Description=motionEye Server
After=network.target local-fs.target remote-fs.target
[Service]
User=motion
RuntimeDirectory=motioneye
LogsDirectory=motioneye
StateDirectory=motioneye
- ExecStart=/usr/local/bin/meyectl startserver -c /etc/motioneye/motioneye.conf
+ ExecStart=/usr/bin/libcamerify /usr/local/bin/meyectl startserver -c /etc/motioneye/motioneye.conf #ここが書き換わってます。判りやすいように変更前後を掲載してます
Restart=on-abort
[Install]
WantedBy=multi-user.target
う、映ったー!!

ということで、この記事はここまで。自分の備忘録兼ねてますが、同じような状況になってる方の一助になればいいかな。