2017年12月23日土曜日

AA-Camera を作る (カメラ作成編)

この記事は、ケーシーエスキャロット Advent Calendar 2017 の23日目の記事になります。

使うもの


まずはラズパイ本体。RaspbetyPi 3 ModelB です。トランプとほぼ同じ大きさのシングルボード・コンピュータです。



小型でもパソコンとして必要なものは一通り揃っています。CPU は ARM プロセッサのクアッドコア 1.2 GHz。GPU も積んでいます。USB ポートを4つに HDMI 端子1つ。100Mbps のイーサネットポートも搭載。Bluetooth4.1 にも対応してます。45g という超軽量ながら、抜群の能力を秘めています。
しかも電子工作には欠かせない、GPIO を搭載しています。GPIO とは General Purpose Input/Output(汎用入出力)の略で、文字通りの入出力ピンがずらっと並んでいます。これにスイッチや LED やセンサー等を繋いで電子工作ができます。



次にラズパイカメラ。SONY 製の CMOS センサー「IMX219」を搭載しており、800 万画素の能力を持っています。3280x2464ピクセルまでの写真や、1080p・30fps までの動画を撮影することができます。500円玉よりひと回り小さいくらいのサイズなのに、かなりの高性能です。ラズパイと組み合わせれば、ちょっとしたデジカメは簡単に自作できてしまいます。(制御するためにちょっとだけ python の知識も必要です)



あとは、電子工作に必要なものがいくつか。ブレッドボードやジャンパー線、LEDやスイッチに抵抗など、おきまりのパーツ達です。

組み立て

カメラのケーブルを挿すためのコネクタがありますので、ラズパイカメラはそこに差し込むだけです。他のパーツは以下のように接続します。これで、GPIO27(入力ピン#13) からスイッチの状態を読み込むことができるようになります。それだけだと寂しいので、ついでに GPIO12(出力ピン#32) に信号を送ることで自由に LED を光らせることができるようにもう1つの回路を組んであります。



実際にカメラとスイッチとLEDを繋いだ状態がこれ。




プログラミング

HDMIの出力ポートがありますのでテレビやモニタに繋いで、USBキーボードやマウスを接続すれば、普通のLinuxPCとして使えます。プログラミングはそんな環境で行います。と言っても、無線LANを搭載していますので、一度ネットワークの設定を済ませて、SSH で接続できるようにしておけば、普段使っている PC から操作できますので、モニタやキーボードなどを接続する必要も無くなります。(そのあたりの説明は省略)

どんな環境であれ、とにかくラズベリーパイ上に GPIO を制御するための python ライブラリをインストールしましょう。

$ pip3 install wringpi

以上!
簡単。これで python から GPIO を制御できるようになります。

   1 !/usr/bin/python
   2 # -*- coding: utf-8 -*-
   3 
   4 import wiringpi as pi, time
   5 
   6 switch_pin = 27
   7 led_pin = 12
   8 
   9 pi.wiringPiSetupGpio()  
  10 pi.pinMode(switch_pin, 0)
  11 pi.pullUpDnControl(switch_pin, 2)
  12 
  13 pi.pinMode(led_pin, 1)
  14 
  15 before_switch = 0
  16 
  17 while True:
  18     status = pi.digitalRead(switch_pin)
  19     time.sleep(0.1)
  20     if (status != before_switch):
  21         before_switch = status
  22         if (status == 0):
  23             pi.digitalWrite(led_pin, 1)
  24         else:
  25             pi.digitalWrite(led_pin, 0)

スイッチのピンから0.1秒間隔で状態を読み込んで、状態に変化があった時だけ LED を点灯したり消灯したりします。 説明が雑ですが、実際その程度のことしかしていません。ここまでだと、スイッチを押したら LED が光るだけのプログラムです。LED を光らせるのではなく、カメラで撮影するのが目的ですので、このあたりの処理を置き換えましょう。

というわけで、ラズパイカメラを使うための python ライブラリもインストールします。

$ pip3 install picamera

以上!

やっぱり簡単。さすが python。

で、先ほどのコードを更新します。

  1 #!/usr/bin/python
  2 # -*- coding: utf-8 -*-
  3 
  4 import wiringpi as pi, time
  5 import datetime
  6 import picamera 
  7 
  8 switch_pin = 27
  9 
 10 pi.wiringPiSetupGpio()
 11 pi.pinMode(switch_pin, 0)
 12 pi.pullUpDnControl(switch_pin, 2)
 13 
 14 before_switch = 0
 15 
 16 with picamera.PiCamera() as camera:
 17     camera.resolution = (1280, 720)
 18     camera.rotation = 180
 19     camera.start_preview()
 20     camera.preview_fullscreen = False
 21     camera.preview_window = (100, 100, 640, 360)
 22 
 23     while True:
 24         status = pi.digitalRead(switch_pin)
 25         time.sleep(0.1)
 26         if (status != before_switch):
 27             before_switch = status
 28             if (status == 0):
 29                 now = datetime.datetime.now()
 30                 camera.capture("{0:%Y%m%d_%H%M%S}.jpg".format(now))
 31 
 32     camera.stop_preview()

カメラの初期設定が数行ありますが、それ以外はシンプルです。camera.capture() で写真を撮影し、引数に指定したファイル名で保存するだけです。これで、簡単なデジカメは完成です。

0 件のコメント:

コメントを投稿