📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の1版が非表示)
3行目: 3行目:
<br><br>
<br><br>


== Ethernetシールド ==
== EthernetシールドとDHCPの利用 ==
==== DHCPの利用 ====
ArduinoでEthernetシールド等を使用する場合、プログラムで明示的にIPアドレスを指定するのではなく、<br>
ArduinoでEthernetシールド等を使用する場合、プログラムで明示的にIPアドレスを指定するのではなく、<br>
DHCPで自動的にIPアドレスの割り当てを行う方法を記載する。<br>
DHCPで自動的にIPアドレスの割り当てを行う方法を記載する。<br>
31行目: 30行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br><br>
==== Webサーバの実装 ====
 
== EthernetシールドとWebサーバの実装 ==
このセクションでは、Arduinoの標準のEthernetライブラリを使用して、単純なWebサーバを実装する。<br>
このセクションでは、Arduinoの標準のEthernetライブラリを使用して、単純なWebサーバを実装する。<br>
簡単なWebサーバの実装例はExampleに含まれている。<br>
簡単なWebサーバの実装例はExampleに含まれている。<br>
151行目: 151行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br><br>
==== Arduinoの遠隔操作 ====
 
== EthernetシールドとArduinoの遠隔操作 ==
Arduinoのメリットの1つに、各種シールドと開発環境における各種ライブラリの存在が挙げられる。<br>
Arduinoのメリットの1つに、各種シールドと開発環境における各種ライブラリの存在が挙げられる。<br>
<br>
<br>
163行目: 164行目:
また、ArduinoとホストPCは、有線LANケーブルを使用してルータまたはハブに接続する。<br>
また、ArduinoとホストPCは、有線LANケーブルを使用してルータまたはハブに接続する。<br>
<br>
<br>
Arduinoのソースコードでは、TCPポート8888番をリスニングしており、データ"S:1"を受信するとLEDを点灯、"S:0"を受信するとLEDを消す。<br>
Arduinoのソースコードでは、TCP 50000番をリスニングしており、データ<code>S:1</code>を受信するとLEDを点灯、データ<code>S:0</code>を受信するとLEDを消す。<br>
ホストPCのソフトウェアでは、ONボタンを押下した時はArduinoにデータ"S:1"を送信、OFFボタンを押下した時にデータ"S:0"を送信する。<br>
ホストPCのソフトウェアでは、ONボタンを押下した時はArduinoにデータ<code>S:1</code>を送信、OFFボタンを押下した時はデータ<code>S:0</code>を送信する。<br>
このようなクライアントとサーバ間のデータ通信の取り決めのことを、プロトコルという。<br>
このようなクライアントとサーバ間のデータ通信の取り決めのことを、プロトコルという。<br>
[[ファイル:Arduino Ethernet 1.jpg|フレームなし|中央]]
<br>
<br>
次に、ArduinoにEthernetシールドを接続する。<br>
次に、ArduinoにEthernetシールドを接続する。<br>
下図に、Ethernetシールドの表面と裏面、接続図を示す。<br>
下図に、Ethernetシールドの表面と裏面、接続図を示す。<br>
 
[[ファイル:Arduino Ethernet 2.jpg|フレームなし|中央]]
<br>
<br>
下図に、ArduinoとLEDの接続を示す。<br>
下図に、ArduinoとLEDの接続を示す。<br>
8番ピンのデジタル出力を使用している。<br>
8番ピンのデジタル出力を使用している。<br>
ここでは、抵抗は470[Ω]を使用しており、流れる電流は<math>I = \frac{5 \mbox{[V]} - 2.1 \mbox{[V]}}{470 [\Omega]} = 6 \mbox{[mA]}</math>である。<br>
ここでは、抵抗は470[Ω]を使用しており、流れる電流は<math>I = \frac{5 \mbox{[V]} - 2.1 \mbox{[V]}}{470 [\Omega]} = 6 \mbox{[mA]}</math>である。<br>
 
[[ファイル:Arduino Ethernet 3.jpg|フレームなし|中央]]
<br>
<br>
以下に、Arduino Unoのソースコードを示す。<br>
以下に、Arduino Unoのソースコードを記述する。<br>
<br>
データ<code>S:1</code>でLEDを点灯、データ<code>S:0</code>でLEDを消す。その他のデータを受信した場合、クライアントがそのデータを捨てる。<br>
データ"S:1"でLEDを点灯、データ"S:0"でLEDを消す。<br>
その他のデータを受信した場合、クライアントがそのデータを捨てる。<br>
1バイトずつにデータを取得するため、下図のような状態遷移となる。<br>
1バイトずつにデータを取得するため、下図のような状態遷移となる。<br>
 
[[ファイル:Arduino Ethernet 4.jpg|フレームなし|中央]]
<br>
<br>
MACアドレスは、一意性のある6バイトを設定する。(ここでは、0xDE 0xAD 0xBE 0xEF 0xF0 0x0Dとしている)<br>
MACアドレスは、一意性のある6バイトを設定する。(ここでは、0xDE 0xAD 0xBE 0xEF 0xF0 0x0Dとしている)<br>
ネットワークアドレスは192.168.1.0/24を想定しており、ArduinoのIPアドレスは192.168.1.10と固定する。<br>
ネットワークアドレスは192.168.1.0/24、ArduinoのIPアドレスは192.168.1.10(固定)、ポート番号は、TCP 50000番とする。<br>
また、ポート番号は、TCP 50000番とする。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <EthernetServer.h>
  #include <EthernetServer.h>
279行目: 278行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
最後に、ホストOSのソフトウェアを作成する。<br>
最後に、ホストOSのソフトウェア(.NET Frameworkの<code>TcpClient</code>クラスを使用)のソースコードを記述する。<br>
ここでは、Windowsで利用可能なC#と.NET Frameworkを利用して、上述のプロトコルをサポートするTCPクライアントを作成する。<br>
ここでは、Windowsで利用可能なC#と.NET Frameworkを利用して、上述のプロトコルをサポートするTCPクライアントを作成する。<br>
下図のように、ソフトウェアのUIにおいて、ArduinoのIPアドレスとポート番号を指定できるようにしている。<br>
下図に示すソフトウェアのUIでは、ArduinoのIPアドレスとポート番号を指定できるようにしている。<br>
 
[[ファイル:Arduino Ethernet 5.jpg|フレームなし|中央]]
<br>
以下に、.NET FrameworkのTcpClientクラスを使用したソースコードを記述する。<br>
  <syntaxhighlight lang="c#">
  <syntaxhighlight lang="c#">
  using System;
  using System;
319行目: 316行目:
           try
           try
           {
           {
             var port = int.Parse( textBox2.Text );
             var port = int.Parse(textBox2.Text);
             using(var client = new TcpClient( textBox1.Text, port ))
             using(var client = new TcpClient(textBox1.Text, port))
             {
             {
                Byte[] data = System.Text.Encoding.ASCII.GetBytes( string.Format( "S:{0}", on ? "1" : "0" ) );
                 using(NetworkStream stream = client.GetStream())
                 using(NetworkStream stream = client.GetStream())
                 {
                 {
                   stream.Write( data, 0, data.Length );
                  // データの送信 "S:0" または "S:1"
                   var data = new Byte[256];
                  Byte[] TxData = System.Text.Encoding.ASCII.GetBytes(string.Format("S:{0}", on ? "1" : "0"));
                  var responseData = String.Empty;
                   stream.Write(TxData, 0, TxData.Length);
                   Int32 bytes = stream.Read( data, 0, data.Length );
                   responseData = System.Text.Encoding.ASCII.GetString( data, 0, bytes );
                  // データの受信
                   var RxData = new Byte[256];
                   Int32 bytes = stream.Read(RxData, 0, RxData.Length);
                   String responseData = System.Text.Encoding.ASCII.GetString(RxData, 0, bytes);
                 }
                 }
             }
             }
335行目: 334行目:
           catch(Exception ex)
           catch(Exception ex)
           {
           {
             MessageBox.Show( ex.Message, "Switch", MessageBoxButtons.OK, MessageBoxIcon.Error );
             MessageBox.Show(ex.Message, "Switch", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }
           }
       }
       }