IT女子のラズベリーパイ入門奮闘記

第43回「Raspberry Pi Zero V1.3+カメラモジュールでミニ定点カメラを作ろう!」

raspberrypi43_main
立て続けに新機種がリリースされているラズベリーパイが、またまた手元に届きました!海外からお取り寄せした「Raspberry Pi Zero V1.3」です。今までの無印Raspberry Pi Zeroと何が違うかというと、上の写真のように、ラズベリーパイのカメラモジュールを付けられるようなりました!

今回は、この「Raspberry Pi Zero V1.3」とカメラモジュールを、Pythonから操作する方法をご紹介します。
自動実行処理と組み合わせて、定点カメラを作ってみましょう!

 

Raspberry Pi Zero V1.3

「Raspberry Pi Zero V1.3」は、その名の通り「Raspberry Pi Zero」の進化版です。見た目の違いは1箇所だけ。

raspberrypi43_img01

図1

右端に、カメラモジュール接続用のコネクタが付きました!ここにリボンケーブルを差し込むことができます。Model Bシリーズでは上向きに配置されていましたが、Zeroでは右側から差し込みます。

raspberrypi43_img01_2

図2

Zero grows a camera connector – Raspberry Pi
To connect the camera to the Zero, we offer a custom six-inch adapter cable. This converts from the fine-pitch connector format to the coarser pitch used by the camera board.

HDMI端子、USB端子に続いて、カメラ用のコネクタも小型化!
Model Bシリーズにも標準搭載されているコネクタと比べると、若干サイズが小さくなり、6インチのものが採用されています。
(そのことに気付いたのは、実際に差し込もうとした瞬間でした……という話↓↓↓に続きます)

 

カメラモジュールを接続!

raspberrypi43_img02

図3

Camera Module – Raspberry Pi
今回使用するカメラはこちら。v1.3という、少し古いバージョンです。現在はv2.0という新しいバージョンがリリースされています。

それでは早速接続を……

raspberrypi43_img03

図4

……と思ったら、入りませんでした!
前述の通り、サイズの違いにはここではじめて気がつきました(第41回でも同じようなことをした気がします……)。
この時点では、Raspberry Pi Zero対応のカメラを買わなくてはいけないと思っていたのですが、実際はちょっと違いました。

raspberrypi43_img04

図5

カメラが差せません!と伝えたところ、上司が買ってきてくれたのがこちらです。
ケーブルを差し替えるだけで、カメラはそのまま使える!?

raspberrypi43_img05

図6

カメラの裏側をよく見ると、ラズベリーパイに付いているコネクタと同じものが!黒いストッパーの部分を引き出すと、ケーブルが取り外せるようになっていました。

ということで、ケーブルを接続し直して……

raspberrypi43_img06

図7

接続完了!これで準備ができました!それでは、写真を撮ってみましょう!

 

Raspbianの準備

Download Raspbian for Raspberry Pi
今回は2016年5月27日リリース版を使用します。

いつもどおり最新版のRaspbianをインストールして進めてみたところ、カメラを使う前にフリーズが多発……デスクトップ環境とカメラを同時に使うと負荷が大きすぎるようでした。
そんなわけで、今回も「Raspbian Jessie Lite」を使うことにしました。

詳しいインストール手順については、第41回「見た目も中身もコンパクトに!Raspberry Pi ZeroをCUI環境で動かそう」を参考にしてください。Raspbian Jessie LiteのインストールからNASの導入まで、一気に設定してしまいましょう!

オートログインの設定
sudo raspi-config
「3. Boot Options」-「B2 Console Autologin」の順に選択します。

Wi-Fiの設定
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

/etc/wpa_supplicant/wpa_supplicant.confに追記

network={
    ssid="SSID"
    psk="パスワード"
}

sambaのインストール
sudo apt-get update
sudo apt-get install -y samba
sudo mkdir -m 777 /home/pi/nas/
sudo nano /etc/samba/smb.conf

/etc/samba/smb.conf に追記

[nas]
path = /home/pi/nas/
guest ok = Yes
read only = No

どれも必須ではないのですが、CUI環境で扱う場合には個人的にオススメの設定になります。

今回はプログラミングが入るので、PC間でプログラムファイルをやり取りできるように、NASを導入しておくと便利です。
sambaのインストールがうまくいかない場合は、パーティションの拡張を行うと解決することがあります(詳しくは第41回「見た目も中身もコンパクトに!Raspberry Pi ZeroをCUI環境で動かそう」の「Raspbianのメモリについて」)にて!)。

続いて、カメラの設定を行います。
カメラモジュールの使い方については、公式サイトのドキュメントが用意されているので、こちらを参考に進めましょう。

Camera Module – Raspberry Pi Documentation

sudo raspi-config

raspberrypi43_img07

図8

「6. Enable Camera」を選択します。

raspberrypi43_img08

図9

すぐに、カメラを有効にするかどうかを聞かれますので、Yesを選択します(初期状態ではNoが選択されています)。

raspberrypi43_img09

図10

再起動するかどうかを聞かれますので、さらにYesを選択。再起動後、カメラが使える状態になっています!

 

picameraで撮影!

公式サイトのドキュメントによると、カメラを使う方法にはシェルスクリプトとPythonの2種類が用意されています。
シェルスクリプト版は、デバプラのダウンロード資料「DevicePlus 電子工作マニュアル Vol.3 ~ラズベリーパイを活用してみよう(初級編)〜」で紹介しているので、今回はPython版で進めていきたいと思います!

Python picamera – Raspberry Pi Documentation

まずは「python-picamera」というパッケージをインストールします。

sudo apt-get install python-picamera

picamera
ちなみに、picameraについてのドキュメントページがこちらです。サンプルソースもたくさん紹介されています!

/home/pi/nas/test.py

import picamera
camera = picamera.PiCamera()
camera.capture('nas/image.jpg')

写真を撮影するだけなら、ドキュメントで紹介されているこの3行だけで可能!

raspberrypi43_img10

撮影中は端のライトが赤く光ります。
こんな状態で撮影したので、

raspberrypi43_img11

こんな写真が撮れました(天井の配管ですね……)。

画像ファイルは、プログラムを実行したときのカレントディレクトリ(piユーザーの場合、デフォルトでは /home/pi/ )を基準に保存されます。今回はNASの中に保存したいので、「camera.capture」関数の引数に「nas/image.jpg」と指定しています。

デフォルトの画像サイズは、ディスプレイを接続しているかどうかによって異なるようです。
わたしの環境では、ディスプレイ接続時は横1980px縦1080px、接続していないときは横720px縦480pxの画像が出力されていました。picameraの場合、画像サイズはパラメータで設定できるので、環境に左右されないためにも指定しておくことをオススメします。

写真として保存するだけでなく、カメラにも映っているものをリアルタイムで表示するプレビュー機能もあります。開始と終了を指定するので、「time」ライブラリと一緒に使います。

3. Quick Start — Picamera 1.10 documentation

import time
import picamera

camera = picamera.PiCamera()
try:
camera.start_preview()
time.sleep(10)
camera.stop_preview()
finally:
camera.close()

上記は、10秒間、ディスプレイにプレビュー画像を表示するプログラムです。CUI操作のRaspbian Jessie Liteですが、映像はきちんと表示できました。
映像は、ラズベリーパイに直接接続しているディスプレイに表示されます。SSH接続で使用している場合、操作しているPCでは見ることはできません。ディスプレイを接続してしまうとせっかくのコンパクトさが活かされなくなってしまう……と考えると、Raspberry Pi Zeroの場合はあまり出番が無いかもしれませんね。

import picamera
camera = picamera.PiCamera()
camera.start_recording('nas/video.h264')
camera.wait_recording(10)
camera.stop_recording()

最後は動画です。
ファイル名には、拡張子「.h264」または「.mjpeg」を含めた文字列を指定します。利用できないファイル形式を指定すると、フリーズして操作不能になってしまうことが多かったので注意しましょう。

ラズベリーパイ公式サイトのサンプルソースでは「time.sleep()」が使われていますが、picameraのドキュメントサイトの解説を見てみると「picamera.wait_recording()」を使うように推奨されていました。

 

定点カメラを作ろう!

この連載でもおなじみの、cronを使った自動実行シリーズ!写真を撮影・保存するプログラムを作成し、定時実行させてみたいと思います。

/home/pi/nas/camera.py

import picamera
import datetime
import os

now = datetime.datetime.now()
dir_name = now.strftime('%Y%m%d')
dir_path = '/home/pi/nas/'+dir_name
file_name = now.strftime('%H%M%S')

if not os.path.exists(dir_path):
os.makedirs(dir_path)
os.chmod(dir_path, 0777)

picamera = picamera.PiCamera()
picamera.capture(dir_path+'/'+file_name+'.jpg')

10分毎に写真を撮影し、保存するプログラムです。時間をファイル名として、日付毎にフォルダ分けして写真を保存しています。保存先にNASのディレクトリを指定して、別のPCから取り出すことが可能です。

このプログラムをcronに登録して、自動実行できるようにします。

sudo crontab -e

最終行に1行追記します。

0-59/10 * * * * python /home/pi/nas/camera.py

フォルダの中に、10分毎に画像ファイルが増えていけば、成功です!出力ファイルの時間が正しくない場合は、「raspi-config」からタイムゾーンを設定しましょう。

できました、定点カメラ!
長期間連続して実行させることを考えると、モバイルバッテリーではなく、コンセントから電源を取る方が良さそうですね。植物の成長記録など、時間をかけて少しずつ変化するようなものを対象にするとおもしろそうです!

 

まとめ

GPIOピンが標準搭載ではないRaspberry Pi Zeroは、ボタンやセンサーなどを取り付けるには手間がかかってしまうこと、そして部品を増やすとサイズが大きくなってしまったり、消費電力が増えてしまったり、せっかくのZeroの良さが半減してしまう……ということで、今回の定点カメラのような使い方がオススメです。

ちなみに、ラズベリーパイのカメラを扱っているデバプラ記事は他にもありますよ!こちらも合わせてご覧くださいませ!

Raspberry Piで作るダンボールデジカメの作り方
DevicePlus 電子工作マニュアル Vol.3

NHK学生ロボコン2016 出場ロボット解剖計画
円山ナカノ

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。