スマートホームの作成と独自のプロトコルの開発

私はすぐに、この投稿は主題にいる人々よりも一般の人々に焦点を合わせており、むしろ最近の私がしたことの報告であると言わなければなりません。



ここで、私はすべての仕事のために得点し、魂のために何かをすることにしました。 再び彼ははんだごてを取り上げた。 自宅ですべてを自動化することにしました。 古いアパートにはスマートハウスなどがありました。インターネットなどを使って部屋の照明をつけることができました。



今回は、自分の間違いを考慮に入れることにしました。 主な問題は、以前は、温度、モーションセンサー、ディスプレイ、ボタンなどが接続されているすべてのものを担当するデバイスが1つあったことでした。 これはすべて素晴らしいことでしたが、最終的にはデバイスは元々組み込まれていた機能のみを実行しました。 このデバイスを改造せずに、新しいセンサーを取り込んで接続することはできませんでした。



多くの個別のデバイスを作成し、それぞれが厳密に定義されたタスクを担当し、それらを共通のネットワークに簡単に接続できるようにする方がよいと判断されました。 そして、各デバイスがアドレスと独自のコマンドのセットを持つようにします。 現代の車のCANバスのようなもの。 同時に、マスターデバイスを使用せずにネットワークを分散し、1本のワイヤですべて接続し、追加のコントローラを購入せずに簡単に実装して、長いワイヤが問題にならないようにします。



マイクロコントローラには、あらゆる種類のI²C、はいUARTが搭載されていますが、これらは明らかに条件を満たしていません。 最終的に、 自転車のプロトコルを開発することになりました。









CANのように、支配的および劣性の信号があります。 ワイヤーの場合(おそらく、私はラジオやIR​​ライトも使用します)、主なものはデータ線を地面に押し付けることです。 通常の状態では、データラインには+ 5Vまでのプルアップがあります。 したがって、デバイスは、回線が既に地面に押し付けられていることを認識すると、他のデバイスが既にデータを送信していることを理解し、回線が解放されるのを待ちます。 データ自体は、支配的な信号の長さによってエンコードされます。 1Tはゼロ、3Tは1、それらの間の一時停止は1Tです。 各送信は、10Tの長い信号の初期化で始まります。 マイクロコントローラのヤスデに関する多数の実験の後...







...最適な値はT = 0.000064秒であると判断しました。 さらに、損失はありません(ほぼ?)。 このネットワークを介して大量のデータが送信されるとは思わない。 トイレのディスプレイにTwitterからのメッセージのみを表示します。



データパケット自体の構造は次のとおりです。2ビットはパケットの優先度(デバイスが同時に送信する場合は非常にまれです)、8ビットは送信者のアドレス、8ビットは受信者のアドレス(0xFFはブロードキャスト)、8ビットはコマンドの数です、8ビットはデータフィールドの長さ(バイト単位)、対応するデータバイト数、8ビットはチェックサムです。



その結果、このプロトコルでの作業を完全に割り込みレベルで実装するライブラリができました。 つまり プログラムの残りの観点から見ると、一種のマルチタスキングになります。 初期化を1回実行するだけで十分です。メインプログラムが無限ループに入った場合でも、マイクロコントローラーはpingに応答します。 パケットを送信するときに回線がビジーであっても、ライブラリは回線が解放されるとすぐに送信します。 パケットがそのアドレスで受信されると、指定された関数が呼び出されます。



したがって、新しいデバイスをネットワークに接続するには、ライブラリを構成して、マイクロコントローラーの必要なレッグ、アドレス、および名前を示すだけで十分です。



1つの小さな箱に敬意を表します。 私は通常のオシロスコープを持っていませんが、数年前にコンピューター用のアイビーで最も安いUSBオシロスコープを注文しました。 ちょうど1MHzです。 私がそれを手に入れて試してみると、私はそれが役に立たない中国の消費財だと判断し、そのお金を無駄に捨てて遠くの箱に入れました。 そして今、私はそれを手に入れることにしました...彼のためでなければ、おそらくこれをすべてデバッグしていたでしょう。 そして、その上で、すべてがすぐに見えて理解可能です。







アース、電源、データの3本のワイヤから離れていることが判明しました。 はい、各デバイスの電源をいじりたくなかったので、どこにでも9〜12ボルトの直流電流を供給し、すでに各デバイスに平凡なKrenkaを装着することにしました。



ただし、このネットワーク全体は、何らかの形でコンピューターとインターネットに接続する必要があります。 これを行うには、最初にCOMポートでデバイスを作成しました。







このことは率直に言ってくだらないものでした。 そして、なぜUSBですぐにそれをすることに決めなかったのですか? 知りません FT232チップは後に購入されました。 基本的にQFNパッケージに含まれています。







最初にはんだ付けされたQFNケース。 すぐには判明せず、ボードはすでに過熱により黒くなっています。 しかし、うまくいきました! 24時間機能するので、これをルーターに貼り付けました。コンピューターだけでなく、インターネットにも接続する必要があります。







ルーターは通常のLinuxです。 タンバリンとダンスをした後、なんとかデバイスを吸いました。 次に、nyxのプログラミングスキルを思い出さなければなりませんでした。 このタスクはそれほど難しくありませんでした。複数のクライアントを同時に接続できるネットワークで仮想COMポートを共有することです。 次に、すべてのスクリプトが簡単なスクリプトを受け取るようにしました。 したがって、シェルスクリプトを変更するだけで、デーモンを再起動することなく、ルーターをさまざまなイベントに簡単に応答させることができます。 その後、彼はfifo擬似ファイルを使用して作業を行いました。これにより、コマンドラインから直接ネットワークにパケットを送信する機会が与えられました。 たとえば、コマンドecho "04010803"> fifoは 、コマンド08(リレー制御)とデータ03(1番目と2番目のランプをオンにする)を使用して、優先度04のパケットをデバイス01に送信します。 もちろん、これをすべて手動で入力する必要はありませんが、すべてを自動化するスクリプトの作成が非常に容易になります。 Windowsでは、サーバー上のデーモンに接続し、パケットを送受信するライブラリが作成されました。 本格的なソフトウェアはまだありませんが、部屋の明かり、テレビ、キーボードのホットキーで受信機をオンにすることができます。



しかし、その後、ブートローダーを作成することにしました。 私は彼なしでどうしたらいいか想像できなくなりました。 ネットワーク上でデバイスのファームウェアを直接更新できます! これは、マイクロコントローラのメモリの最後にあり、メインプログラムの前に実行される小さなプログラムです。 彼女の全タスクは、生命の兆候を示し、数秒後にメインプログラムを起動するか、そのようなコマンドが到着した場合にファームウェアをダウンロードして更新することです。 非常に困難なため、このすべてのコードを1キロバイトに収めました。 カウントは文字通りバイトになりました。 基盤のみが実装されています-ラインの空き、期待、およびその他のチップのチェックはありません。 データ転送とチェックサム検証のみですが、ブートローダーにとってはこれで十分です。 メモリのすべてのバイトを保存し、レジスタを直接操作し、コードを最大限に最適化するのがいかにクールか...低レベルのプログラミングは多くの楽しみをもたらします=)



コンピューターについては、デバイスに再起動コマンド、ファームウェアモードに切り替えるコマンド、およびファームウェア自体を送信する適切なコマンドラインユーティリティを作成しました。 プロジェクトのMakefileに登録するだけで十分です...







プログラマーのメモ帳で1つのキーを押すと、アパート内の動作中のデバイスのファームウェアを更新できます。 切断せずに、はんだごてなしで、コンピューターから離れることなく。 また、プロセス全体に10〜20秒かかります。 とても便利です。 一部のデバイスの構成は、事前にすべてを予測するよりも、ファームウェア自体を変更する方がはるかに簡単です。 たとえば、レシーバーが送信するブロードキャストパケットに対する反応をウォールスイッチに追加すると、DVDプレーヤーのリモートコントロールからシャンデリアをオンにできるようになります。 これにはウィザードは必要ないことを思い出してください。デバイスは互いに直接通信します:)同時に、失敗したファームウェアでデバイスを強制終了することはできません-ブートローダーは常により早く起動します。 これで、新しいデバイスはそれぞれ、シンプルなテンプレートをフラッシュし、最小限の変更(足とデバイスID)を作成するだけで十分です。その後、安全にその場所に配置し、そのためのファームウェアの書き込みを開始できます:)



現在、ネットワークにはすでに6つのデバイスがあり、これまでのところすべてが完全に機能しています:)電源のノイズのみに問題がありましたが、再びオシロスコープが助けてくれました。 完全なものを購入する必要があります。



upd:

GitHubプロジェクト: github.com/ClusterM/clunet



All Articles