カメラキットのソースコード


カメラキットをブラウザから制御するアプリケーションのソースコードを少し整理したので公開します。
動作させたときの記事はこちらをご覧ください。

このアプリケーションを動作させるためには、事前にWebObとOpenElectrons製のPi-Pan Kitのハードウェア及びサーボコントローラのライブラリがセットアップされている必要があります。
IMG_20141216_205044

以下、Pythonのソースコードです。

#!usr/bin/python3
#Web Appli(Camera+Servo)

import os, sys
import pipan
import picamera
import time
from webob import Request, Response

pos_x = 150
pos_y = 150
target_pos_x = 150

#Pi pan tilt
p_servo = pipan.PiPan()
p_servo.neutral_pan()

html = """
<img src="image.jpg">
<form method="post"> degree(-90 ~ +90):
<input type="text" name="degree" value="%s">
<input type="submit" name="button" value="Move">
<input type="submit" name="button" value="Init">
</from>
"""

class WebApp(object):
	def set_servo(self, angle):
		print("angle = %d" % angle)
		global pos_x, target_pos_x
		if -90 > angle : angle = -90
		if 90 <angle : angle = 90
		
		target_pos_x = angle + pos_x;
		
		if target_pos_x < 60 :
			target_pos_x = 60
		if target_pos_x > 240 :
			target_pos_x = 240
		if target_pos_x > pos_x :
			print("turn right")
			while pos_x < target_pos_x :
				p_servo.do_pan(int(pos_x))
				time.sleep(0.005)
				pos_x += 1
		else :
			print("trun left")
			while pos_x > target_pos_x :
				p_servo.do_pan(int(pos_x))
				time.sleep(0.005)
				pos_x -= 1
		
	def init_servo(self):
		global p_servo, pos_x, pos_y
		p_servo.neutral_pan()
		pos_x = 150
		pos_y = 150
		
	def save_picture(self, filename):
		with picamera.PiCamera() as camera:
			camera.resolution = (640, 480)
			camera.start_preview()
			time.sleep(2)					#camera warm-up time
			camera.capture(filename)			#save jpeg file
	
	def __call__(self, environ, start_response):
		global html
		
		req = Request(environ)
		print("req = %s" % req.path)
		if req.path=='/image.jpg':
			self.save_picture('image.jpg')
			bin_data = open('image.jpg', 'rb').read()
			resp = Response(bin_data, content_type='image/jpeg')
		elif req.path=='/':
			degree = req.params.get('degree', '0')
			button = req.params.get('button', '')
			print("degre = %s" % degree)
			print("button = %s" % button)
			resp = Response(html % degree)
			if button=='Init':self.init_servo()
			if button=='Move':self.set_servo(int(degree))
		else:
			resp = Response() 
		
		return resp(environ, start_response)
		
application = WebApp()

if __name__ == '__main__':
	from wsgiref.simple_server import make_server
	port = 8080
	httpd = make_server('', port, application)
	print('Serving HTTP on port %s...' % port)
	try:
		httpd.serve_forever()
	except KeyboardInterrupt:
		print('server error')

ソースコードの中に日本語のコメントが書けないのでまとめて説明を書きます。

18行目:ブラウザに表示されるUIのHTMLのソースコード。
28行目:サーボ制御 入力された角度をもとにサーボモータを制御します。
56行目:サーボ位置初期化。
62行目:カメラモジュールから静止画取り込み。
69行目:ブラウザからのリクエストにより各関数をコール。

今後色々と機能を追加してバージョンアップしたものを公開していく予定です。
(GitHubに登録しようと思います)

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です