RPiで小さなセキュリティシステムを実行したように。 パート1

こんにちは、ホーカーズ!



多くの方がRaspberry Piについて聞いたことがあると思います。また、かなり多くの人がRaspberry Piをライブで見たことがあると思います。 2014年の初めに、私は自分でRPiをいくつか注文し、それらに対して何か面白いことをする時だと判断しました。 私はiOS開発者であるため、このプロジェクトにiOSアプリケーションを添付するというアイデアを得ました。 まあ、なぜなら RPiはサードパーティ製のハードウェアを扱うのが得意です。私は個人用の小さなセキュリティシステムを作成することにしました。











はじめに



この場合に最初にすることは、このシステムから何を望むかを決定することでした。 そのような仕事には、思考の地図に勝るものはないと信じています。 一般に、5分間の深い反射の後、これが起こりました。







約1か月後、英国から2つのRPiモデルAを受け取りました。 1つのUSBで、イーサネットなし。 16GBのフラッシュドライブを購入し、Raspbianをインストールしました。 そして、最初の落とし穴が現れ始めました-ドライバーとインターネット。 数年前にコンテストで優勝した3Gルーターをすでに持っていました。そこでインターネットを表示するために、それをRPiに接続する予定でした。 私がどれほど間違っていたか。



30分後、私はすでに店頭でUSB-Ethernetアダプターを探していましたが、売り手はD-Link社のコピーをほとんど見つけませんでした。 出口の直前に、私はそれを安全にプレイし、ASUSからwifiアダプターも購入することにしました。 時間が経ち、今日は本当に仕事を始めたかったので、間違いを犯す権利はまったくありませんでした。 両方のデバイスで、Linuxサポートは自然に誇示されます。









家に着いて、私はディスクからインストールしようとしてかなりの時間を殺し、インターネット上のD-Linkの最新のドライバーを見つけました。 この会社の人たちは、2年前にこのデバイスのサポートをやめたことがわかりました! 私は彼らが私にジャンクを売っていたことに気づいた( それを翌日さらに2台のフラッシュドライブと交換することに成功した )。 計画Bがありましたが、これはドライバーなしで驚くほど機能し、アダプターをASUSからUSBに挿入するだけで、システムですぐにネットワークカードとして識別されました。 グラフィカルシェルモードでRPiモデルAを操作するのは単純に不可能であり、SSDを搭載したMacBookの後にはすべてが非常に遅くなるとすぐに言わなければなりません。 だから私は彼を苦しめないことに決め、自分のためにsshをセットアップしただけです。



次に、鉄で作業するためのシステムを作成する言語についての質問が発生しました。 私はPythonを選択しました。すぐに使える作業があるので、ライブラリなどをインストールする必要はありません。さらに、この言語を長い間学びたかったのです。



約1週間で、Pythonに必要なものをすべて習得しました。非常に興味深い週でした。 「ビッグバン理論」の第1シーズンのエピソード9で、主人公が接続したアパートの一部のデバイスはインターネット経由で制御でき、誰でもライトやオーディオシステムのオン/オフを切り替えることができました。 RPiに接続されたLEDでも同じことをしました。 これは確かにオーディオシステムではありませんが、LEDが惑星の反対側の半球をマウスでクリックして点灯したとき、感覚は言葉で表せませんでした:)







鉄で働く



私が解決しなければならなかった次の質問は、動きと煙のセンサーはLEDではないので、鉄を接続して制御する方法でした。そこではすべてがやや複雑です。 この質問で、私は私の友人に目を向けました。彼は単に回路について多くを知っており、私よりもはんだごてを持っている友人です。



その瞬間から、2人の人々がプロジェクトに取り組み始め、私はアマチュア無線店の頻繁な訪問者になりました。



回路の動作については別の記事で詳しく説明しますが、ここでは、すべてがどのように機能するかについて簡単に説明します。







この図では、左側にモーションセンサーがあり、右側に車のアラームがあり、下部に電源への接続があります。



今後、バッテリー電源への切り替えの自動化は回路から除外されたと言いたい。 主電源に単純に並列に接続し、220Vがなくなると自動的に回路への給電を開始するバッテリーが購入されました。 そして、ドアのリミットスイッチをリードスイッチに置き換えることが決定されました。



回路全体を接続して電力を供給するために、2つの独立したボードが作成されました。一方は、フォトカプラを介して鉄で動作し、他方では、220Vの主電圧を一定の12Vおよび5Vに変換します。 12Vからはセンサーとサイレンがあり、5VからはRPiがあります。



これはすべて良いことですが、次の質問はさらに興味深いものでした。どのようにしてセンサーからデータを取得するのでしょうか。 正直に言うと、すべての作業をGPIOを介してハードウェアで行うことにしました。これが唯一の方法であり、残りの入力/出力は特定の機器用であり、センサーから状態を1または0の形式で取得するだけです。







GPIOには26個の接点があり、そのうち2〜5V、2〜3V、5グランド、残りは指定した構成に応じて入力または出力のいずれかになります。







ハードウェアシステムのプログラミング



3層アーキテクチャを作成することにしました: RPi-Web Server-iOS 。 まず、フォールトトレランスを向上させるため、 サーバーをチェーンから除外すると、RPiに障害が発生する可能性があり、それを知ることができないため、システム全体が非常に脆弱になります。 第二に、私はもちろん、サーバーが送信するプッシュ通知を支持して、SMSとダイヤラーの送信を拒否することにしました。



したがって、ハードウェアを操作するシステムをプログラミングするために、Python 2.5を選択しました。 最初に行うことはWebIOPiのインストールです 。 これは優れたオープンソースプロジェクトであり、ブラウザを介して機器の作業を簡単にデバッグできます。 GPIOポートのステータスを表示し、入力/出力用にポートを設定し、出力0または1に手動で設定できます。インターネット上では、ロシア語での詳細な指示さえあります。



上で書いたように、Pythonには「すぐに使える」GPIOでの作業があります。このためには、特別なライブラリを接続するだけです。



import RPi.GPIO as GPIO
      
      







GPIOには、ボード上のアカウントと内部連絡先番号の2つの連絡先番号モードがあります。 アカウント番号を使用することをお勧めします。簡単です。



 GPIO.setmode(GPIO.BOARD)
      
      







システムを起動する前に、必要なすべてのポートを初期化する必要があります。つまり、ポートの初期値を示すだけでなく、それらが機能する方法、入力または出力を指定する必要があります。



 GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
      
      







ポートを読み取るには、次のコードを使用します。



 if (GPIO.input(11) == GPIO.HIGH)
      
      







ポート1または0の出力にインストールするには:



 GPIO.output(12, GPIO.HIGH) GPIO.output(12, GPIO.LOW)
      
      







モーションセンサーは非常に短い時間信号を発するため、ポートを常に読み取る必要がありますが、RPi.GPIOではこれは非常に便利に実装されていると言わなければなりません。 入力1または0を受け取ったときに、特定の関数が呼び出されることを確認できます。 また、ポートごとに読み取り頻度が設定されます。



 GPIO.add_event_detect(11, GPIO.FALLING, callback=move_sensor_callback, bouncetime=500)
      
      







いくつかの重要な落とし穴。 プログラムループでスリープ(1)を行う必要があります。そうしないと、プロセッサーは常に100%ロードされるため、プログラムの終了時にGPIO.cleanup()を実行することをお勧めします。



 try: while True: sleep(1) finally: GPIO.cleanup()
      
      







次に、さらに見知らぬ問題について説明します。その理由は見つかりませんでしたが、完全に適切な解決策が見つかりました。 約6時間の連続操作の後、スクリプトはセンサーへの応答を停止します。 ほとんどの場合、非常に便利なシステムが機能しなくなり、特定のイベントが発生するとコールバック関数が呼び出されます。 これは非常に簡単に解決されます。たとえば、cronを使用して、スクリプトをリロードする必要がある場合があります。 信頼性を高めるために、私のシステムでは、cronは1時間ごとにスクリプトをリロードし、1分ごとにスクリプトが動作しているかどうかをチェックし、動作していない場合は実行します。



私はプログラムを悪魔の形で動作させました。ここでは何も説明する必要はないと思います。これはかなり標準的なことです。 必要に応じて、インターネットで例を見つけることができます。



システムのアーキテクチャについて少し話しましょう。 私はそれぞれの鉄の作品を別々のモジュールに入れました。 各モジュールは、ポートの初期化、ハードウェアのオン/オフ、自己診断の実施、たとえばモーションセンサーがトリガーされたときのサーバーへのメッセージの送信、そしてもちろんそのステータスをログに書き込むことができます。



自己診断は非常に簡単に行われます。初期化中は、すべての鉄が出力に1つある必要があります。したがって、ゼロがある場合、センサーは機能しないか、閉じた位置にありません(リードスイッチ)。 したがって、システム全体は、センサーが穏やかな状態で1を持ち、それに応じてセンサーがトリガーされるか何かが壊れたときに0になるという事実に基づいています。



一般的に、システムは4つのセンサーで構成されます:360°モーションセンサー、煙センサー、2つのリードスイッチ。 そしてもちろん、閉ざされた部屋で声を出してサイレンを鳴らすと、耳を折るだけです。



これで、最初の部分は終了します。次回は、サーバー部分とiOSアプリケーションがどのように作成されたかを説明します。 ご清聴ありがとうございました。可能であれば、コメントでハードウェアとソフトウェアに関するすべての質問にお答えします。



さて、結論として、第二部の小さなネタバレ:)










All Articles