Raspberry Piで使うカメラのパン・チルト制御用マウントの組み立て
前回一応Raspberry Piで二つのサーボを動かせたので、それを発展させてパン-チルト対応のカメラを作ってみたいと思います。今回はそのためのマウントの作成です。
パン-チルトを可能にするマウントはこの2つを組み合わせるだけで出来上がりますが、その組み合わせるだけ、というのがなかなか厄介です。とりあえず、ニッパーと精密ドライバーは必須で、それ以外にあると良いものは以下です。
基本的にネジ穴が小さいし、また場合によっては新たにネジ穴を作ったりした方が楽なケースも多いので、1mm〜2mm程度の穴を開けられるドリルはあった方がよいです。
あと、こういうのもあるとなお良いです。
マウントについてくるネジは、安物なのかよくわかりませんが、とてもなめやすいです。穴を広げないまま無理やりネジを回すと、簡単にネジ山が潰れます。少し潰れたぐらいであればこれがあれば救済可能なので、一旦無理に回すのはやめて、ネジ穴を少し広げた方が安全です。
ではでは、作業に入ります。
サーボに付属しているホーンは、長い方をニッパーとかでカットする必要があります。
ホーンの各辺(?)にはそれぞれ2つずつ穴が開いている状態ですが、この状態でそれぞれ内側の穴に合わせて1mmドリルで下まで貫通する穴を開けておくと、
こんな感じで、マウントに付属の一番小さいネジで固定できるようになります。左側のネジだけは、事前に穴を開けずに作業をしたせいでネジが進まなくなり、ネジ山が潰れてしまいました。
続いて、サーボを挟む部品のネジ留めです。このまま力任せに締め込んでいくことも可能ですが、やはりネジ山が潰れる可能性が大なので、事前にちょっとだけ穴を広げておくのをオススメします。
カメラマウント側にもサーボを取り付けます。これまた、穴を2mmぐらいまで広げないと止められません。また、サーボとマントの間にナットを一つ挟む形になるので注意です。
それから、台の方にもサーボのホーンを短く切り落としたものをはめ込み、一番小さいネジでねじ止めします。はめ込むのにも結構力がいりました。
あとは、作ったプログラムでのサーボの初期位置を確認しながら、ホーンとモータを固定して、とりあえず完成です。
次はカメラの固定です。Raspberry Pi専用のカメラモジュールはラピロが使ってしまっているので、手持ちの別のWebカメラを使ってみます。
これのブラックバージョンです。
。。。ちょっとデカイですが、まあ頑張ってくっつけてみましょう。
最初は後ろ側から穴を開けてねじ止めしてみたのですが、微妙に歪んでしまったので、
改めて両サイドから穴を開けてネジ止めしました。エイヤでカメラ本体まで穴あけしてしまいましたが、後から中を開けてみると、この部分は予想どおり空洞だったので安心しました。
最後に、適当なケースに穴を開けて、本体を固定しました。ただ、このままだとカメラを動かしたときに土台が動いてしまうので、ケースの中に重石をいれるか、ケースをしっかり固定するかしないといけません。
この状態で、前回作成したプログラムでWebIOPi経由で動かしてみたところ、最初に作ったコードだと右と左、上と下が見事に逆に動いてしまったので、Pythonのコードを次のように修正しました。
import webiopi
GPIO = webiopi.GPIO
SERVO_PAN = 23
SERVO_TILT = 24
DEFAULT_PAN = 0
DEFAULT_TILT = 0
CURRENT_PAN = 0
CURRENT_TILT = 0
PAN_MAX = 90
PAN_MIN = -90
TILT_MAX = 90
TILT_MIN = -90
PAN_UNIT = 10
TILT_UNIT = 10
def setup():
GPIO.setFunction(SERVO_PAN, GPIO.PWM)
GPIO.setFunction(SERVO_TILT, GPIO.PWM)
GPIO.pulseAngle(SERVO_PAN, DEFAULT_PAN)
GPIO.pulseAngle(SERVO_TILT, DEFAULT_TILT)
webiopi.sleep(0.5)
GPIO.pulseRatio(SERVO_PAN, 0)
GPIO.pulseRatio(SERVO_TILT, 0)
def loop():
webiopi.sleep(0.5)
@webiopi.macro
def defaultPosition():
global CURRENT_PAN
global CURRENT_TILT
CURRENT_PAN = DEFAULT_PAN
CURRENT_TILT = DEFAULT_TILT
GPIO.pulseRatio(SERVO_PAN, 0)
GPIO.pulseRatio(SERVO_TILT, 0)
GPIO.pulseAngle(SERVO_PAN, DEFAULT_PAN)
GPIO.pulseAngle(SERVO_TILT, DEFAULT_TILT)
webiopi.sleep(0.5)
GPIO.pulseRatio(SERVO_PAN, 0)
GPIO.pulseRatio(SERVO_TILT, 0)
@webiopi.macro
def right():
global CURRENT_PAN
if CURRENT_PAN > PAN_MIN:
CURRENT_PAN = CURRENT_PAN - PAN_UNIT
GPIO.pulseRatio(SERVO_PAN, 1)
GPIO.pulseAngle(SERVO_PAN, CURRENT_PAN)
webiopi.sleep(0.5)
GPIO.pulseRatio(SERVO_PAN, 0)
@webiopi.macro
def left():
global CURRENT_PAN
if CURRENT_PAN < PAN_MAX:
GPIO.pulseRatio(SERVO_PAN, 1)
CURRENT_PAN = CURRENT_PAN + PAN_UNIT
GPIO.pulseAngle(SERVO_PAN, CURRENT_PAN)
webiopi.sleep(0.5)
GPIO.pulseRatio(SERVO_PAN, 0)
@webiopi.macro
def up():
global CURRENT_TILT
if CURRENT_TILT > TILT_MIN:
GPIO.pulseRatio(SERVO_TILT, 1)
CURRENT_TILT = CURRENT_TILT - TILT_UNIT
GPIO.pulseAngle(SERVO_TILT, CURRENT_TILT)
webiopi.sleep(0.5)
GPIO.pulseRatio(SERVO_TILT, 0)
@webiopi.macro
def down():
global CURRENT_TILT
if CURRENT_TILT < TILT_MAX:
GPIO.pulseRatio(SERVO_TILT, 1)
CURRENT_TILT = CURRENT_TILT + TILT_UNIT
GPIO.pulseAngle(SERVO_TILT, CURRENT_TILT)
webiopi.sleep(0.5)
GPIO.pulseRatio(SERVO_TILT, 0)
def destroy():
GPIO.setup(SERVO_PAN, GPIO.IN)
GPIO.setup(SERVO_TILT, GPIO.IN)
この状態でブラウザから操作してみると、図体はデカイですがパン-チルトは一応機能します。カメラ部分は図体はデカイですが、空洞が多くて軽いのです。
ただ、今の所、動かすたびにサーボがガタガタ震えてしまい、とても落ち着きのない子になってしまっています。このままでは使いものにならないので、次回はもっとキビキビとサーボが動くように、プログラムを修正します。










ディスカッション
ピンバック & トラックバック一覧
[…] 前回、前々回と、Raspberry Piでブラウザ上からカメラのパン・チルト制御する準備をしてきたのですが、肝心の制御プログラムが今の所とてもイマイチで、サーボを操作するたびにサーボ […]