#ArduinoとEthernet Sheild2で通信してみた
###注意事項
・Ethernet Sheild2を購入していること
・Ethernet Sheild2の裏面に記載のあるMACアドレスをメモしておくこと
###序章
プログラムの中身は他の方が書いているブログやissueなどに載ってあるので今回はTipsのようなものを書いていこうと思う。
#####IPについて
Ethernet.beginを用いたMacアドレスとIPの設定の際には自動取得後にそのIPアドレスを設定するのが楽。
1.まずはIPアドレスを含めないEthernet Sheild2の初期設定を行う。
Ethernet.begin(ここにMACアドレスを入れる)
2.ArduinoのIDEの画面右上にシリアルモニタ(虫眼鏡のアイコン)があるからそこをクリック。
3.エラーが無く、コードが正常にコンパイルされたらシリアルモニタ上にIPアドレスが表示される。
4.シリアルモニタで表示されていたIPアドレスをEthernet Sheild 2の初期設定に追加する。
Ethernt.begin(ここにMACアドレスを入れる, ここにIPアドレスを入れる)
これで設定するIPアドレスが他で使われていないかを確かめる手間が省けた。
#####ポート番号について
Ethernetでは以下のコードによってポートを指定する。
EthernetServer server = EthernetServer(80);
EthernetServerの80という番号はHTTP通信を行うよ、という意味である。ポート番号というのは色々と予め決められており、HTTP以外の通信を行う際は他の番号を割り当てる必要がある。その他通信規格は"ポート番号"と調べれば出てくるので見てみると良い。
ちなみに、今回はWebサーバーを基準に考えているので、HTTP通信を用いたWebサーバーということで80番を指定している。
#####HTMLについて
EthernetShield2による通信と言えばWebページによるArduinoの操作だろうか。
この場合、Webページを構成するHTML(Webページのプログラミング言語)のコードをクライアント(Arudinoを操作する側)に丸ごと送信してWebページを表示させるという流れになる。
使用するのはEthernetClientクラスのprintln関数。この関数内に一行ずつHTMLのコードをString型として入れていく。
例は以下の通り。
void returnHTML(EthernetClient client) {
//---HTTP HEADER---
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//---HTML DOC------
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<meta name=viewport content=\"width=80px, initial-scale=4, maximum-scale=4, user-scalable=no\" />");
client.println("<title>A Remote</title>");
client.println("</head>");
client.println("<body style=\"color:rgb(205,205,205);background-color:rgb(96,96,96);text-align:center;\">");
client.println("Remote<br />");
client.println("<form method=GET>");
client.println("<input type=submit name=1 value=ON /><br />");
client.println("<input type=submit name=0 value=OFF />");
client.println("</form>");
client.println("</body>");
client.println("</html>");
}
#####最後に今回発生したよくわからないエラーについて
以下のようなエラーがコンパイル時に出力されることがあったので、一応メモしておこうと思いました。
In file included from C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:8:0:
これはArduino自体のエラーらしく、コンパイル及び実行には何ら影響は無いそうです。
ですが、毎回エラーが出るのも鬱陶しいですし、一応エラーが出ないようにする方法を載せておきます。
#define htons(x) ( ((((x)&0xFF)<<8)&0xFF00) | (((x)>>8)&0xFF) )
これを自分のプログラムコードの一番最後の行に書いておくとエラーは消えます。どんなことを定義しているのかは僕も知らないです。