Jump tp・・・ Streaming and Servo ON/OFF/ 監視カメラ/ Streaming/ ライブカメラ/ 気温湿度気圧/ 監視・メール通知/ ドッグ・ヒーター/
レーザーストリングス/

Streaming & Servo ON/OFF

 ①ブラウザからストリーミングカメラをON/OFF
 ②そしてカメラ台のサーボモーターを制御する。

mjpg-streamer_open.c ストリーミングを開始する。
#include
int main(void){
setuid(0);
system("LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i\"/opt/mjpg-streamer/input_uvc.so -y -r 640x480 -f 15 -d /dev/video0 -y\" -o\"/opt/mjpg-streamer/output_http.so -p 8492 -w www \" -b");
return 0;
}
mjpg-streamer_close.c ストリーミングを終了する。
#include
int main(void){
setuid(0);
system("kill -9 `pidof mjpg_streamer`");
return 0;
}
servo3.py サーボのスイングを開始する。
GPIO18...サーボを左右にスイング
GPIO8....一時停止の割り込み
GPIO7....サーボ終了の割り込み
#!/usr/bin/env python
# coding: utf-8
import pigpio
import time
import sys

PIN0 = 18 # Holizontal swing
# Pin 8 pause Pin 7 stop

pi = pigpio.pi() # default frequency = 50 Hz
pi.set_mode(8, pigpio.INPUT) # button(pin8) input
pi.set_pull_up_down(8, pigpio.PUD_DOWN)
pi.set_mode(7, pigpio.INPUT)
pi.set_pull_up_down(7, pigpio.PUD_DOWN)
pi.set_mode(PIN0, pigpio.OUTPUT)
cnt = 1

def swing_pause(gpio, level, tick):
global cnt
cnt *= -1
time.sleep(0.2)

def swing_stop(gpio, level, tick):
pi.set_mode(PIN0, pigpio.INPUT)
pi.set_mode(8, pigpio.INPUT)
pi.set_mode(7, pigpio.INPUT)
pi.stop()

cb = pi.callback(8, pigpio.RISING_EDGE, swing_pause)
cb = pi.callback(7, pigpio.RISING_EDGE, swing_stop)

try:
d = 1490 # -90deg(560uS) 0deg(1490uS) +90deg(2450uS)
r = 2
while True:
if cnt <= 0:
time.sleep(0.5)
else:
pi.set_servo_pulsewidth(PIN0, d)
time.sleep(0.1)
d += r
if d >= 2405 or d <= 560:
r *= -1

except KeyboardInterrupt:
pass

pi.set_mode(PIN0, pigpio.INPUT)
pi.stop()


pause.py サーボのスイングを一時停止する。GPIO8にパルス出力する。
1回目でスイング一時停止、2回目で再開。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pigpio
from time import sleep

pi = pigpio.pi()
pi.set_mode(8, pigpio.OUTPUT)

pi.write(8, 1)
sleep(0.2)
pi.write(8, 0)


stop.py サーボのスイングを終了する。GPIO7に1回パルスを出力する。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pigpio
from time import sleep
pi = pigpio.pi()
pi.set_mode(7, pigpio.OUTPUT)
pi.write(7, 1)
sleep(0.2)
pi.write(7, 0)
stream5.php ブラウザにコマンドボタンと画像を表示する。
http://192.168.0.10:8080/stream5.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head>
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Streaming and Still image</title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<link rel="stylesheet" href="stream5.css" type="text/css" media="screen" />
</head>
<body>
<table border="1" width="95%" cellspacing="0" cellpadding="5" bordercolor="#fff8dc">
<tr>
<th><form method="POST" action=""> <input id="submit_button" type="submit" value="ON" name="open" onmouseover="this.style.background='#00ffff'" onmouseout="this.style.background='#000066'"> </form></th>
<th><form method="POST" action=""> <input id="submit_button" type="submit" value="OFF" name="close" onmouseover="this.style.background='#00ffff'" onmouseout="this.style.background='#000066'"> </form></th>
<th><form method="POST" action=""> <input id="submit_button" type="submit" value="start" name="start" onmouseover="this.style.background='#00ffff'" onmouseout="this.style.background='#000066'"> </form></th>
<th><form method="POST" action=""> <input id="submit_button" type="submit" value="pause" name="pause" onmouseover="this.style.background='#00ffff'" onmouseout="this.style.background='#000066'"> </form></th>
<th><form method="POST" action=""> <input id="submit_button" type="submit" value="stop" name="stop" onmouseover="this.style.background='#00ffff'" onmouseout="this.style.background='#000066'"> </form></th>
</tr>
</table>
<?php
if($_POST['open']){
echo 'Start streaming... '.'<br />';
$cmd = './mjpg-streamer_open';
exec($cmd);
}
if($_POST['close']){
echo 'stop streaming... '.'<br />';
$cmd = './mjpg-streamer_close';
exec($cmd);
echo '<img src="./img/course.jpg" width="960" height="700" />';
}
if($_POST['start']){
echo 'Start swing... '.'<br />';
$cmd = 'python servo3.py';
exec($cmd);
}
if($_POST['pause']){
echo 'Pause swing... '.'<br />';
$cmd = 'python pause.py';
exec($cmd);
}
if($_POST['stop']){
echo 'Stop swing... '.'<br />';
$cmd = 'python stop.py';
exec($cmd);
}
?>
<img src="http://192.168.0.10:8492/?action=stream">
</body>
</html>

stream5.css ブラウザの設定。
@charset "shift_jis";

/* 一括で全ての要素の余白をゼロに指定 */
* {
margin: 0;
padding: 0;
}

/*-- ヘッダー部分 --*/
#header {
width: 70%;
height: auto;
margin-bottom: 2px;
position: relative;
background: url(./img/camdata8.jpg) no-repeat 50% 0;
}


h2
{
font-size: 160%;
font-weight: normal;
height: 50px;
padding: 0 0 0 0px;
background: #fff url(img/mark.gif) no-repeat 0 0;
color: #0066ff
}

table.sample1{
border-collapse:collapse;
width:80%;
margin:10px auto;
}

table.sample1 td{
padding:2px;
border:1px solid #ffffff;
}

table.sample1 td{
border-left:#515353 2px ;
border-right:#515353 2px ;
}

.relative {
position: relative;
width: 800px;
}
.absolute {
position: absolute;
right: 30px;
top: 30px;
}

input#submit_button{
width: 150px;
height: 50px;
padding: 2px 5px;
border-radius: 5px;
font-size: 20px;
line-height: 1em;
text-align: center;
color: #ffffff;
background-color: #000066;
transition: .3s;
box-shadow: 6px 6px 3px #666666;
border: 2px solid #000066;
}

監視カメラEye4-monitoring camera

監視カメラEye4を出先からコントロール anntenaケイアン C7823WIP
パン・チルト(首振り)機能
遠隔操作で撮影方向を調整可。
水平方向最大270°、垂直方向70°まで稼働可。
※ズーム機能はない

暗視モード
カメラの周囲に赤外線LEDを搭載し、暗くなると暗視モードに切り替わる。 夜間や暗い屋内などでも視聴・撮影が可能。
動体検知、通知機能はない


Eye4は単体で、出先からスマホでコントロールできる。カメラを操作し、モニタリング、動画静止画をスマホに記録、マイク、スピーカ機能がある。
しかし消費電力が約10wと多い。常時ONでは電力の無駄。そこで必要な時だけスマホを使ってRaspberry Pi経由でSSR(電源スイッチ)をON/OFFし、監視カメラを操作できるようにした。

raspberri PiにWebサーバーを構築する。
①Apacheのインストール sudo apt-get install apache2
インストールが完了したら、ブラウザに"http://raspiのIPアドレス" を入力。It works!と表示されればOK。
②PHPのインストール sudo apt-get install php7.0
動作確認。/var/www/htmlに簡単なphpファイルを作成する。
例 sudo vi /var/www/html/test.php
---- test.php ----
<?php
phpinfo();
?>
webブラウザで"http://raspiのIPアドレス/test.php"と入力。PHPの情報一覧が表示されればOK。
ApacheではPHPファイルは /var/www/html/ に配置する。
③ssr_control.php SolidStateRelay制御用
***ローカルエリアでは http://raspi IP address/ssr_control.php
***Internetでは http://jk3tjn.mydns.jp:8080/ssr_control.phpでアクセスする

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LED test</title>
</head>
<body>
<font size="7">
<?php
if(isset($_POST["start"])){
echo "**** gpio18__ ON";
$path = 'python ./ledstart.py';
exec($path);
}
else if(isset($_POST["stop"])){
echo "**** gpio18__ OFF";
$path = 'python ./ledstop.py';
exec($path);
}
?>
</font>
<form method="POST" action="">
<input type="submit" value="SSR ON" name="start" style="font-size:45pt;background-color:#ffff99;height:100;width:300" onmouseover="this.style.background='#ff3300'" onmouseout="this.style.background='#ffff99'">
<input type="submit" value="SSR OFF" name="stop" style="font-size:45pt;height:100;width:300">
</form>
</body>
</html>


Streaming

RasberryPi cameraでstreamingするしくみ。
①streamingソフト mjpg-streamerのインストール
ルートページは/opt/mjpg-streamer/www/になる。
②mjpg-streamer起動用shell stream3.sh
#!/bin/sh
export LD_LIBRARY_PATH=/opt/mjpg-streamer
/opt/mjpg-streamer/mjpg_streamer \
-i "input_raspicam.so --width 1920 --height 1080 --co 40 --fps 25" \
-o "output_http.so -p 9000 -w /opt/mjpg-streamer/www"
③動画表示用raspicam.htmlを上記ルートページに配置する
ブラウザではhttp://raspi IP address:9000/raspicam.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="ここにサイト説明を入れます">
<meta name="keywords" content="キーワード1,キーワード2,キーワード3">
<link rel="stylesheet" href="template_style.css">
<script type="text/javascript" src="js/openclose.js"></script>
</head>

<body id="top">
<div id="container">
<header>
<p><img src="./?action=stream" alt="" id="mainimg"></p>
</header>

</div>
<!--/container-->

</body>
</html>



ライブ動画・静止画


気温、湿度、気圧

センサー基板BME280で気温、湿度、気圧を測定し、メールで定時にスマホに送信するしくみ。

①センサーモジュールBME280から、気温、湿度、気圧を取得する。
ファイル名 Adafruit_BME280.py

②データーを1行のデーターに変換し、テキストファイルに書き出す。
ファイル名 i2c_bme280_3.py

#!/usr/bin/env python
# coding: utf-8
# ==== 温湿度気圧センサモジュール BME280 から測定値を取得する ====
import sys
sys.path.append('/home/pi/')
import Adafruit_BME280 as BME280

## 設定値
I2C_ADDR = 0x76 # デバイスアドレス
## 測定
sensor = BME280.BME280(address=I2C_ADDR, t_mode=BME280.BME280_OSAMPLE_8)
## テータの取得
data_t = sensor.read_temperature()
data_p = sensor.read_pressure() / 100
data_h = sensor.read_humidity()
## 結果表示
print 'Temp = %.2f deg C' % data_t
print 'Humidity = %.2f %%' % data_h
print 'Pressure = %.2f hPa' % data_p
print ""
## ファイルに書き出し
msg = "Temp = %.2f C/" % data_t + " Humid = %.2f %%/" % data_h + " Press = %.2f hPa" % data_p
f = open('Weather_data.txt', 'w')
f.write(str(msg))
f.close()

③メールを作成
ファイル名 sendMail.sh

#!/bin/bash
## str1="Shell script" # no space between 'str1' and '='
## str2=" is intersting!"
## str=$str1$str2
## echo $str

## i2c_bme280_3 # write temp,pressure,humid into file

message=$( echo $message
sub1="Weather"
sub2=`date +"%Y%m%d-%H%M"`
subject=$sub1$sub2
echo $message | /usr/bin/mail -s "$subject" jk3tjn@gmail.com

④定時に送信する
ファイル名 crontab

00 6,8 * * * /home/pi/i2c_bme280_3.py
01 6,8 * * * /home/pi/sendMail.sh
#mydns update
0 * * * * /home/pi/mydns_update.sh >/dev/null 2>&1

動物の動きを感知すると、スマホに通知メールを送る

人感センサーで動物の動きを感知し、撮影した画像を添付して通知メールを送る。カメラ方向にセンサーを向け、動物の侵入など動きがあると、静止画を撮影する。
人感センサーは赤外線量の変化で信号がONになる。この変化をラズパイに送り、静止画を撮影。この画像を添付メールとしてgmailで送信する。
sensor
人感センサー。最大検知距離7m、検知角度120度。
sensor


メインファイルbouhann2.sh

#!/bin/sh
## 動きを検知すると、ブザーを鳴らし、通知メールを送る
PORT=11 # 人感センサーのGPIOポート番号
SAVEDIR="/home/pi/Pictures" # 画像ファイルの保存先
mkdir -p $SAVEDIR
# LED=24 #LED PORT configured in 'bouhan-led'

## GPIOポートの設定
gpio -g mode $PORT in
gpio -g mode $LED out

## メインループ
mkdir -p $SAVEDIR
bouhan-led
buzzer beep2
echo "監視を始めます"
while true ; do

## センサーが反応するのを待つ
if [ `gpio -g read $PORT` -eq 1 ] ; then
echo "*** ALERT *** 侵入異常発生"

## 撮影する
filename= camdata.jpg
fswebcam -d /dev/video0 --no-banner -S 6 -F 1 -r 640x480 --save $SAVEDIR/camdata.jpg
echo "画像を保存しました"

## 通知メールを送る
sub1="**Alert**"
sub2=`date +"%Y%m%d-%H%M"`
subject=$sub1$sub2
mutt -n -F settings.txt -s "$subject" jk3tjn@gmail.com -a /home/pi/Pictures/camdata.jpg < body.txt

## 警報音を鳴らして泥棒を驚かす
buzzer alert

## LED 5秒点滅
bouhan-led
echo "10秒後、監視を再開します。"
## 警報発生後は10秒間待機する
sleep 10
buzzer beep1
echo "監視を再開します"
fi

## 0.5秒待機して繰り返す
sleep 0.5

done


LED点滅bouhan-led.py

#!/usr/bin/env python
# coding: utf-8
# ======== GPIOポートに接続したLEDを点滅する ========
import RPi.GPIO as GPIO
import time

## 設定値
LED1 = 24

## 初期化 OUTモードに設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED1, GPIO.OUT, initial=GPIO.LOW)

## 5回繰り返す
for i in range(5):
GPIO.output(LED1, 1)
time.sleep(0.5)
GPIO.output(LED1, 0)
time.sleep(0.5)

## 終了
GPIO.cleanup()

ブザーbouhan-buzzer.py

#!/usr/bin/env python
# coding: utf-8
# ======== GPIOポートに接続したスピーカーを鳴らす ========
import RPi.GPIO as GPIO
import time
import sys
import os.path

## 設定値
BUZZER = 12

## 初期化 OUTモードに設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUZZER, GPIO.OUT, initial=GPIO.LOW)

## 与えた引数によって鳴らす音を変える
if len(sys.argv) > 1:
p = GPIO.PWM(BUZZER, 1) ## 1Hz(仮)でPWMを設定

if sys.argv[1] == "alert": # 警報モード
p.start(50)
for i in range(10):
for freq in range(1000,99,-100):
p.ChangeFrequency(freq)
time.sleep(0.03)
p.stop()
elif sys.argv[1] == "beep1": # 短いビープ音
p.start(50)
p.ChangeFrequency(1000)
time.sleep(0.05)
p.stop()
elif sys.argv[1] == "beep2": # 長いビープ音
p.start(50)
p.ChangeFrequency(1000)
time.sleep(0.5)
p.stop()

## 引数が与えられなかった場合は使用方法を出力
else:
myname = os.path.basename(sys.argv[0])
print "Usage: "+ myname +" [alert|beep1|beep2]"

## 終了
GPIO.cleanup()

bouhan-buzzer.pyをコマンドとしてshell内で使えるようにする処理
chmod 755 bouhan-buzzer.py
sudo cp bouhan-buzzer.py /usr/local/bin/buzz

bouhan-led.pyも同様に


撮影用fswebcam
sudo apt-get install -y fswebcam


メール送信mutt
sudo apt-get install -y mutt


設定ファイルsettings.txt
set charset="utf-8"
set send_charset="us-ascii:iso-2022-jp"
set from=jk3tjn@gmail.com
set realname=yukio


メール本文body.txt
***Alert*** Intrusion detected

犬用ヒーター

電熱線が入ったマット。その下に圧力センサーを付けた板。
犬がマットの上に乗れば、ヒーターに通電開始。マットから降りれば自動で通電を停止する。
最も試行錯誤を繰り返したのは、圧力センサー部分。市販のセンサーはそれを真上から押せば反応するが、荷重部分がずれると反応が鈍い。
探し当てたのがひずみゲージ。これは郵便用のはかりにも使われていた。
マット sensor

ブロック図
犬がマットに乗ったかを圧力センサーで検出。乗ればリレーをONにしてヒーターに通電する。
安全装置として、電線を嚙み切ったりした時の短絡検出、断線検出センサーを工夫した
block circuit
回路 左リレーとヒーター出力   中nanoとひずみ増幅   右LEDと短絡検出回路

ひずみゲージ、電圧変化検出回路
ひずみゲージは荷重のかかる板の表裏に4枚使い、ホイートストンブリッジで電圧変化を検出する。
strain amplifier

レーザーストリングス