ラズパイでズームレンズが使えるコンデジを作ってみました。
完成したものがこちら。
カメラモジュールは Raspberry Pi Camera V2 を使っています。レンズはCマウントか、CSマウントのレンズを付けれるようにします。液晶モニターを見ながらズームやピントを合わせて、ボタンをポチッと押したら撮影できます。
必要なもの
- Raspberry Pi 3 Model B+
- Raspberry Pi Camera V2
- 3Dプリンター
- その他こまごましたものたくさん
作業全体の流れとしてはこのような感じになります。
必要なパーツを3D印刷する
STLファイルを Thingiverse にアップしてあるのでダウンロードして印刷してください。
Raspberry Pi Camera Case with CS(C) Mount Lens
レンズを固定するマウントです。3D印刷したパーツとアルミのリングを接着して使います。
スイッチ類やバッテリーを入れる部分です。カメラを構えるときに右手で握る場所でもあります。本体と接着します。
ラズパイやカメラモジュールや液晶が入る場所です。
最終的にはこのような形にくっつけます。
黒い丸いのはCマウントのリングです。3Dプリンタではネジの部分を再現できないのでこれは購入して接着剤で付けてしまいます。
uxcell アダプターリング CSマウントレンズ-Cマウントカメラ ブラック アルミ マウントアダプター
接着剤はエポキシ樹脂のものが接着力が超強力なのでおすすめです。これは溶剤を混ぜてから5分で硬化がはじまるもの。
セメダイン 5分硬化型エポキシ系接着剤 ハイスーパー5 15gセット箱 CA-184
Cマウントリング以外は作業のしやすさを考慮して、まだ接着しないでおきます。
カメラモジュールから余計なものを外す
ラズパイカメラのイメージセンサーは基盤に両面テープで固定されているのですが、ものによっては間にクッションが挟まっているものもあります。綺麗に映像を撮影するにはイメージセンサーとレンズの位置が正確に合ってる必要があります。なのでこれらを取り除きます。
モジュールが浮いてます。
ピンセットなどでそーっと外してあげます。コネクターのところも少し力を加えれば外れます。
両面テープとクッションを外して、接着剤でモジュールを基盤に付け直します。
次にレンズを外します。
この白く丸いものはラズパイレンズの焦点を調整できるものなのですが、どこで手に入れたのか覚えていません。何かのセットに含まれていたようです。
いちおうここで売ってますが日本に発送できるのかは試してないです。
Lens Adjustment Tool for Raspberry Pi Camera
3Dモデルにレンズを外すツールを含めてあります。プリンターの精度によっては使えないかもしれません。
だめな場合はピンセットなどでも外せるので、慎重にレンズをつまんで時計と反対方向に回してみてください。
綺麗に外せました。
レンズを外すとイメジーセンサーが見えます。
配線と組み立て
まず。ケースの中に何が含まれているのかざっくりと説明します。
バッテリーは3.7Vで1200mAhのリチウムポリマーバッテリーです。ラズパイの電源は5Vなので、3.7Vバッテリーを昇圧器に繋いで5Vに変換します。この昇圧器はバッテリーの充電もできるものです。充電したいときはMicro USBで接続します。このモジュールはさすがに日本では売ってないようです。輸入するか別のもので代用したほうが良さそうです。
PowerBoost 1000 Charger - Rechargeable 5V Lipo USB Boost @ 1A - 1000C
バッテリーは1200mAhのものを探せなかったですけど、2000mAhでもケースに収められるかもしれません。
【防犯用】【超小型カメラ】 【小型ビデオカメラ】 基板完成ユニット用二次バッテリー リチウムポリマー電池 3.7V 2000mAh (UT-004)
電源スイッチは昇圧器からラズパイに繋ぐ端子の途中に入れます。
撮影用スイッチはラズパイのGPIOと3.3V出力に繋ぎます。
それでは組み立てていきましょう。まずカメラモジュールをレンズマウントにネジで止めます。
ネジは M2x6 (太さ2mmで長さ6mm) のネジとナットで止めれます。
GORCHEN M2 M2.5 M3 M4 M5 フィリップス ボルトセット ロックワッシャ 平ワッシャー ステンレス 収纳ケース付き 修理ツール 400本入り
シャッターボタンを作ります。
端子はラズパイのGPIOにつなぐのでデュポンケーブルのメス側を接続します。
ここにピンセットなどを指せばカバーを外せます。モニターの接続と干渉するので必ず外します。
昇圧器からラズパイに接続するケーブルを半田付けします。
昇圧器をケースにネジで止めします。M2x8あたりを使うとよいと思います。
電源スイッチとシャッターボタンをケースに接着剤をとめます。
ラズパイに電源接続のケーブルをはんだ付けします。
ラズパイを台に固定します。この台はラズパイとモニターを本体に固定するためのものです。
最後の仕上げとしてケーブル類を繋いでいきます。撮影スイッチはGPIO4に繋ぐことにします。2本のうちどちらを3VとGPIO4に繋いでも問題ありません。蓋をネジで固定する時に使うナットも接着剤で付けてしまいます。
モニターをラズパイに接続します。
モニターはこれを使いました。
OSOYOO HDMI 3.5インチLCDディスプレイ モニター タッチスクリーン Raspberry Pi 3 2 Model B に対応 (3.5" HDMI LCD)
モニターの設定には手間取ったけど、ここを参考にたらうまくできました。
Raspberry Pi に3.5inch HDMI タッチスクリーンモニタをつけてみた
そして、ラズパイとモニターを本体に格納します。ケースには小さな出っ張り(レール)があり、台の方には凹みがあります。うまく滑らせるようにはめます。台の奥の方にネジ穴があるので本体と固定します。
底板にも側面にレールがあるので上からはめます。!
バッテリーを接続して。
蓋をしてネジで止めて完成。
撮影アプリを動かす
撮影アプリはラズパイが起動したら自動的に立ち上がるようします。
アプリのプログラムはこのようになります。
import Tkinter as tk
import RPi.GPIO as GPIO
from datetime import datetime
import picamera
import os.path
import time
camera = picamera.PiCamera()
camera.resolution = (2592, 1944)
camera.rotation = 270
switchGPIO = 4
picturesPath = '/home/pi/projects/camera/output' # 写真の保存先
# フルスクリーンアプリを作るためのクラス
class FullScreenApp(object):
def __init__(self, master, **kwargs):
self.master = master
pad = 3
self._geom = '200x200+0+0'
master.geometry("{0}x{1}+0+0".format(
master.winfo_screenwidth() - pad, master.winfo_screenheight() - pad))
master.bind('<Escape>', self.toggle_geom)
def toggle_geom(self, event):
geom = self.master.winfo_geometry()
print(geom, self._geom)
self.master.geometry(self._geom)
self._geom = geom
window = tk.Tk()
FullScreenApp(window)
window.title("Camera")
shotLabel = tk.Label(text='')
shotLabel.place(x=564, y=20)
shotLabel.config(font=('System', 32))
window.update()
# カメラのプレビュー画面を表示する
def previewCamera():
scale = 0.85
w = int(640 * scale)
h = int(480 * scale)
camera.start_preview(
fullscreen = False,
window = (0, 67, w, h))
def initGPIO():
GPIO.setmode(GPIO.BCM)
GPIO.setup(switchGPIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def cleanGPIO():
GPIO.cleanup()
# 写真撮影
def takePicture():
filename = datetime.now().strftime('%Y%m%d-%H%M%S.jpg')
path = os.path.join(picturesPath, filename)
camera.capture(path)
checkSaved(path)
# 撮影できたかチェックしテキストを画面に表示する(まれに失敗する)
def checkSaved(path):
if os.path.exists(path) and os.path.getsize(path) > 0:
shotLabel['text'] = 'Saved'
else:
shotLabel['text'] = 'Error'
window.update()
time.sleep(3)
shotLabel['text'] = ''
window.update()
def main():
try:
initGPIO()
previewCamera()
switch = False
while True:
switchStatus = GPIO.input(switchGPIO) == GPIO.HIGH
if not switch:
if switchStatus:
takePicture()
switch = switchStatus
except KeyboardInterrupt:
pass
cleanGPIO()
camera.close()
if __name__ == '__main__':
main()
レンズから取り込まれた映像が常にスクリーンに写り、ボタンを押すと撮影し、ファイルが正しく保存された場合は画面に Saved と表示されます。まれに撮影してもファイルサイズが0バイトの時があるので、その場合はErrorと表示されます。
このファイルをラズパイの電源が入ったら自動で起動するように設定ファイルを書きます。Execの行を適当に変更してください。
[Desktop Entry]
Type=Application
Name=windowpy
Exec=/usr/bin/python2.7 /home/pi/projects/camera/camera.py
Terminal=false
どんなレンズが使えるのか?
CマウントとCSマウントのレンズが接続できます。CとCSは接続部分の経口が同じで、焦点距離だけCの方が5mm長くなります。そこでCマウントのレンズを接続するときは写真左下の5mmのリングを途中に挟みます。
写真には望遠レンズが3つ写っていて、一番手前の小さいのが 2.8mm-12mm, 2列目の左が 3.5mm-8mm, 二列目の中央が 6mm-15mm になります。2列目右は単焦点35mmです。
レンズに関しては日本でのリンクが見つけられなかったので海外で入手したときのリンクを書いておきます。
2.8-12mm 1/3" F1.4 CCTV Video Vari-focal Zoom Lens for CCTV Security Camera
Security Lens 1/3" 3.5-8mm f1.4 Varifocal, Fixed Iris CCTV Lens, CS Mount
Lapetus 6-15mm 1/3 F1.4 CS Mount Varifocal CCTV Manual Camera Lens
3mmくらいのレンズで普通の写真のような画角になります。なので手前の一番小さいレンズだけが普通の画角の写真を撮ることができます。ただし、このレンズはCマウントではなくM12マウントのレンズをC用に加工したものです。
3Dデータにアダプタパーツが含まれているのでレンズとアダプターとCマウントリングを接着剤で固定して使います。
単焦点35mmのレンズは10倍望遠のような絵しか撮れないので使い勝手はいまいちです。
Fujian 35mm f/1.7 CCTV cine lens for Sony NEX E-mount camera & Adapter bundle for Sony NEX7 NEX-F3 a6000 a5000 a3500
写真の奥にとても大きいレンズが写っていますが、これは 43mm-150mm で最大倍率は100倍になります。小さな生き物でも撮影しようかと思います。
Monocular 8x-100 x 43mm-150mm C-mount Zoom Glass Lens for Industry Lab Microscope Camera
撮影してみる
どのような絵が撮れるのか撮影してみます。使ったレンズは 2.8mm-12mm と 3.5mm-8mm です。
まず、撮影してみるとピントを合わせるのが非常に難しいです。モニターはできるだけ明るいものを選びましたが、それでも外で見るとかなり暗くピントが合っているのか確認するのが難しいです。またレンズが非常に小さいため、ピント調整を回す量を1mm変えるだけで合ったり合わなかったりします。
あまり綺麗に撮れない理由もいくつかあります。まずイメージセンサーは8万画素の解像度がありますが、レンズの解像度が低いので中央は綺麗に写っていても周囲にいくほどぼやけてきます。15ドル以下の安いレンズしか使っていないからかもしれません。そしてラズパイカメラモジュールの仕様なのか、どのモジュールを使っても周囲の四隅が赤みがかります。
しかしながら、マニュアル操作で距離とピントを合わせて撮るのはやはり楽しいものです。
塗装する
塗装します。見た目てきにも塗装したほうがかっこいいのですが、実は塗装しないで白いカバーのままだと、光がカバーを通り抜けてレンズに入ってしまうので写真が白っぽくなってしまいます。黒に塗装するか黒いフィラメントで3Dプリントした方がよいと思います。
塗装はどこまでかっこよく仕上げるかによってやり方が変わってきます。とりあえず色を付ければいいなら、そのままスプレーをかけてしまっていいと思います。
今回はできるだけ綺麗に塗装したいので表面を平らに仕上げてから色を付けていきます。手順としては「穴を埋める」→「紙やすりで削る」を繰り返していって、最後に色を付けるような感じになります。
3D印刷したてのパーツはいろいろとデコボコです。そこにパテを塗って紙やすりで削ることで表面を平らにしていきます。今回使う紙ヤスリの型番150, 400, 600になります。
まず150番のヤスリで余分なでっぱりを削っていきます。終わったらそこに400番をかけて触っても不快感がない感じまで仕上げます。
次にパテを塗ります。
タミヤのポリエステルパテを使います。このパテは1時間ほどで乾きすぐに加工ができるので便利です。乾かした後に600番の紙やすりで磨きます。白と黄色の縞々な感じになります。
タミヤ メイクアップ材 ポリエステルパテ (40g) 87097
次にサーフェイサー500番を表面に塗布します。これで大きなデコボコがある程度塞ぐことができます。そしてまた600番の紙やすりで磨きます。
GSIクレオス Mr.サーフェイサー 500 スプレー 100ml ホビー用仕上材 B506
灰色のサーフェイサーを吹くと光の反射で平ではない面がよく見えるようになります。大きなへこみがあればまたパテを塗ってもいいでしょうし、小さなへこみなら500番のサーフェイサーをもう一度吹いてもいいかもしれません。その後またヤスリで磨いて納得できる状態に仕上げましょう。
そして、仕上げの最後として1000番のサーフェイサーを吹きます。
GSIクレオス Mr.サーフェーサー 1000 徳用 スプレー 170ml ホビー用仕上材 B519
最後に黒のスプレーを塗って完成です。
タミヤ スプレー No.06 TS-6 マットブラック 85006
おわりに
最近3Dプリンターを買ったので、いろいろなものをプリントしたりモデリングしたりしていました。そして、昔一眼レフでマニュアル撮影を楽しんでいたのを思い出し、無性に再現したくなって思わず作りました。いやぁ、カメラってやっぱり面白いですね。
作っていて画質をどうやれば上げれるのか試行錯誤したのですが、どうもラズパイカメラのモジュールサイズではどうしようもないように思いました。画質を求めてカメラで遊ぶなら gPhoto といツールで市販されてるコンデジやら一眼レフのほとんどを制御できるようなので、中古の一眼レフなんかを安く買って遊ぶのがよいかもしれません。
gPhoto サポートされているカメラの一覧
さて。次はデジタル撮影できる顕微鏡でも作りたいと思います。ミジンコを撮影するぞー!