【ラズパイPico】リードスイッチでドアの開閉を監視・検知してみた【リクエスト】
Вставка
- Опубліковано 18 бер 2021
- 前の動画→ • 【ラズパイPico】マウス・キーボードを自動...
リクエストにお応えしてRaspberry Pi Picoとリードスイッチでドアの開閉検知デバイスを作ってみました。
今回は冷蔵庫のドアに取り付けましたが、窓や玄関に取り付ければセキュリティ用途や人の出入りの監視にも活用できると思います。ぜひこの動画を参考に試してみてください!
----以下、今回の動画で使用したコードです---
※概要欄の制約上、「>」を全角に置き換えています
必要なモジュールをインポート
import machine
import time
警告を出す秒数
alart_secs = 30
Pico内蔵LEDのPinを定義
pled = machine.Pin(25, machine.Pin.OUT)
電子ブザーのPinを定義
buzzer = machine.Pin(19, machine.Pin.OUT)
リードスイッチ1のPinを定義
door1 = machine.Pin(1, machine.Pin.IN, machine.Pin.PULL_UP)
リードスイッチ2のPinを定義
door2 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP)
初期化
pled.off()
buzzer.off()
ドアが開いた時間(0ならドアは閉まっていたことになる)
door1_time = 0
door2_time = 0
引数:[ドア開時刻, リードスイッチの状態]
戻値:[LED状態, ブザー状態, ドア開時刻]
def GetLswStatus(door_time,value):
1秒前にドアは閉まっていた
if(door_time == 0):
今も閉まっている
if(value == 0):
return [False,False,0]
今は開いている
else:
return [True,False,time.ticks_ms()]
else:
1秒前にドアは開いていた
if(value == 0):
今は閉まってる
return [False,False,0]
else:
今も開いてる: 開いた時からの差分を取得
door_diff = time.ticks_diff(time.ticks_ms(), door_time)
所定時間以上ドアが開いている場合
if ((door_diff/1000) > alart_secs):
LEDを点滅
if(pled.value() == 0):
return [True,True,door_time]
else:
return [False,True,door_time]
else:
ドアは開いてるけどまだ所定時間に達していない
return [True,False,door_time]
while True:
res1 = GetLswStatus(door1_time,door1.value())
door1_time = res1[2]
res2 = GetLswStatus(door2_time,door2.value())
door2_time = res2[2]
LED制御
if(res1[0] or res2[0]):
pled.on()
else:
pled.off()
ブザー制御
if(res1[1] or res2[1]):
buzzer.on()
else:
buzzer.off()
time.sleep(0.5) - Наука та технологія
リクエストが実現して嬉しいです!
遅くなりましたが動画化できました!リクエスト有難うございます!
…こんな感じでよかったですかね?😂
これは良いですね!
ありがとうございます!
リードスイッチの勉強がてら作ってみましたが実用的なものができてよかったです。
ほかの用途にも転用できそうですし色々な使い道がありそうです。
Arigato Gozaimashita Sensei, from Australia.
Douitashimashite! Kochirakoso Komento Arigatou Gozaimasu.
# 所定時間以上ドアが開いている場合
if ((door_diff/1000) > alart_secs): の 1000とは何のことなのでしょうか?
全然プログラミングのことがわからないので、教えていだだけたら嬉しいです。
ticks_ms()はミリ秒(1/1000秒)の数値を返してくれる関数なので、これを1000で割ってやると単位が秒になります。
冒頭でalart_secsを30秒と定義したので、大小比較をする時に単位を秒に合わせる為に/1000しています。
リードスイッチの思い出として、ガラス管部分よりも、足の部分に磁石を向けた方が、反応距離が長くなる。というのを思い出しました。
コア部分が弱点に見えたが、実は目立たない地味な部分が弱点だった、見たいな感覚でしたw
今回初めてリードスイッチを触って私も同じことを思いました!
どう見てもガラス管が本体っぽいんですけどね…w
かなり前(8ビットCPUの時代)に使っていた富士通のキーボードを押すとリードスイッチの音がしていました。
リードスイッチの工作をしたことは無いのですが、磁気を使ったスイッチと考えています。
リードスイッチを使ったキーボードがあったんですね!それは存じ上げませんでした。ぜひ一度触ってみたいものです。
OpenPLCでプログラムを作成する方が簡単ですね。
学校でPython習ってるけど、
難しすぎて身の回りで応用できる気がしないw
MicroPythonの初学者なので、このような解説はためになります。ありがとうございます。
もっとも自分で作る時には、6ピンか8ピンのPICマイコンのアセンブラで組むかなぁ。(*^_^*)
動画をご覧くださいありがとうございます。マイコン初心者なりに四苦八苦した末の動画ですが、少しでもご参考になれば幸いです。
アセンブラとは相当な熟練者とお見受けします。私はまだまだ不勉強でC言語とPythonぐらいしかわかりません。
マイコンは奥が深く、噛めば噛むほど面白いですね。またコメントでご教示いただければ幸いです。
PICだったら
リードスイッチの入力ピンが変化したら割り込みが入るように設定して
リードスイッチが変化した際の割り込みで
リードスイッチが導通していない場合は
ハードウェアタイマーを3秒でオーバーフローするようにスタートさせて
タイマーオーバーフロー割り込みでハードウェアPWMのブザーを鳴らす。
リードスイッチが変化した時の割り込みで
リードスイッチが導通していたらタイマーを無効化および初期化とブザーの停止処理
みたいな感じにすればループなしで作れますよね。
ラズパイPicoでも似たような感じの設計にした方がいいかもしれません。
物つくりは楽しいですよね
リードスイッチでは扉の開閉隙間の調整が、難しくないですか
圧力センサーなら扉が閉まったことを感知できるので、今回の目的に合っているかも
コメントありがとうございます。
今回はリードスイッチありきで自分用に作ったのであまり困ってませんが、市販の冷蔵庫のようなドアスイッチにした方が利便性は高そうですね。
次回は圧力センサーを試してみたいと思います!ありがとうございます。
電源の供給はどの様に行われておりますか?
コンセント→ACアダプター→ラズパイ
でしょうか?
はい、そのとおりでACアダプタを使っています。検証中はPCのUSBを使うこともあります。
自転車のホイールに磁石を、フロントフォークにリードスイッチをつければ、オンになる間隔からホイールの回転数を測定して、自転車の速度計なんか作れたりしますかね...?
サイクルコンピュータの仕組みを調べたところ、全くそのままでした...笑
コメント欄で勝手に盛り上がってしまい、すみませんでした...
お見事です👏
私も動画作る際に調べたのですが、まさにこのリードスイッチで実現しています。
部品サイズの関係上、スポークの方に小さな磁石、フレーム側にリードスイッチや電池などを内蔵した「本体」を取り付けることが多いようです(改めて確認したら私が持ってるサイクルコンピュータもそうでした)
リードスイッチを直列に繋げばいいんじゃない? ウチは6ドア冷蔵庫なのでスイッチを6個直列で繋いでやってます。
今回は2ドアで数が少なかったのと、それぞれのドアで違う制御を入れる可能性を考えて別々の回路にしましたが、6ドアとなると直列に繋いだ方が良さそうですね。
とても参考になるご意見ありがとうございます!
リクエスト
ラズベリーパイで7セグメントLEDを光らせる方法が知りたいです
リクエストありがとうございます!!
デスマーチ社畜生活から抜け出したら必ず動画作ります!
うちはポストになにか投函(リードスイッチで検知)されたら、ポストの中を撮影してLINEで送ってもらうようにしてます。 再配達って17時までが多いので、仕事終わって家に帰る前に依頼出せるから便利('ω')
プログラムは誰かの作ったものの流用だけど。
ポストにセンサー、めっちゃ便利そうですね!
私もほんと再配達が煩わしいので何とかしようと光センサーを買っていたのですが、リードスイッチの方が確実に検出できそうですね。
電源が遠いのでどうするかだけがネックになっています…。
@@Shartick うちの電源は20Wくらいのソーラーパネル+バイクのバッテリーです。1年ほど使ってますが、問題なく動いてますよ。
ソーラー+バッテリーはとてもいいアイデアですね!ぜひ参考にさせていただきます😆
# 1秒前にドアは閉まっていた
if(door_time == 0):
# 今も閉まっている
if(value == 0):
return [False,False,0]
# 今は開いている
else:
return [True,False,time.ticks_ms()]
else:
# 1秒前にドアは開いていた
if(value == 0):
# 今は閉まってる
return [False,False,0]
1秒前がどうでも、今、閉まっていれば
return [False,False,0]
するから、
if(door_time == 0):
より先に
if(value == 0):
を判断した方が単純なプログラムになると思います。
いかがでしょう?
はい、その通りです👏
サンプルコードではステップが分かりやすいようにif elseをかなり冗長に書いています。
丸々コピペというのも面白くないでしょうから、ぜひお好みに合わせて最適化するなど手を加えてみてください😆
ラズパイ4でもこのプログラムは
動くでしょうか?
冒頭のimportとそれに伴うPin制御の記述はラズパイ4向けに書き換える必要がありますが、それ以外は通常のPythonでも動作すると思います!
@@Shartick 分かりました。ありがとうございます
我が家の冷蔵庫は一定時間でアラームなります。
コメントありがとうございます!
最近の冷蔵庫にはアラームがあるみたいですね。我が家のは古いので羨ましいです。
なかなかオーバースペックですね!
タイマーIC 555とかでいいのでは
コメントありがとうございます。
この動画は「ラズパイPicoとリードスイッチで簡単なものを作ってみる」が主目的なので😅 最終目的が「ドア開閉検出器を作ること」であればご指摘のとおりもっと適した方法があると思います。555はタイマーICの王道ですから、いつか「電子工作」を主眼に置いた動画も作ってみたいですね!
@@Shartick
それは失礼しました、自分もラズパイとM5stackの勉強中なので参考にさせて頂きます。
磁石は、seria製?
この磁石はキャンドゥで買ったものです。
だいたい何処の100円ショップでもこの手の磁石を取り扱っているみたいで助かります。
はえー そんな簡単な仕組みなんか
そうなんですよ。調べてみてびっくりしました。
いかつい基板でも入ってるのかと思ったらぽつんとガラス管が入ってるみたいです。
思った以上に小さかった
そうなんですよ、小さいですよね!
磁石が反応する範囲も小さくてドア側に設置する磁石の位置調整が大変でした。