~Time of your life~

作ったものをコッソリ載せる場所


久しぶりのゲーム更新。
前回の更新がまさかの2年前だと・・・時が経つのは早いもんだ。
ブログに載せずに更新してた部分もあるんだけどね。それでも低頻度だが。

前に動かせるブロックを作ってみたもののあまり使い道がないことに気づいた。
押してどかすだけでは面白味に欠けるので目的の場所に運ぶようにしたいと思って
作ったのが上の画像である。

まぁ・・・いわゆる"倉庫番"なんだよな。

所定の位置に箱を置くと錠が開いて通れるってわけだ。
錠じゃなくて扉でも岩でもいいんだけどさ。

二人同時操作となると意外と難しいかもしれない。
バイナリィランドとパズルボーイと倉庫番が混ざった感じ。

嗚呼、ドットが打ちたい。


いろいろあって完成しました。
エンジンかけるとラズパイ起動→自動で録画開始。
エンジン停止でラズパイシャットダウン→1分後にラズパイの電源OFF。
録画データはUSBメモリに保存。

手動でもできるように黒ボタンで録画停止。赤ボタンで録画開始。
停車時間が長くなる時は容量節約の為に停止ボタンを付けた。
黄ボタンは長押し(5秒)で録画データ全消去。
滅多に事故やトラブルもないので無駄なデータのほうが多くなる為手動で削除できるようにした。
わざわざPCやモニタを繋いで消去するのも手間なので。
青ボタンは予備。機能考え中。

トグルスイッチはシステムボイスチェンジ。
真面目な女性ボイスと元気な少女ボイスの2種用意。
前回は初音ミクだったけど今回はネットで依頼した。
ネットで手に入るから便利な世の中だね。もっとセリフのバリエーション増やしたいかも。


保存も確認。1ファイルあたり最大10分。


前回の反省点は全て改善できた様に思う。
 ・時刻の保持→電池駆動のモジュール使用。
 ・エンジンを切る前に手動シャットダウン→オフディレータイマーで自動シャットダウン。
 ・保存容量不足の懸念とデータ取り出しの手間→外部USBメモリに保存。
 ・ファンの音→そもそもファン付けない。

今回の反省点:
 ・自作アンプのノイズが気になる。手作り感があると言えば悪くないが。
   回路にコンデンサや抵抗を加えて見直す必要がありそう。
 ・放熱どうすんの?
   夏ヤバいかなと思ったけど車内はエアコンつけるしそこまで心配ないかなと思ったり。
 ・起動までの時間
   エンジンかけてから録画開始まで20秒くらいかかる。
   ラズパイの起動時間だから仕方ないのかな。

それでもこれでドラレコとしての形を成したので満足。
次は何を作ろうかな。

これを書いている時点で完成しているので材料をまとめておく。

・アクリル板:
  取り付ける為のベースとなる部分。アクリル板じゃなくてもいいけど。
・ラズパイ本体:
  今回もraspberry pi B3+を使用。4は高いしそんなにスペックいらないかなと。
・USB電源コンバータ:
  車の12V電源をラズパイ用の5V電源に変換する用。
・Webカメラ
  前回も使ってたやつ。安いのでも大丈夫かと。
・ユニバーサル基盤:
  1枚。スイッチ類取り付け用。
・L字金具:
  アクリル板とユニバーサル基盤を固定する用。
  3個。ホームセンターで購入。1個80円くらい。
・ネジ類:
  M3の6mm数本。上記材料を留める用。
・ビニルコード:
  配線用。ホームセンターで購入。色分けできるとよい。
・タクトスイッチ:
  押し易い様にボタンが大きめのスイッチにした。
  秋月電子で購入。色分けできる10個入300円。
・トグルスイッチ:
  ボイスチェンジ用。
  秋月電子で購入。1個200円。
・タイムスイッチ用の材料:
  オフディレータイマー編を参照。
・スピーカー用の材料:
  自作アンプ編を参照。


・工具類:
  プラスドライバー
  ドリル(ピンバイス)
  半田付け器具一式
  ストリッパー
   圧着工具、圧着コネクタ(ギボシ端子とか)
  導通テスター



単純にドラレコが欲しいなら買った方がいいのは分かってるのよ・・・。
作って思い通りに動いたり動かなったりするのが楽しいんじゃあないか。

久しぶりにドラレコの記事を。
タイマー自体は去年の夏にはできていたんだけど忙しくて載せるのを忘れていた。
一応説明するとオフディレータイマーとは信号を受けてから一定時間経過後に出力をOFFするタイマーである。オフ(OFF)ディレー(遅らせる)タイマーである。
ここで言う信号とは車のACC電源であり、一定時間後にOFFしたい出力とは常用電源を指す。
エンジンが切れたら一定時間後に常用電源をOFFするわけだ。
ラズパイは所謂PCなのでシャットダウン処理せずに電源OFFは言わずもがな御法度である。
かと言って常用電源に繋ぎっぱなしだといずれバッテリーが上がってしまうのでオフディレータイマーでACC電源が切れたら常用電源が切れる前にシャットダウン処理を済ませればよい。

車用電装機器メーカー「エーモン」にもタイマーユニットなるものが発売されているみたいだけど何か不都合があって使えない(売ってない?)ので自作することにしました。

完成がコレ。
IMG_20220731_231305
最初グランド線を何故か二本にしてしまったので一本は未使用として箱の中へ収めた。
主な材料:
 MOSFET1個
 コンデンサ1個
 整流ダイオード2本
 ミニパワーリレー12V
 可変抵抗1個
 ユニバーサル基盤1/2
 ビニルコード5本
 手頃なケース1個

エンジン始動でコンデンサに電荷が溜まる。
エンジン停止でコンデンサから電荷が放電されている間MOSFETが導通となり常用電源をラズパイへ供給してくれる。完全放電後に常用電源が遮断されるというわけだ。
つまりコンデンサ容量が大きいほどタイマーが持続するということ。
シャットダウンする時間を稼げればいいので1分もあればいいかと。
今回使ったコンデンサの容量は忘れてしまったが3分くらいだったと思う。
可変抵抗を間に入れることである程度タイマー調節ができる。
この辺りはブレッドボードで組み合わせを試して作っていくのがいいだろう。
ちなみに回路図は無い。手書きで汚いメモしかないのでその内書き直す。

 始めに

ラズパイをWebサーバー化してPHPも使えるようにしたけど何も活用していなかった。
という訳で支出管理をする為のアプリを作ることにしました。
今まではPCからエクセルで記帳していたけどいかんせん育児に時間を取られて自分の時間が少ない為に自室で腰を据えてというわけにもいかないのが現状。
しかしこれならスマホからどこからでも記帳できるのだ。
財布にレシートが溜まることもないのだ。

 いきなり完成

payCtl

長々とありふれたコードを載せても需要はなさそうなので割愛。
書込ボタンを押すとテキストボックスに入力された値がcsvファイルに書き込まれる。
ファイルは月が替わるごとに新規作成。ファイル名にも年月を付ける(202203.csv等)
PHPは年月の取得とファイル操作のコードを書いているだけ。
後は標準的なHTMLフォームの記述ができれば作れてしまうのだ。
レイアウトにcssも使っているがさほど重要でもあるまい。
ちなみに「詳細」リンクはカテゴリの区分をメモしたhtmlに飛んでいるだけ。
どのカテゴリを選択すればいいのか忘れた時の所謂ヘルプ。

 おわりに

ラズパイサーバーにデータが溜まっていくのはいいが、そこからどうしたものか。
集計やグラフ表示はWindowsからC#あたりでフォームアプリでも作ることになるかな。
それはまたそのうち。

 理由

監視カメラとするにはやはりレスポンスは早くありたい。
空き巣が去った後に気づいても手遅れなのだ。

 手順

LINEの登録はしているのを前提としてPCからLINE Notifyのサイトへアクセス。
自身のLINE-IDでログイン。
アクセストークンを発行する。
コード:

import requests
#LINE-Notifyの設定
url = "https://notify-api.line.me/api/notify"
token = "ここに発行したトークンを書く"
headers = {"Authorization" : "Bearer "+ token}
message =  "動体検知しました。"
payload = {"message" :  message}


#LINEに画像を送信
	files = {"imageFile":open('capture.jpg','rb')}
	post = requests.post(url,headers = headers ,params = payload,files = files)

送信するファイル名は前記事の保存ファイル名と同じにしてある。
画像送信部分のプログラムを画像保存後に記述すればOK。

 結果

line

 終わりに

時間帯に寄っては通知が鳴り止まなかったり・・・(通勤・通学時間とか)
→対策としては時間帯によって閾値を変更させればある程度緩和できるかな。
暗視はできないので夜になると当然見づらい。そして車のライトで先に反応してしまう等の問題もある。
→暗視タイプを使う。暗い時間帯はタイマーを長く設定するとか。
玄関周辺だけ写せればいいんだけど電源の取り出しとか配置が難しかったり。
→これは頑張って電源引っ張ったり防水ケースで屋外に取り付けるしかないかも。
ともあれここまでできれば後はどうにでもできそうなのでこれにて了。

 やりたいこと

動体検知して自動撮影。
動画だと容量喰うし、周期撮影で監視すると無駄な撮影が多くなる為。

 方法

以前の記事でOpenCVは導入済みなのでOpenCVの便利な機能を利用する。
例によって同じことをやる人はたくさんいるので検索すればどうにかなる。

import cv2
import time

def main():
	#カメラのキャプチャを開始
	cap = cv2.VideoCapture(0)
	#フレームの初期化
	frame1 = frame2 = frame3 = get_img(cap)
	#閾値の設定
	th = 300
	timer = 0

	while True:
		#Enterキーが押されたら終了
		if cv2.waitKey(1) == 13: break

		#差分チェック
		diff = chk_img(frame1, frame2, frame3)
		cnt = cv2.countNonZero(diff)
		
		#差分がthの値以上なら動きがあったと判定
		if cnt > th:
			print(str(cnt)+":"+str(timer))
			timer += 1
			cnt = 0
			#閾値オーバーの状態が2秒くらい続いたら撮影
			if timer > 20:
				print("動体検知しました")
				#cv2.imshow('PUSH ENTER KEY', frame3)
				cv2.imwrite('capture.jpg', frame3)

				#フレームリセット
				frame1 = frame2 = frame3 = get_img(cap)
				timer = 0

				#連写防止の為10秒待機
				time.sleep(10)

			#フレーム更新
			frame1, frame2, frame3 = (frame2, frame3, get_img(cap))
		else:
			#cv2.imshow('PUSH ENTER KEY', diff)
			#フレーム更新
			frame1, frame2, frame3 = (frame2, frame3, get_img(cap))
			cnt = 0
			timer = 0
	#停止処理
	cap.release()
	cv2.destroyAllWindows()

# 画像に動きがあったか調べる関数
def chk_img(frame1, frame2, frame3):
	# グレースケール変換
	gray1 = cv2.cvtColor(frame1, cv2.COLOR_RGB2GRAY)
	gray2 = cv2.cvtColor(frame2, cv2.COLOR_RGB2GRAY)
	gray3 = cv2.cvtColor(frame3, cv2.COLOR_RGB2GRAY)

	# 絶対差分を調べる
	diff1 = cv2.absdiff(gray1, gray2)
	diff2 = cv2.absdiff(gray2, gray3)

	# 論理積を調べる
	diff_and = cv2.bitwise_and(diff1, diff2)

	# 白黒二値化
	_, diff_wb = cv2.threshold(diff_and, 30, 255, cv2.THRESH_BINARY)

	# ノイズの除去
	diff = cv2.medianBlur(diff_wb, 5)
	return diff

# カメラから画像を取得する関数
def get_img(cap):
	img = cap.read()[1]
	img = cv2.resize(img, (600, 400))
	return img
main()

 結果


検知直後に保存すると早すぎるのでタイマーで遅らせて撮影。
閾値を小さくすれば人や動物のような小さな動体も撮影できた。
あまり小さくすると降雪とかゴミが飛んできても検知してしまうかも。 上記のコードだとファイル名が固定なので撮影の度に上書きされる。 ファイル名に日付を付けてフォルダに分けて保存するのもいいかもしれない。

 やりたいこと:

定点で何かを観測・観察・監視するとか。

 理由:

ドラレコもそうだけどWebカメラを持て余していたから何かに使いたい。

 手順:

コードを書く。

import cv2
cap = cv2.VideoCapture(0)
ret,frame = cap.read()
cv2.imwrite('img.jpg',frame)
cap.release()
cv2.destroyAllWindows()

最低限の記述でこんな感じかな。
任意のファイル(capture.py)をディレクトリに置いてpython capture.pyと実行すれば同じフォルダにimp.jpgが保存されているはず。
あとはプログラミングの知識さえ詰め込めばいろいろ応用できると思う。

・ラズパイのGPIOを使ってシャッターボタンを付ける。
・時刻を読み込んで一定周期で撮影する。
・rc.localやcronを使えば起動時に自動実行もできる。
・ファイル名に日付や連番を付ける。
・無制限に保存されないように枚数制限や容量制限の条件を付ける。
・以前作成したWebサーバーを保存先にすれば外出先から監視できる。etc...

【追記】
わざわざWebサーバーに保存して見に行かなくても自身のLINEへ送れば良いという結論に至る。(方法は別記事)
保存先もLINEサーバー上(1GB)なのでこれも気にしなくてよい。スマホから削除できる。
OpenCVの機能で画像内に日付を入れればファイル名も気にしなくて良い。LINEの通知時間でも分かるし。
しかし折角Webサーバー立てたので別のことに役立てるつもり。いい勉強になった。

 終わりに:

上記の例を一通りやってみたけど中々楽しい。
動物や植物、空模様の観測なんかは一定周期でいいかな。
監視カメラは動体検知にしないと無駄に枚数が増える。
動体検知や文字認識はまだやったことがないのでやってみたい。

 やりたいこと:

OpenCVを導入して画像・映像処理をしたい。

 手順:

■スワップ領域の拡張(重要)
1.設定ファイルを開く

sudo nano /etc/dphys-swapfile
2.編集・保存
CONF_SWAPSIZE=1024(#を外して100→1024に変更)
3.反映
sudo /etc/init.d/dphys-swapfile restart
4.確認
swapon -s
スワップ領域を確保しておかないとメモリ不足で強制終了することがある。

■依存パッケージのインストール

sudo apt install -y build-essential cmake pkg-config
sudo apt install -y libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libxvidcore-dev libx264-dev
sudo apt install -y libgtk-3-dev
sudo apt install -y libatlas-base-dev gfortran
sudo apt install -y libgstreamer1.0-dev

参考サイトで見たlibqtgui4だとか libqt4-testはパッケージが見つからないので無視。
何か分からないけどなくても大丈夫だと思う。

■opencv-pythonとnumpyのインストール

sudo pip3 install numpy opencv-python

■放置して待つ
筆者の場合は約2時間半くらい。
Successfully installed opencv-python~・・・的なメッセージが出ればOK。
途中で真っ赤なエラー文字が流れたりしたら何かパッケージが足りないのかも。

 おわりに:

OpenCVのインストールはラズパイユーザー最初の難関ではなかろうか。
数時間かかる上にエラーが出てやり直しする羽目になったり。
とりあえず上記の方法で上手くいったのでココに残しておく。
検索するとソースからビルドするほうがデバッグしやすいだとか最新の状態を導入できるだとかあるみたいだけど手初めにはこれでいいかなと。

折角Webサーバーを立ち上げたのでドメインも欲しい。
個人使用とは言え、グローバルIPが変わる度にブックマークやファイル転送ソフトの
ホスト名を変更しなければならないのは頻度が少ないもののやはり手間である。

 無料のDDNSサービスに登録:

 1.mydns.jp へアクセス。
 2.ユーザー登録をするとメールでIDとパスを貰える。
 3.ログインして希望するドメインを入力→登録。

これだけでOK。
登録したアドレスにアクセスしてみると無事表示された。

さて、アドレスはドメインのおかげで不変だけど不定期にIPが変わるのは避けられない。
(自宅のは調べてないけどプロバイダによっては固定IPだったりもする)
そこでIPが変わったら先程のDDNSサービスにIPの変更を通知しなくてはならない。
「結局手間かかるやん」となるがそこで自動更新の方法を以下に記す。
(偉そうに書いているが全てググって得た情報である。)

 cronを用いたIPアドレスの自動通知:

cronとは指定した時間に指定のプログラムを実行してくれる常駐プログラムのこと。
Windowsで言うところのタスクスケジューラーかな。
1.スクリプトの作成
     sudo nano /home/pi/myDNS.sh
    作成場所もファイル名も任意。とりあえず作る。
    ファイル内に以下を記述。青文字はmyDNS.jpのログインIDとパス。
  wget -O - --http-user=username --http-password=pass http://ipv4.mydns.jp/login.html

2.作成したファイルに実行権限を与える。
sudo chmod 755 myDNS.sh

3.crontabを実行してcronの設定をする。
sudo crontab -e
cron設定ファイルの下部に以下を記述。
0 * * * * /home/pi/myDNS.sh
青文字部分が定期実行する為の時間設定となる。
上記の場合は毎時0分に実行される。
順に[分 時 日 月 曜]を示す。
毎日1時0分に実行したいなら 0 1 * * * と書く。("*"は毎の意)
* 1 * * * と書くと1時台の毎分となる。
間違えると頻繁に実行されてmyDNS.jpに負荷がかかるので気をつけましょう。

4.動作確認
そもそもcronが動いているかの確認。
sudo /etc/init.d/cron status
動作しているなら緑文字でactive(running)と表示される。

あとはmyDNS.jpにログインすれば更新完了のログが残っているので確認できる。
短時間に複数更新してもその分のログは記録されないらしい。
まぁ一度でもログが残っていれば大丈夫かなと。

 終わりに:

これで運用に必要な設定はほぼ終わりかな。
SSL証明書の取得ってのもあるけどアクセス数を稼ぎたいわけでもないしなぁ。
むしろ証明書が無いほうがセキュリティ的に強まるんじゃなかろうか。

↑このページのトップヘ