今回は、IoTスイッチの「Raspberry Piで監視カメラ。取った写真をタイムラインにツイート」キットを試しに改良してみたので、その内容をご紹介します。
改良の元となるDIY工作キットは「Raspberry Piで監視カメラ。」をご覧ください。
また、下記で説明する内容は、既に「Raspberry Piで監視カメラ」キットの設定(ツイッター連携など)が終わっている事が前提となります。
遠隔地からカメラの角度を変える
弊社が取り扱っている、「Raspberry Piで監視カメラ」キットは、遠隔地からでも、ツイッターと連携して、写真を取る事が出来ます。ただ、カメラの向きが固定されている為、対象物が動く場合、カメラに映らないことが多々あります。
その不便さを解消する為に、「サーボモータ」と連動して、遠隔地からカメラを任意の角度に変えられるように、改良したいと思います。
「Raspberry Piで監視カメラ」キット以外に用意するもの
・サーボモータ×1(写真は5個セットですが、1個でも買えます)
・ジャンパーワイヤー(オス×メス)×3
たった上記のアイテムを用意するだけで、遠隔地で角度を変えることが出来ます。
「Raspberry Piで監視カメラ」キットとサーボモータを接続する
下記の配線図の様に、サーボモータをRaspberry Piを繋ぎます。(※今回は手間を省く為、raspberry Piの電源をサーボモータに直接使うっておりますが、理想はサーボモータ用の電源を別で確保する方が良いと思います。)
サーボモータの上にWebカメラをテープで付ける
かなり手作り感満載ですが、サーボモータの先に「プロペラの様」な部品を取り付けて、Webカメラとテープで止めます。
出来上がりの状態
サーボモータ制御のプログラムを書く
「Raspberry Piで監視カメラ」の制御プログラムを改変
「Raspberry Piで監視カメラ」のラズベリーパイの中をFTPソフトなどを使ってのぞくと、下記のディレクトリに対象のファイルがあります。
「/var/www/html/iotswitch/control_component.php」
「control_component.php」を下記の様に変更します。
control_component.phpの中身
$text = urldecode($obj['text']);
if($GLOBALS['oc_reserve8']){
if(strstr($text,$GLOBALS['oc_reserve8'])){
//角度を取得してサーボを制御する処理(追加分開始)-------------------------//
$angle = "";
$angle = preg_replace('/[^0-9]/', '', $text);//角度を取得
if(is_numeric($angle) && 0 <= $angle && $angle <= 180){//指定の範囲の場合
//duty比25~130の間 25が0度 130が180度
$angle = floor($angle * 0.58) + 25;
//タイムラインの値を取得して、サーボを制御するプログラムを呼び出し
$data_array = "";
exec ( "sudo python /var/www/html/iotswitch/servocontrol.py " . $angle, $data_array, $ret );
sleep(2);//2秒待つ
}
//角度を取得してサーボを制御する処理(追加分終了)-------------------------//
//カメラを起動して、ツイートするプログラムを呼び出し
$data_array = "";
exec ( "sudo php /var/www/html/iotswitch/tweet.php", $data_array, $ret );
}
}
「サーボモータ制御」プログラムをpythonで作成
次に、ラズベリーパイからサーボモータを制御するプログラムを作成します。
サーボモータを制御する場合、PWM(Pulse Width Modulation:パルス幅変調)方式を使用する為、PHPでは最適なライブラリがあまりありません。
その為、この制御を得意とするライブラリが沢山あるpythonで作成します。
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
import sys
import wiringpi2 as wiringpi
param = sys.argv # パラメータの値を取得する
wiringpi.wiringPiSetupGpio() # GPIO名で番号を指定する
wiringpi.pinMode(18, wiringpi.GPIO.PWM_OUTPUT) # PWM出力を指定
wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS) # 周波数を固定するための設定
wiringpi.pwmSetClock(375) # 50 Hz。ここには 18750/(周波数) の計算値に近い整数を入れる
# PWMのピン番号18とデフォルトのパルス幅をデューティ100%を1024として指定。
duty = int(param[1]) # パラメータの値をintタイプで代入
wiringpi.pwmWrite(18, duty)
GPIO.cleanup()
上記pythonプログラムを「servocontrol.py」と言うファイル名で保存します。
改変、作成したプログラムをFTPソフトでRaspberry Piにアップロード
SSHやリモートデスクトップ接続で、直接ファイルを操作している場合は、この操作は必要ありませんが、ローカルでプログラムファイルを作成した場合、FTPソフトで、「/var/www/html/iotswitch/」のディレクトリにアップロードします。
実際に動作確認して、予定通り動いたら完成
後は、実際に動かしてみて、想定の挙動になれば問題です。
例えば、「150get」(※getは、任意で指定したキーワード)とツイッターのタイムラインに投稿した時、サーボモータ付きカメラが、150度の所に移動して、数秒後、ツイッターのタイムラインに、その方角の写真が投稿されれば成功となります。
上手くいったときの動画がこちら
カメラの角度を変えながら対象物を撮影して、ツイッターのタイムラインにアップされる様子です。
是非みなさんも、いろいろ遊んでみてください。