デジタルカメラを自作してみよう【回路設計・デバッグ編】

今までのあらすじ

 以下のような感じです。

 回数を重ねることに無駄に注目が集まっているので、正直プレッシャ感じてます。すみません、嘘つきました。なんとも思ってないのです。ただ、ほんのちょっとだけ責任は感じているので頑張って続きを書いてみます。

回路を設計しよう

 前回はRaspberry PiのSetupまでしたので、Raspberry Piを中心として回路設計をして簡単なデバッグ(動作確認)までをしましょう。回路設計は人にもよりますが、大体以下のようなものを順につくっていきます。大きいものから小さいもの、概略から詳細を設計していくのが基本です。

  • ブロック図
  • 系統図
  • ポート割り付け
  • 回路図

必要な物

 前回のRaspberry Pi Setup編で購入したものは省略

Sanwa(三和電気計器) デジタルマルチメーター PM-3

Sanwa(三和電気計器) デジタルマルチメーター PM-3

 家のテスタが壊れてたので、Amazonで評価が良かったものを購入。よい感じです。ホームセンタとかで適当なもの買ってもよいですが、何度も使う物なので多少お金を出してもよいかと思います。ちっちゃい奴が一個あると便利です。

サンハヤト ニューブレッドボード SAD-11

サンハヤト ニューブレッドボード SAD-11

 ブレッドボード。大きめのものが一個あると便利。

ジャンパワイヤ 50本セット(オス~メス) - スイッチサイエンス
プローブ付きジャンパワイヤ (8本セット) - スイッチサイエンス
 ワイヤ類。デバッグに便利

http://www.amazon.co.jp/sapporo-boueki-タクトスイッチ<スイッチ高さ3mm-10個入><swp-007-a>/dp/B00I36NGIQ/ref=sr_1_39?s=diy&ie=UTF8&qid=1410783561&sr=1-39

 タクトスイッチ。好きな色とかを買って下さい。うまくリンク貼れなかったけど、Amazonでもタクトスイッチで検索すると結構安い奴出てきます。Amazonリンク貼れました。

 ディスプレイ

ビデオケーブル 1m コンポジットケーブル 1ピン-1ピン

ビデオケーブル 1m コンポジットケーブル 1ピン-1ピン

 ディスプレイとRaspberry Piの映像接続

Pololu 可変型昇圧レギュレータ4~25V - スイッチサイエンス
 昇圧電源

 半田付けは機構と合わせて次回やるので、今回は半田こてはありません。待ちきれないという人は、ホームセンタとかで買って練習しておいて下さい。0.4mmピッチのICを実装できるようになったら合格です(嘘です、私も不器用なのであんまり得意じゃないです)。

ブロック図

 まずはブロック図というものをつくったりします。

f:id:karaage:20140907221629j:plain

 まあこんな感じに細かいことは描かず大きい部品とか使用する信号をかきます。複雑なシステムになると電源・リセット、映像、音声とかそれぞれの目的別のブロック図(系統図と言ったりもします)を描いたほうがよいです。特に電源・リセットは重要。ただ、今回はそこまでやることはないので省略。ただ、電源に関しては重要なので使用電流だけブロック図に記載しています。
 すると今回のシステム、実は2Aの電源でも結構ギリギリだということが分かったりします。

 あと、大きい部品(ディスプレイ、電源、バッテリー)等はここで決めてあげましょう。もちろん機構や製品の性能のことを考えて部品を決めましょう(サイズ、スペック等)。

 ディスプレイはサイズと電力からこれを選定

Pololu 可変型昇圧レギュレータ4~25V - スイッチサイエンス
 ディスプレイが6V以上なので、小型なD/D コンバータ(昇圧電源)をディスプレイとRaspberry Piの間にかませます。昇圧電源の設計って結構難しいのですがこうやってモジュールを買っちゃえば3カ所繋ぐだけ。楽勝ですね。

 バッテリーはサイズからこれにします。3000mAhなので動かしっぱなしだと大体1.6H(=3000mAh/2000mA)程度動くということがここで決まります。

ポート割り付け

 マイコンのポートにどんな機能を割り付けるか考えます。Raspberry Piの場合は主要のリソースは使いやすいようにHDMIコネクタとかUSBコネクタとか色んなポートに割り付けられているので、基本的にはピンヘッダから出ているポートの割り付けを考えればよいです。エクセルとかで作るのがよいですね。ソフト作る人が別にいる場合は、色々相談して決めた方がよいですが今回はソフトつくるのも自分なので適当に好き勝手に決めましょう。

f:id:karaage:20140910220936j:plain
 こんな感じね。

 あ、ちなみにGPIOというのは、General Purpose Input/Output(汎用入出力)の略で、高い電圧(3.3Vとか)と低い電圧(0V)を出力したり入力したりできる便利なポートです。

 私はOffice持ってない貧乏人なので、google driveのスプレッドシートを使いました。

Raspberry Pi Pin Mux for camera 140906 - Google スプレッドシート

 ピンヘッダとポートの対応は以下のサイトが分かりやすいです。真ん中らへんの図を参考にして下さい。

 ただ、上記のサイト。GPIO **/** という紛らわしい書き方してあるピンは注意。Raspberry PiのRev(リビジョン)によってポートが異なるみたいです(恥ずかしながらちょっとはまりました)。メモリが256MBがRev1で512MBだとRev2になりますのでこのサイトからリンクしてあるRaspberry PiだとRev2になります。Revの違いによるポートの変更の詳細は以下に情報があります。

RPi Low-level peripherals - eLinux.org

回路図

 いよいよ回路図!といいたいところですが、ブロック図とポート割り付けみればすぐわかるので省略。まあ要はRaspberry Pi使えばあんま細かいことは気にしなくても使えちゃうってことです(ほんとか?)
 すみません、正直Raspberry Piとかのモジュール使った回路図ってちょっと面倒くさいんです。この後のデバッグで図とか写真で補完しますので勘弁して下さい。

デバッグしよう

 趣味なので、いきなり半田付けしてもよいのですが、事前にデバッグ(動作確認)するのがよいです。仕事でソフト屋さんが別にいる場合は必ずやるようにしましょう。しないとえらいことになります(詳しくは想像してね☆)まあハード設計者としてもデバッグ用の簡単なプログラムくらいは組めた方がよいというわけです。というかできないとダメだと思う。

スイッチ部

 まずはスイッチ部に関してです。

実体配線図

f:id:karaage:20140910223116j:plain
 こんな感じです。

 fritzingというソフト使うと。こんな感じの素敵な絵が簡単に描けます。

Fritzing Fritzing

 デフォルトだとRaspberry Piのライブラリ(絵)が無いので、別途ダウンロードしてインポートしてやって下さい。

Fritzing Project – Raspberry Pi GPIO

写真

f:id:karaage:20140907113206j:plain

 繋いだ図。スイッチが一つ多いですが、そこはまあ勢いというやつです。テスタで繋がっているかをちゃんと確認するとよいでしょう。スイッチもボタン押すとどことどこが繋がるかをちゃんと確認しておきましょうね☆

デバッグ用ソフト

 デバッグ用のソフトです。pythonというプログラミング言語を使います。なにせ、Raspberry Piのパイはpythonのパイらしいです。スペル違うじゃねぇか!!まあ郷に入っては郷に従えというやつですね。
 Raspberry Piにターミナルでログインして gpio_test.shというファイルを作りましょう。

$ cd
$ vi gpio_test.sh

gpio_test.shは以下ね。

#!/usr/bin/python
# -*0 coding: utf-8 -*-
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(10, GPIO.IN, pull_up_down = GPIO.PUD_UP)

while True:
	GPIO.wait_for_edge(17, GPIO.FALLING)
	print("Button 1 Pressed")
	GPIO.wait_for_edge(10, GPIO.FALLING)
	print("Button 2 Pressed")

GPIO.cleanup()

 中身を簡単に解説すると、1行目はpython使うぜというおまじないです。2行目は日本語対応、これもおまじない。3行目はpythonでGPIOいじれるライブラリのインポートです。

 その後はポートの設定です。GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_UP) はGPIO17のポートをGPIOの入力に使うという意味です。pull_up_down = GPIO.PUD_UP というのはRaspberry PiのGPIOのインターナルプルアップ抵抗を有効にします。
 今の回路だと、スイッチが押されてないとき、ポートの入力がオープンになっていて不定になってしまいます。通常だと電源にプルアップ抵抗を接続することでHighに固定できるのですが、これをマイコン内部で実現できる便利な機能です。少しでも外部部品を減らすために積極的に機能を使って行きましょう。プルアップに関してよく分からなくて興味ある人はグーグル先生に聞いておいて下さい(適当)。

 その後は、GPIO17に繋がっているボタンが押されると"Button 1 Pressed"が表示され、次にGPIO10に繋がっているボタンが押されると"Button 2 Pressed"が表示されるという動作を延々と繰り返します。最後の GPIO.cleanup()はGPIO使うお約束みたいなものです。

スイッチテスト

 以下のコマンドを実行しましょう(chmodは最初の一回だけでOK)

$ chmod 755 gpio_test.sh
$ ./gpio_test.sh

 ボタン押して"Button 1 Pressed", "Button 2 Pressed" が表示されたら成功です。表示されなかったらどっかおかしいのでテスタとか使ってチェックしましょう☆

カメラシャッターテスト

 ちょっとデバッグソフトを弄ってシャッターでカメラ撮れるようににしちゃいましょう。プログラムは以下です。うまくいけば、GPIO17を押すと撮った写真が"cameratest.jpg"というファイルに保存されます。なんかもうカメラできたも同然だね☆

#!/usr/bin/python
# -*0 coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import picamera

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(10, GPIO.IN, pull_up_down = GPIO.PUD_UP)/Users/karaage/Desktop/gpio_test.sh

while True:
	GPIO.wait_for_edge(17, GPIO.FALLING)
	print("Button 1 Pressed")
	with picamera.PiCamera() as camera:
		camera.resolution = (1024,768)
		camera.start_preview()
		time.sleep(2) # initialize camera
		camera.capture('cameratest.jpg')	
	GPIO.wait_for_edge(10, GPIO.FALLING)
	print("Button 2 Pressed")

GPIO.cleanup()

ディスプレイ・電源部

f:id:karaage:20140907125346j:plain
 昇圧電源モジュールとは写真のように繋ぎましょう。5VとGND(電圧の基準)を昇圧電源に繋いでやります。

f:id:karaage:20140907125231j:plain
 テスタで昇圧電源モジュールの出力電圧をチェックしましょう。ディスプレイの入力電圧範囲の6〜15VになっていればOKです。私は適当に7Vにしました。6〜15Vに入っていなかったら、モジュールのつまみをドライバでくるくる回してやりましょう。電圧が変化するはずなので6〜15Vになるように設定してやりましょう。

f:id:karaage:20140907125657j:plain
 そしたらRaspberry Piと昇圧電源モジュールとディスプレイを繋いでやりましょう。電源とビデオケーブルね。ちゃんと繋いでやれば、Raspberry Piを起動すれば絵が出ます。

バッテリ

 モバイルバッテリ繋いで動作を確認できればOK!詳細は省略。

今後の予定

 いよいよ次回、機構設計と半田付けに入ります。次回でハードウェアに関しては最終回かな(多分)。半田ごて今のうちから暖めておいてね☆

参考リンク

http://picamera.readthedocs.org/en/release-1.8/
 pythonでRaspberry Piのカメラモジュールを操作する方法

関連記事

karaage.hatenadiary.jp