このところ電子工作系の記事が続いていますが、久しぶりにRaspberry Pi関連の内容を扱ってみたいと思います。今回はRaspberry Piのカメラモジュールの使い方、そして応用編として、撮影した写真をメールに添付して送信する方法について扱ってみたいと思います。

カメラモジュールを使った撮影+メール送信は応用範囲が広いのでいろいろ役立てることができそうです。

スポンサーリンク




目次

  1. 必要なものを揃えよう
  2. カメラモジュールの基本的な使い方
  3. SMTPを経由したメール送信の方法
  4. 撮影した写真をメールに添付する方法
  5. まとめ

1. 必要なものを揃えよう

※上記のリンクはamazonへのリンクとなっています。

必要なものとして現時点の最新版を挙げましたが、必ずしも最新モデルが必要なわけではありません。お手持ちのものがあれば十分かと思います。この記事を書くのに使っているモデルも旧モデルのRaspberry Piと初代カメラモジュールです。

なお、冒頭の写真にある通りRaspberry Pi Zeroの場合、専用の超小型カメラモジュールを使いますが、使い方は全く一緒です。

Raspberry Pi Zero用のカメラモジュールですが、amazonで探してみると安物の互換品(互換品というかコピー?)は売られているようですが、本物を入手するのは難しそうです。またスイッチサイエンスでも在庫がよく「0」になっています。

どうしても欲しい方は、PIMORONIなどの海外サイトから入手した方がいいかもしれません。ちなみに、自分はよく利用しますが支払いはPayPalで、概ね10日〜2週間程度で国際郵便で届きます。

やり取りは英語になりますが、商品をカートに入れてPayPalで支払うだけですし、特に難しいことはありません。これまで5、6回利用していますが、届かないなどのトラブルに遭ったことは一度もありません。送料はクッション付きの封筒で入るようなものであれば、£5〜6 GBP(600〜800円程度)だったと思います。ラズパイ等のステッカーをオマケで同封してくれることがあります。

日本では珍しいブラック仕様や160度の画角をもつ魚眼タイプもありますよ!

2.カメラモジュールの基本的な使い方

まずは、カメラ専用のインターフェースにカメラモジュールをセットします。冒頭の写真を参考にしてみてください。

2-1.カメラモジュールを有効にする

次いで、「raspi-cofig」コマンドで、カメラモジュールが使用できるように設定を変更します。ターミナルを使ってRaspberry Piにアクセスしたら、raspi-configコマンドで設定画面を呼び出します。

$ sudo raspi-config

上記の画面が表示されたら「5 Interfacing Option」を選択します。選択には「↑」「↓」キーを使います。

今度は一番上の「P1 Camera」を選択します。

「カメラインターフェースを有効にしますか?」と聞かれるので「<はい>」を選択します。これでカメラモジュールを使うことができます。

2-2.カメラの撮影コマンドについて

まずは、撮影した画像ファイルを保存するための最低限のコマンドを実行してみましょう。このコマンドを実行すると、撮影中にミニLEDが点灯して撮影されます。撮影後、コマンドを実行したディレクトリに「photo.jpg」が保存されるはずです。

$ raspistill -o ./photo.jpg

この状態で撮影した写真画像は、カメラモジュールの最大解像度となります。記事を書く際にテストしたRaspberry Pi Zero W + 専用カメラモジュールの場合、w: 2592px、h: 1944pxというサイズで保存されました。

では今度は、撮影オプションを指定してみましょう。一例として、サイズとホワイトバランスを指定してみたいと思います。

$ raspistill -w 800 -h 600 -awb fluorescent -o ./photo.jpg

上記の「-w 800 -h 600」のように指定することで、横サイズ、縦サイズをそれぞれ指定することができます。また「-awb fluorescent」は、ホワイトバランを「蛍光灯」に設定しています。

ホワイトバランスのオプション指定

オフoff
オートauto
晴天sun
くもりcloud
日陰shade
タングステンタイプtungsten
蛍光灯fluorescent
白熱電球incandescent
フラッシュflash
日没光horizon

※ ホワイトバランスは、何も指定しないと常にオートになるようです。ですので、特に気にされない方は指定しなくても良さそうです。

下記は実際に撮影した画像(ノートリミング)です。オプションは「-w 800 -h 600 -awb auto」としました。

手前のラリーカーのプラモデルまではカメラから12cm程度離れていますが、少しピントが甘くなっています。ピントをしっかり合わせるにはカメラから被写体まで最低でも20cm程度は離した方がよさそうです。また、撮影時に使用したデスクライトは実は白色LEDなのですが、撮影した画像はやや青みがかった色になってるのが特徴です。

2-3.その他の撮影オプションについて

カメラモジュールには、これら以外にも多彩な機能が用意されています。基本的な撮影オプションだけでなく、アートフィルターなども用意されているので、撮影していろいろ遊ぶことができそうです。また、今回の記事では静止画の撮影しか扱いませんでしたがラズパイのカメラモジュールは動画撮影も可能です。

下記のブログでカメラモジュールの使い方に関する詳細なレポートが掲載されていましたので、興味のある方は参考にされるとよいと思います。

Jun’s Home page
https://www.mztn.org/rpi/rpi23.html

3. SMTPを経由したメール送信の方法

カメラモジュールの基本的な使い方が分かったら、次はPyhtonでメール送信のプログラムを書いてみたいと思います。メールを送信するためのサンプルコードを下記に示します。

なお「メール送信設定」の部分は、あなたが利用しているメールサーバーの設定を入力してください。

# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# メール送信設定
SMTP_SERVER = 'smtp.server.jp'
SMTP_PORT = 587
SMTP_ID = 'your id'
SMTP_PW = 'your password'
MAIL_FROM = 'your email'
MAIL_TO = 'your email'

# メール送信
def send_attached_mail(subject, massage):

	# 文字コード設定
	charset = 'ISO-2022-JP'

	mail = MIMEText(massage.encode(charset), 'plain', charset)
	mail['Subject'] = Header(subject, charset)
	mail['From'] = MAIL_FROM
	mail['To'] = MAIL_TO
	mail['Date'] = formatdate(localtime=True)

	smtp = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
	smtp.login(SMTP_ID, SMTP_PW)
	smtp.sendmail(MAIL_FROM, MAIL_TO, mail.as_string())
	smtp.close()

# メイン関数
def main():

	# メール設定
	subject = u'メールタイトル'
	massage = u'メール本文\n'

	# メール送信
	send_attached_mail(subject, massage)

if __name__ == '__main__':
	main()

このようにコードを書くことで外部SMTPを経由したメール送信が可能です。上記のサンプルではテキストメールしか送りませんので、文字コードは「ISO-2022-JP」を指定しています。

4.撮影した写真をメールに添付する方法

それでは、いよいよカメラモジュールで撮影した画像をメールに添付して送信する方法を扱ってみたいと思います。

先ほど書いたコードを下記のように書き換えてみましょう。

# -*- coding: utf-8 -*-
import os
import time
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from os.path import basename

# メール送信設定
SMTP_SERVER = 'smtp.server.jp'
SMTP_PORT = 587
SMTP_ID = 'your id'
SMTP_PW = 'your password'
MAIL_FROM = 'your email'
MAIL_TO = 'your email'

# メール送信
def send_attached_mail(subject, massage, attach_path):

	# 文字コード設定
	charset = 'ISO-2022-JP'

	mail = MIMEMultipart()
	mail['Subject'] = Header(subject, charset)
	mail['From'] = MAIL_FROM
	mail['To'] = MAIL_TO
	mail['Date'] = formatdate(localtime=True)

	# メール本文を添付
	body = MIMEText(massage.encode(charset), 'plain', charset)
	mail.attach(body)

	# 写真を添付
	with open(attach_path, "rb") as f:
		photo = MIMEApplication(
			f.read(),
			Name=basename(attach_path)
		)
	photo['Content-Disposition'] = 'attachment; filename="%s"' % basename(attach_path)
	mail.attach(photo)

	smtp = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
	smtp.login(SMTP_ID, SMTP_PW)
	smtp.sendmail(MAIL_FROM, MAIL_TO, mail.as_string())
	smtp.close()

# メイン関数
def main():

	# メール設定
	subject = u'撮影した写真'
	massage = u'撮影した写真を送ります。\n'
	attach = u'photo.jpg'

	# 撮影
	os.system('raspistill -w 640 -h 480 -awb auto -o ' + attach)
	time.sleep(10)

	# メール送信
	send_attached_mail(subject, massage, attach)

if __name__ == '__main__':
	main()

2〜10行目:

冒頭のimport文がいくつか増えているので注意してください。

26行目:

先ほどはテキストメールでしたが、今度は画像を添付するので、メール本体を「MIMEMultipart()」としている点が異なります。

33行目:

本文テキストの文字コードは「ISO-2022-JP」を指定して添付しますが…

36〜43行目:

撮影した写真はこのような記述で添付します。

59行目:

カメラ撮影には「os.system」関数でコマンドそのま書いて指定しています。

5.まとめ

このプログラムをcronで回せば、カメラモジュールを使った定点観測が可能ですし、トリガーをcronではなく、人感センサー等に引かせれば、ペットの見守りカメラや、防犯カメラとしても役立てることができそうです。是非、ご自身のアイデアで役立ててみてください!