RaspberryPi Zeroでカメラを動かすのにとても苦労した話

光都ICTクラブのメンバーより、「夏休みの自由研究課題として使えるカメラを作りたい」との要望がありました。そこで、Raspberry Pi Zero Wと暗視カメラを使えば比較的安価に制作できると考えて、いろいろ試行錯誤しました。以前、同じような構成でタイムラプス動画を作ったことがあったので、その焼き直しで容易に制作できるだろうと考えたのです。

しかしながら、Raspberrypi OSのバージョンアップで、かんたんには制作できませんでした。Webの情報も新旧入り混じっており、欲しい情報にたどり着くのが大変でした。

本稿は、RaspberryPi zZeroでカメラを動かすまでの悪戦苦闘をまとめたものです。

最終的にZeroでカメラを動作させた構成図

最終的に完成したZeroカメラの構成は、下図の構成です。Zeroの起動・終了用のタクトスイッチと、カメラ動作確認用LEDを取り付けました

失敗したRaspberryPi Zeroのカメラ関連設定

この章は、わたしが設定してうまくいかなった方法を書きます。うまくいかなかった方法なので、読み飛ばしても構いません。

これらは、Web検索でヒットした情報を試していて気付いた情報です。Web検索で、デフォルトでヒットする情報群は、新旧関係ありません。古くて使い物にならない情報でも上位に表示されることがあります

RaspberryPiでカメラを動作させる方法を検索すると、新旧・真贋入り混じった情報がヒットします。その中から自分に必要な情報を取捨する必要があるのです。

そのためには、自分の使っているハード・ソフトのバージョンや構成を十分に知っておかなければなりません。特に、純正パーツ以外をAmazonなどで安いからといって買うと、情報が容易に手に入らないことがあります。そうすると、わたしのようにハマることがあるので注意を要します。

・raspi-config(カメラの有効化)

RaspberryPi Zeroに接続したカメラを認識させるために、設定をおこなう必要があります。以前カメラを動かしたときに、わたし自身が書き残していたメモには、下のコマンドから設定をおこなうように書いてありました。

$raspi-config

Web検索しても、おなじようにraspi-configからカメラ設定をおこなうように書いてある記事がたくさんヒットします。

ところが、いくら探してもカメラの設定項目がないのです。画面付きで説明してある記事もたくさんあります。その画像のとおりに設定項目を探しても、カメラの設定項目が見当たりません。

おおよそこのような場合は、ソフトのバージョン違いであることが多いのです。そこで、raspi-configを最新バージョンに更新しました。

しかし! カメラの設定項目は出てきませんでした。

種明かしをすると、RaspberryPi OSの「bullseye」バージョン移行はraspi-configでできないそうです。わたしのRaspberryPi OSのバージョンはbookwormで、bullseyeよりさらに新しいバージョンでした。そのため、当然のごとくraspi-configが使えないのでした。

raspstill(撮影)

カメラが認識したら使えるコマンドとして紹介されるのは以下のコマンドです。

$ raspistill

コマンドカメラを起動し、写真を撮るコマンドです。しかし、OSのバージョンアップによってraspistillコマンドはなくなりました。

picamera(古いpythonモジュール)

さらにダメ押しです。古いバージョンだと標準で使っていたpicameraモジュールは開発が終わりました。

crontab(起動と同時に撮影開始)

カメラを認識させたら、RaspberryPi Zeroの起動とともに写真撮影をはじめる設定をしました。いろいろ方法はありますが、cronというツールを使う方法があります。

これまでわたしはカメラ以外でもcronを使って定時動作をさせてきました。cronは、わたしにとって馴染みのあるツールです。

設定自体はかんたんで、cronの設定に下の一行を書くだけです。フルパスで書いておくと間違いがありません。

@reboot /usr/bin/python3 /home/USERNAME/camera.py

ところが、これで動きません。cronのログを見ると、どうやら起動しているけれどエラーで止まっているようです。解決方法がわからなかったので、別の方法を試しました。

systemctl(Restartなし)

cronがだめだったので、代わりに試したのがsystemctlを使う方法です。RaspberryPi OS のjessieバージョンから推奨されている方法だそうです。

ところが、これもうまくいきません。RaspberryPi Zeroと同時に起動はするけれど、「カメラを認識していない」エラーが出ていました。

最終的に動いたRaspberryPi Zeroのカメラ関連設定

ここまで、RaspberryPi Zeroでカメラを動かそうとしてうまくいかなかった設定を紹介してきました。ここからは、おまたせしました、うまくいった設定を紹介します。

・/boot/firmware/configで設定(カメラの有効化)

カメラの設定は、設定ファイルにテキストで書き込むことで実現します。情報によっては、設定ファイルは「/boot/config」と書いてあります。わたしの場合は、このとおりにアクセスしてもファイルが存在しませんでした。その代わり、「/boot/firmware/config」にあるとメッセージがでました。そこに設定を書き込みます。

設定はかんたんで、ファイルの最終行に以下を書き込むだけです。

dtoverlay=ov5647

わたしが用意したカメラは、素子がov5647なので上記のように書きます。カメラの世代によって使っている素子名が違います。自分のカメラの素子名に合わせる必要があります。カメラの諸元を確認してください。ちなみに三世代の1200万画素カメラなら、imx708を使っています。

・libcamera(撮影)

設定が終わったら、以下のコマンドで動作確認できます。

$ libcamera-jpeg -o test.jpg

このコマンドで、「test.jpg」という画像ファイルが保存されたら成功です。ヘッドレス運用しているときは、scpでダウンロードしてから確認します。

・picamera2(新しいpythonモジュール)

先述の通り、picameraは開発が終わったので、新しいPythonモジュールの「picamera2」を使います。

ここまでの話は、雑誌Interfaceの記事に書いていました。下のURLはサンプル記事です。つづきはお買い求めください。

https://interface.cqpub.co.jp/wp-content/uploads/if2405_040.pdf

・systemctl(Restartあり)

最後は、RaspberryPi Zero起動で自動で撮影プログラムを走らせます。最近の推奨は、cronではなくsystemdを使う方法だそうです。ということで、cronは却下。

systemctlから設定をして、自動リスタートを設定するとうまく走るようになりました。一発目の起動はカメラを認識しないようで、毎回そこで止まっていました。ならばエラーが出たところで撮影プログラムをリスタートしてやればOKということです。

以上、RaspberryPiでカメラを動かすのは、Lチカなみにオーソドックスな内容なのに、大変苦労した話でした。