「Arduinoの基礎 - Ethernet」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == <br><br> == Ethernetシールド == ==== DHCPの利用 ==== ArduinoでEthernetシールド等を使用する場合、プログラムで明示的にIPアド…」)
 
151行目: 151行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br>
==== Arduinoの遠隔操作 ====
Arduinoのメリットの1つに、各種シールドと開発環境における各種ライブラリの存在が挙げられる。<br>
<br>
例えば、Arduino UnoをLANに接続するには、Ethernetシールドのみ準備することで、Arduino Unoにネットワーク機能を追加することができる。<br>
そして、そのネットワーク機能はハードウェアの違いを意識せずに、Ethernetライブラリを使用することで実現できる。<br>
さらに、プログラミングインターフェイスとして、ソケットよりも抽象化されたサーバオブジェクトとクライアントオブジェクトが用意されている。<br>
<br>
このセクションでは、ArduinoとEthernetシールドを使用したLED遠隔操作ソフトウェアを作成する。<br>
ホストPC上のソフトウェアONボタンまたはOFFボタンを押下することで、Arduinoに接続されたLEDを制御する。<br>
また、ArduinoとホストPCは、有線LANケーブルを使用してルータまたはハブに接続する。<br>
<br>
Arduinoのソースコードでは、TCPポート8888番をリスニングしており、データ"S:1"を受信するとLEDを点灯、"S:0"を受信するとLEDを消す。<br>
ホストPCのソフトウェアでは、ONボタンを押下した時はArduinoにデータ"S:1"を送信、OFFボタンを押下した時にデータ"S:0"を送信する。<br>
このようなクライアントとサーバ間のデータ通信の取り決めのことを、プロトコルという。<br>
<br>
次に、ArduinoにEthernetシールドを接続する。<br>
下図に、Ethernetシールドの表面と裏面、接続図を示す。<br>
 
<br>
下図に、ArduinoとLEDの接続を示す。<br>
8番ピンのデジタル出力を使用している。<br>
ここでは、抵抗は470[Ω]を使用しており、流れる電流は<math>I = \frac{5 \mbox{[V]} - 2.1 \mbox{[V]}}{470 [\Omega]} = 6 \mbox{[mA]}</math>である。<br>
 
<br>
以下に、Arduino Unoのソースコードを示す。<br>
<br>
データ"S:1"でLEDを点灯、データ"S:0"でLEDを消す。<br>
その他のデータを受信した場合、クライアントがそのデータを捨てる。<br>
1バイトずつにデータを取得するため、下図のような状態遷移となる。<br>
 
<br>
MACアドレスは、一意性のある6バイトを設定する。(ここでは、0xDE 0xAD 0xBE 0xEF 0xF0 0x0Dとしている)<br>
ネットワークアドレスは192.168.1.0/24を想定しており、ArduinoのIPアドレスは192.168.1.10と固定する。<br>
また、ポート番号は、TCP 50000番とする。<br>
<syntaxhighlight lang="c++">
#include <EthernetServer.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <Dhcp.h>
#include <Dns.h>
#include <EthernetUdp.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D };
byte ip[] = { 192, 168, 1, 10 };
EthernetServer server(50000);
const int STATE_INIT = 0;
const int STATE_1 = 1;
const int STATE_2 = 2;
const int STATE_3 = 3;
const int PIN_LED = 8;
void setup()
{
    Ethernet.begin( mac, ip );
    server.begin();
    pinMode( PIN_LED, OUTPUT );
    digitalWrite( PIN_LED, LOW );
}
void loop()
{
    EthernetClient client = server.available();
    int state = STATE_INIT;
    int i;
    if(client)
    {
      while(client.connected())
      {
          while( ( i = client.read() ) != -1 )
          {
            if( state == STATE_INIT )
            {
                if( i == 'S' )
                {
                  state = STATE_1;
                }
                else
                {
                  client.stop();
                  break;
                }
            }
            else if( state == STATE_1 )
            {
                if( i == ':' )
                {
                  state = STATE_2;
                }
                else
                {
                  state = STATE_INIT;
                  client.stop();
                  break;
                }
            }
            else if( state == STATE_2 )
            {
                if( i == '1' )
                {
                  switch_led(1);
                  client.print("OK");
                }
                else if( i == '0' )
                {
                  switch_led(0);
                  client.print("OK");
                }
                state = STATE_INIT;
                client.stop();
                break;
            }
          } 
      }
    }
}
void switch_led(int on)
{
    digitalWrite( PIN_LED, on ? HIGH : LOW ); 
}
</syntaxhighlight>
<br>
 


__FORCETOC__
__FORCETOC__
[[カテゴリ:Arduino]]
[[カテゴリ:Arduino]]

案内メニュー