IoTスイッチの「Raspberry Piで監視カメラ。」にサーボモータをつけた件


今回は、IoTスイッチの「Raspberry Piで監視カメラ。取った写真をタイムラインにツイート」キットを試しに改良してみたので、その内容をご紹介します。

改良の元となるDIY工作キットは「Raspberry Piで監視カメラ。」をご覧ください。

また、下記で説明する内容は、既に「Raspberry Piで監視カメラ」キットの設定(ツイッター連携など)が終わっている事が前提となります。

遠隔地からカメラの角度を変える

弊社が取り扱っている、「Raspberry Piで監視カメラ」キットは、遠隔地からでも、ツイッターと連携して、写真を取る事が出来ます。ただ、カメラの向きが固定されている為、対象物が動く場合、カメラに映らないことが多々あります。

その不便さを解消する為に、「サーボモータ」と連動して、遠隔地からカメラを任意の角度に変えられるように、改良したいと思います。

「Raspberry Piで監視カメラ」キット以外に用意するもの

・サーボモータ×1(写真は5個セットですが、1個でも買えます)

・ジャンパーワイヤー(オス×メス)×3

たった上記のアイテムを用意するだけで、遠隔地で角度を変えることが出来ます。

「Raspberry Piで監視カメラ」キットとサーボモータを接続する

下記の配線図の様に、サーボモータをRaspberry Piを繋ぎます。(※今回は手間を省く為、raspberry Piの電源をサーボモータに直接使うっておりますが、理想はサーボモータ用の電源を別で確保する方が良いと思います。)

servo-camaera

サーボモータの上にWebカメラをテープで付ける

かなり手作り感満載ですが、サーボモータの先に「プロペラの様」な部品を取り付けて、Webカメラとテープで止めます。

dsc01422

出来上がりの状態

dsc01425

サーボモータ制御のプログラムを書く

「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で作成

次に、ラズベリーパイからサーボモータを制御するプログラムを作成します。

サーボモータを制御する場合、PWMPulse 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度の所に移動して、数秒後、ツイッターのタイムラインに、その方角の写真が投稿されれば成功となります。

上手くいったときの動画がこちら

カメラの角度を変えながら対象物を撮影して、ツイッターのタイムラインにアップされる様子です。

是非みなさんも、いろいろ遊んでみてください。