「adminトラフィックライト」に精通し、その上にあるLEDを使用して、都市の対話型マップを作成するというアイデアを理解します。赤-ノードは利用不可、緑-利用可能。 ただし、LEDを点灯する上記の方法を使用する場合は、2 xnが必要です(nは監視対象ノードの数です)。 したがって、10個のノードを制御するには、20の結論が必要です。 5つ以上のノードを監視する場合、問題を解決するこの方法が適切でないことは明らかです。
では、使用する出力の数をどのように減らすことができますか? デコーダーの使用はすぐに思い浮かびます。 この方法は適切ですが、独自のコードを作成する必要があります。このコードでは、制御されるノードのすべての可能な組み合わせを考慮する必要があります。 この方法は優れていますが、あまりスケーラブルではありません。
より成功するのは、シリアル信号をパラレル信号に変換する方法のようです。 つまり、シリアル信号がarduinoボードから出て、LED制御が追加の回路に既に実装されています。 このパスに沿って進みます。
したがって、次のものが必要です。
- シリアル信号をパラレル信号に変換するスキームを開発します。
- ステータスを表示するLEDを備えた出力ステージを作成します。
- 回路に必要な情報を記録するためのアルゴリズムを開発します。
- ホストポーリングアルゴリズムを実装します。
回路設計
シリアル信号を変換するには、シフトレジスタを使用します。 手元には74ALS164がいくつかあったので、それらを使用します。 まず、メーカーのウェブサイトを踏み、 データシートをダウンロードします。 このレジスタには次のものがあります。
- CLRリセット入力
- CLKクロック入力
- 2つの信号入力AおよびB。
- 8つの出口。
真理値表は、CLRの入力でゼロ値でリセットが発生することを示しています。 データは、CLK信号のエッジに沿ってレジスタに書き込まれます。 入力信号は、論理乗算(AND)により信号AおよびBから形成されます。 したがって、信号入力の1つ、たとえばBを論理レベル1に安全に設定できます。動作中は、CLR入力に論理ユニットレベルが存在する必要があります。 入力Aを制御することにより、必要な情報をレジスタに入力できます。 CLK入力でのゲーティングにより、明確な入力および出力データが可能になります。
ただし、チップを1つしか使用しない場合、出力は8つしかありません。 はい、たくさんありません。 しかし、ここではカスケードが助けになります。 つまり、最初のレジスタの8番目の出力を2番目のレジスタの入力Aに接続すると、データは8クロックサイクルの遅延で2番目のレジスタに入力されます。
出力段
LEDを制御するには、ノードごとに2つのピンを使用します。つまり、赤色のLEDまたは緑色のライトを点灯します。 ただし、この場合、必要なレジスタの数は2倍になります。 これを避けるために、スキームに従ってLEDを含めることを使用します。
この場合、赤と緑のLEDを焼く場合に、LEDの適切な輝きのために抵抗の抵抗値を選択する必要があります。
配線とはんだ付けの後、次のことが起こりました。
デバッグボードには2つのシフトレジスタと10組のLEDがあります。 残念ながら、ボードの中央にある4つの黄色のLEDは点灯せず、レジスタの破損した出力に非常に似ていますが、デバッグには十分です。
アルゴリズム開発の作成
そのため、LED燃焼制御回路があります。 任意のカテゴリーのレジスターで、燃焼を赤から緑へ、またはその逆に切り替える必要があります。 これにはビットの配列が使用され、各ビットは1つのノードと2つのLEDに対応します。1は緑、0は赤です。 このビットシーケンスをarduino出力に適用し、各ビットをCLK出力でクロックすることにより、レジスタに書き込みます。 明確にするために、新しい情報を記録する前に、CLR入力に論理値0を指定してレジスタをリセットします。
ノードのポーリングのためのアルゴリズムの開発
基礎として、「adminトラフィックライト」からコードを取得しますが、接続時間は測定されず、インストールの有無のみが測定されます。 ノードアドレスの2次元配列と、レジスタに入力される出力データの配列を使用します。 デバッグを簡単にするために、5つのノードのみをチェックします。
コードは非常にシンプルでコメント付きです:
// #define SIG 7 // #define CLK 6 // #define RST 5 // // #include <SPI.h> #include <Ethernet.h> // ethernet shield byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // byte ip[] = {192,168,2,177}; // ip // byte pingAddr[][4] = { {172,2,0,5}, {172,2,0,6}, {172,2,0,7}, {172,2,0,8}, {172,2,0,9} }; // bool out[] = {0,0,0,0,0}; // byte gateway[] = {192,168,2,1}; byte subnet[] = {255,255,255,0}; // char buffer[256]; // void checkHost(int i) { Client client(pingAddr[i], 80); // if(!client.connect()) { // sprintf(buffer, "Connection failed for %d.%d.%d.%d", pingAddr[i][0],pingAddr[i][1],pingAddr[i][2],pingAddr[i][3]); Serial.println(buffer); // , if(out[i] == 1) { out[i] = 0; // setMap(); } // } else { // , if(out[i] == 0) { out[i] = 1; setMap(); } } client.stop(); } // void setMap() { // digitalWrite(RST, LOW); delay(5); digitalWrite(RST, HIGH); int i; // for(i=0;i<5;i++) { // 0 if(out[i]==0) digitalWrite(SIG, LOW); // 1 else digitalWrite(SIG, HIGH); // delay(1); // digitalWrite(CLK, HIGH); delay(1); digitalWrite(CLK, LOW); // digitalWrite(SIG, LOW); } } void setup() { // ethernet shield Ethernet.begin(mac, ip, gateway, subnet); // Serial.begin(9600); // / pinMode(SIG, OUTPUT); // signal pinMode(CLK, OUTPUT); // CLK pinMode(RST, OUTPUT); // reset // digitalWrite(CLK, LOW); digitalWrite(SIG, LOW); digitalWrite(RST, HIGH); } // void loop() { int i; // for(i=0;i<5;i++){ // checkHost(i); delay(1000); } // 5 , delay(5000); }
以上です。
今では、都市の適切なサイズのマップを見つけ、LEDを適切な場所に取り付けて、ノードの可用性をリアルタイムで起きずに観察することが残っています。