Raspberry Pi2とWindows10IoTを使用したホームオートメーション
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
| ||||
|
このプロジェクトについて
今日の時代では、テクノロジーは人間の生活を向上させることができます。テクノロジーは10年ごとに進化しています。自動化は以前は空想科学小説でしたが、今日はそうではありませんでした。最新のテクノロジーと家を組み合わせることで、素晴らしい家を建てることができます。 RaspberryPiとWindows10を使用すると、ホームデバイスを自動的に操作できるホームオートメーションシステムを構築できます。
はじめに
プロジェクトを開始する前に、まず基本を理解しましょう。次の画像(全体的な構成)について考えてみます。
<図>
部屋の構成
部屋のシナリオを考慮して、ArduinoUNOはデバイスを制御してセンサーデータを読み取ります。定期的に、RaspberryPiはArduinoUNOによって収集されたセンサーデータを要求します。図「部屋のアーキテクチャ」は、ArduinoUNOがデバイスやセンサーとどのように接続するかを示しています。各部屋には、複数の制御可能なデバイス(つまり、ライト、ファン、ウォールソケットなど)、1つのPassiveIR(部屋にいる人間の存在を検出するため)、1つの温度センサー(室温を収集するためのLM35)、およびLDR(部屋の窓の近くの光の強さを検出します。
<図>
デバイスアドレスマッピング
最も重要な部分は、デバイスをどのように識別するかです。簡単だ。部屋番号とデバイス番号を組み合わせてデバイスアドレスを作成します。
例:
<図>これまでのところ、全体的な構成はわかっています。つまり、RaspberryPiがプライマリコントローラーとして機能します。各部屋には、RaspberryPiのスレーブとして機能する独自のArduinoUNOが1つあります。 RaspberryPiとArduinoUNO間の通信は、I2Cを使用して行われます。
回路図
簡単にするために、最初の部屋の実装を始めましょう。回路図を参照して、コンポーネントを適切な方法で接続してください。
I2Cバスストライプ: 複数のArduinoを接続するには、以下に示すようにI2Cバスストライプを使用できます。
<図> <図> <図>
デバイスをリレーボードに配線するにはどうすればよいですか? <図>
すべてハードウェア側で行われます。今度はソフトウェアを構築します。
ソフトウェア
私たちのプロジェクトは、Raspberry Pi2とArduinoUNOで構成されています。 Visual Studio2015で開発されたRaspberryPi2ソフトウェア。読者はVisualStudio2015でのRaspberryPi 2のプロジェクト作成に精通していると想定しています。また、ユーザーはArduinoフレームワーク、Visual C#、およびWindows UniversalXAMLの中間知識を持っていると想定しています。
次のフォーメーションでソフトウェアを理解しましょう:
- プロトコル(Raspberry Pi 2とArduinoの話し方)
- クラス構造(Raspberry Pi 2がこのような複雑なデバイスと部屋を維持する方法)
- ユーザーインターフェイス(ワイヤーフレーム)
プロトコル(Raspberry Pi 2とArduinoがI2Cを介してどのように話すか)
先に進む前に、まずRaspberryPiとArduinoがどのように話すかを決定しましょう。信頼できるプロトコルを作成するには、最初に通信の明確な目的または目標を設定する必要があります。このプロジェクトを考慮して、目標は次のとおりです。
- センサーの読み取り
- デバイスの状態を読み取る
- デバイスの状態を設定する
最初にプロトコルの定義を始めましょう。プロトコルは、バスを介して通信するためのルールを定義します。プロトコルはバイトシーケンスにすぎません。
バイトを送受信するためのプロトコルを定義しました。送信バイトは3バイトに固定され、受信バイト配列は14バイトに固定されています。
このプロジェクト用に定義されたプロトコルを理解するには、次の回路図を参照してください(「X」はランダムな値または「0」を示し、通信中は無視されます):
<図> <図><図> <図> <図>
'I2C_Helper'という名前のクラスには、PRi2のユニバーサルアプリプロジェクトでのプロトコルの実装が含まれています。このクラスは、Universal WindowsProjectで使用できます。開くには:[ソリューションエクスプローラー]> [ライブラリ]> [通信]フォルダーに移動します。 Arduino側では、I2Cライブラリを理解するのは簡単です。
これで、センサー、デバイスのステータスと値を提供し、デバイスの状態を設定するためのアクセシビリティを提供できる適切な通信スキームを定義しました。
クラス構造(Raspberry Pi 2がオブジェクトを維持する方法)
最初に議論したように、このプロジェクトは家全体を考慮しました。ホームは複数の部屋で構成され、部屋は複数のデバイスで構成されます。したがって、このような構成のOOP構造を以下に示します。
<図> <図>
プライマリクラス「Home」は、部屋の一般的なリスト(List
部屋は、デバイスの一般的なリスト(List
デバイスは、それらの詳細と、プロトコルモード-2を使用してそれらをオンまたはオフにする機能で構成されています。AmbientLight、PassiveIR、およびTemperatureクラスは、部屋の環境データへのアクセスを提供します。ルームオブジェクトはセンサーデータを維持し、プロトコルモード-0を使用して定期的に更新します。
ユーザーインターフェイス
すべてのアプリケーションはユーザーフレンドリーでなければなりません。ユーザーフレンドリーなアプリケーションを作成するには、ワイヤーフレームから始めます。独自のアプリケーションを使用し、主な目的と、エンドユーザーにとって最も簡単な方法でそれらを統合する方法を見つけようとしていると想定します。
このアプリケーションのシナリオでは、主な目的は次のとおりです。
- 部屋の管理
- デバイス管理
- GSM通信、インターネット通信などの外部サービス
そうするために、私は問題を次のように分割しました:
- ホームページ:基本的なデバイスステータス情報、日時、ロックを提供します
- お気に入りのデバイス:お気に入りのデバイスに直接アクセス
- ルームページ:設定されたルームとそのデバイスへのアクセスを提供します
- 一般的な水装置:ウォーターポンプと間欠泉
- 設定/構成:部屋とそのデバイスの管理を提供します
ワイヤーフレーム: <図> <図> <図> <図> <図>
ワイヤーフレームをベースに、次に示すUIを開発しました。完全なソースコードをダウンロードできます。ダウンロードへのリンクは、記事の最後にあります。
<図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>だから、すでにUIを開発しています。必要に応じて変更できることを願っています。ヘルプについてコメントしてください。
設定方法は?
私はこのソフトウェアをできるだけ簡単にするように努めました。マイナー構成では、このRaspberry Pi2を使用してデバイスを直接操作できます。ステップバイステップの構成を以下に示します。
<図> <図> <図> <図> <図> <図> <図> <図>
このアプリを使用してウォーターポンプと間欠泉を制御するにはどうすればよいですか?
デバイスを追加するのと同じ方法で、ウォーターポンプと間欠泉を取り付けることができます。ただし、ウォーターポンプや間欠泉をリレーボードに直接取り付けて電源を入れることはできません。リレーボードを爆破するだけでなく、危険です。
ウォーターポンプまたは間欠泉を操作するには、ウォーターポンプまたは間欠泉をコンタクタに接続し、コンタクタのコイルをリレーボードに接続します。したがって、デバイスを操作すると、リレーがコンタクタのコイルをアクティブにし、ポンプまたは間欠泉が開始/停止します。コンタクタを購入する前に、そのコイル定格とコンタクタの定格を確認してください。コンタクタは非常に多くの種類があります。だからあなたのウォーターポンプの評価でそれを確認してください。ウォーターポンプの定格よりもわずかに高い定格のコンタクタを購入することをお勧めします。
このソリューションをRaspberryPi 2にデプロイするにはどうすればよいですか?
このリンクを参照して、導入プロセスを理解できます。
このアプリをスタートアップアプリとして登録するにはどうすればよいですか?
多くの趣味の人は、Raspberry Pi2の起動直後にアプリケーションを開始することを望んでいます。これを行うには、私の記事を読んでください:Windows 10 IoT Core:スタートアップアプリの設定
既知の問題
Arduinoブートアップ
Arduioが起動すると、D13ピンがちらつきます。 Arduinoが起動または再起動すると、D13が一度点滅し、リレーに接続されているデバイス(D13を介して制御される)も点滅するため、D13にリレーピンを接続しないことをお勧めします。
解決策: 2つのオプションがあります。最初のオプションは、D13と実際に接続しないことです。 2つ目は少し複雑です。起動中にD13を使用しないAruinoのOptiBootファームウェアを書き換えて、そのブートローダーをArduinoに書き込むことができます。
時計の問題
Raspberry Pi2にはリアルタイムクロックチップが搭載されていません。したがって、停電またはフレッシュブート後の時間を維持することはできません。したがって、日時を維持するには、外部RTCを接続してプログラムする必要があります。
解決策 :NTPを使用できますが、インターネット接続が必要です。または、Arduinoでさえ、起動時の日時のRTCおよびRaspberryPiリクエストを処理できます。外部RTCをRPi2に直接接続することもお勧めします。
<図>
デバッグの問題
C#でユニバーサルアプリを開発しているときに、多くの問題に直面しました。ユニバーサルアプリはWinRTのスーパーセットであるため、非常に多くの非同期操作を実行する必要がありました。非同期操作でエラーが発生した場合、解決するのが頭痛の種になります。例外やエラーが発生するたびに、ほとんどの場合、次の画面が表示されました。
<図>エラーが発生しやすい行、プログラマーにわかりやすいメッセージ、何も意味がありません。エラーの原因を見つけるには、非常に多くのブレークポイントを設定する必要があります。デバッグ中に、ユニバーサルアプリが事前の通知なしにシャットダウンし、突然私のウォッチウィンドウが役に立たなくなることがあります。動作の原因は、このリンクで説明されています。
解決策 :予想されるエラーが発生しやすい行の前にブレークポイントを配置します。
つまり、現時点(この記事が公開されている間)では、ユニバーサルアプリは優れていますが、従来のWindowsアプリケーションのようなデバッグ機能が不足しています。
未来
機能、新しいアイデア、または既存の制限を克服することに関しても、制限はありません。ただし、すべての機能を一度に追加することはできません。このリリースでは、この記事でRaspberry Pi2とWindowsIoTの真の力を理解できます。 WindowsユニバーサルXAMLは、Windows 10 IoT向けの優れたGUIフレームワークであり、Raspberry Pi2には優れたグラフィックプロセッサが搭載されています。これら2つを組み合わせることで、並外れた外観のGUIソリューションを作成できます。さらに、Raspberry Pi 2には900MHzのクアッドコアCPUが搭載されており、マルチスレッド(UWP、タスク)ソリューションに最適です。これは、組み込みおよびソフトウェアシステムの基礎(つまり、I2Cバス通信、アプライアンスの操作方法、カスタムプロトコル設計、実際のアプリケーションおよびワイヤーフレームのOOP設計)を学びたい人のための基本から中級のプロジェクトです。
>将来的には、I2Cバスの代わりにRadioFrequencyまたはInfraRedを使用してリモートデバイスを介して通信する機能を追加できます。 Azureを使用したWeb管理ポータルは、モバイルデバイスに統合できます。さらに、実際の自動化は、イベントベースの操作、RTCチップを使用した時限操作のように統合されます。たとえば、午後7時に裏庭のライトをオンにします。午後10時にオフにします。イベントベースの良い例は、周囲光の強度が特定の強度を下回ったときなどに庭のライトをオンにすることです。したがって、Raspberry Pi2用のこの新しいWindows10 IoTCoreプラットフォームに制限はありません。
幸運を祈り、安全を確保してください。
ヘルプや質問をお気軽に質問してください。
コード
- Arduinoスケッチ
Arduino Sketch C / C ++
/ * Arduino Sketch v0.4このスケッチは、「Raspberry Pi2とWindow10 IoTを使用したホームオートメーション」用に作成されています。次のリンクを参照してください:https://www.hackster.io/AnuragVasanwala/home-automationこのスケッチはテスト済みですAtmega328pでのみ。このスケッチは、Windows 10 IoTCoreを実行しているRaspberryPi2によって操作されるI2Cバス上のスレーブデバイスとしてArduinoデバイスを準備します。目的:+センサーデータを定期的に収集します(機能:ループ)+ OnRecevive、3バイトモードの命令を収集し、それに基づいて操作を実行します。 (関数:ReceiveData)+ OnRequest、OnReceiveによって選択されたモードに基づいて14バイトの応答配列を送信します。 (機能:SendData)このスケッチは、保証なしでそのまま提供されます。個人用だけでなく、商業用にも使用できます。このスケッチによって引き起こされたデータの損失や怪我については責任を負いません。* /#include#define _DEBUG _ / * ArduinoのI2Cスレーブアドレス* /#define SLAVE_ADDRESS 0x40 / *ピン宣言* / int Pin_AmbientLight_LDR =A0; int Pin_PassiveIR =2; int Pin_Temperature =A1; / *グローバル変数* / volatile short Value_AmbientLight_LDR、Value_Temperature; volatile bool Value_PassiveIR; / *プロトコル変数* / byte Mode、Pin、Value; byte Response [14]; void setup() {//ピンを初期化しますpinMode(Pin_AmbientLight_LDR、INPUT); pinMode(Pin_PassiveIR、INPUT); pinMode(Pin_Temperature、INPUT); pinMode(0、OUTPUT); pinMode(1、OUTPUT); pinMode(3、OUTPUT); pinMode(4、OUTPUT); pinMode(5、OUTPUT); pinMode(6、OUTPUT); pinMode(7、OUTPUT); pinMode(8、OUTPUT); pinMode(9、OUTPUT); pinMode(10、OUTPUT); pinMode(11、OUTPUT); pinMode(12、OUTPUT); pinMode(13、OUTPUT); pinMode(A2、OUTPUT); pinMode(A3、OUTPUT);#ifdef _DEBUG_ Serial.begin(9600);#endif //アドレス 'SLAVE_ADDRESS'でI2Cスレーブを初期化しますWire.begin(SLAVE_ADDRESS); Wire.onRequest(SendData); Wire.onReceive(ReceiveData);} void loop(){// LDRの読み取り// Arduinoは10ビットのアナログ読み取りをサポートします。 //したがって、8ビットに変換する必要があります。 Value_AmbientLight_LDR =analogRead(Pin_AmbientLight_LDR); Value_AmbientLight_LDR =map(Value_AmbientLight_LDR、0、1023、0、255); // PassiveIR値を読み取りますValue_PassiveIR =(digitalRead(Pin_PassiveIR)==HIGH)?真/偽; //温度センサーを読み取り、電圧を摂氏に変換しますValue_Temperature =(short)((float)(analogRead(Pin_Temperature)* 0.48828125)); // 100ミリ秒待つdelay(100);} // I2C受信データのコールバックvoidReceiveData(int byteCount){//プロトコルモードモードである最初のバイトを読み取る=Wire.read(); //ピンである2番目のバイトを読み取ります。モード2の場合にのみ有効Pin =Wire.read(); //ピン値である3番目のバイトを読み取ります。モード2でのみ有効値=Wire.read(); //モード2を受信した場合、指定されたピンに信号を送りますif(Mode ==2){digitalWrite(Pin、Value); } #ifdef _DEBUG_ Serial.print(Mode); Serial.print( ""); Serial.print(Pin); Serial.print( ""); Serial.println(Value);#endif} void SendData(){switch(Mode){case 0://モード:センサー応答の読み取り[0] =(byte)Value_AmbientLight_LDR; // Value_PassiveIRはブール値であるため、バイトに変換する必要がありますResponse [1] =(byte)((Value_PassiveIR ==true)?1:0); // Response [2]バイトはTemperatureの符号バイト// 0 --- ve Temperature // 1- + ve Temperature Response [2] =(byte)((Value_Temperature <0)?0:1); Serial.println(Value_Temperature); //-ve温度をバイト単位で送信することはできません。 + veの同等のResponse [3] =(byte)((Value_Temperature <0)?(Value_Temperature *(-1)):Value_Temperature);に変換します。壊す;ケース1://モード:デバイスの読み取り状態応答[0] =(digitalRead(0)==HIGH)? 1:0; Response [1] =(digitalRead(1)==HIGH)? 1:0; Response [2] =(digitalRead(3)==HIGH)? 1:0; Response [3] =(digitalRead(4)==HIGH)? 1:0; Response [4] =(digitalRead(5)==HIGH)? 1:0; Response [5] =(digitalRead(6)==HIGH)? 1:0; Response [6] =(digitalRead(7)==HIGH)? 1:0; Response [7] =(digitalRead(8)==HIGH)? 1:0; Response [8] =(digitalRead(9)==HIGH)? 1:0; Response [9] =(digitalRead(10)==HIGH)? 1:0; Response [10] =(digitalRead(11)==HIGH)? 1:0; Response [11] =(digitalRead(12)==HIGH)? 1:0; Response [12] =(digitalRead(A2)==HIGH)? 1:0; Response [13] =(digitalRead(A3)==HIGH)? 1:0;壊す;ケース2://モード:デバイス状態の設定Response [0] =(digitalRead(Pin)==HIGH)? 1:0;壊す;デフォルト:ブレーク; } //ワイヤーバック応答Wire.write(Response、14);}
Raspberry Pi 2(Windows Headed App)ソフトウェア
https://github.com/AnuragVasanwala/Home-Automation--RPi2-WinIoT- 回路図
バス上に一意のI2Cスレーブアドレスを持つ個々のArduinoを接続することにより、複数の部屋を追加できます。 完全な回路図を含むフリッティングファイル。製造プロセス
- PythonとRaspberryPiの温度センサー
- SensorflareとRaspberryPiを備えた433MHzスマートホームコントローラー
- RaspberryPiとTwilioを使用した音声およびSMS対応の光センサー
- RaspberryPiを使用して自宅の温度を監視します
- RASPBERRY PI HOME AUTOMATION
- Raspberry Pi2上のWindows10 IoT Core –Adafruitセンサーデータ
- Windows 10 IoTCoreおよびSHT15
- Windows 10 IoT Core for Raspberry Pi3モデルB +
- KINECTとRASPBERRYPIを使用したSONBIロボットの人間検出
- IoTとホームオートメーション:将来はどうなるのか?
- サプライチェーンにおける自動化とIoT:次は何ですか?