13,005
回編集
(ページの作成:「== 概要 == <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]] |