どうもメガネです。
今回はMACアドレスのないArduinoでウェブサーバーを立ち上げる方法をメモっておこうと思います。
(※正規品ではないのでMACアドレスの記載がありません。)
正規品はシールド裏面にシールが貼ってあってそこに記載されているらしいのですが、最初手に入れないと動かないものかと勘違いしており結構焦りました。。
ブラウザにアナログピンからの入力値を表示するまで(WEBサーバー的に使用する)の一連の手順をまとめてみました。
今回使用するWifiシールド
今回使用するArduino用Wifiシールドは以下のものになります。
型名は「keyestudio W5100 Ethernet Shield ks1056」になります。
正直本家の緑色よりこっちのビビットな黄色と黒のカラーリングの方が好みです。
蜂みたいな色使いでぶっちゃけ本家より好きかもしれない。。。
外観
以下のような見た目です。
基盤デザインが印刷されており、Arduino公式の箱っぽいです。
シールドなのでArduino Unoに加工なしでそのまま接続することができます。
若干水晶発振子が曲がって取り付けられているなど見た目の問題はあるかもしれませんが、特に気になるほどではありません。
スペック等
公式にあるスペックも一応まとめておきます。
項目 | スペック |
デジタル入力 / 出力 | 対応 |
アナログ入力 / 出力 | 対応 |
microSDカード | 対応 |
リセットボタン | あり |
オンボードLED | あり |
ネットワーク接続があるか示す確認LED (パソコンの後ろで光ってるやつです。) | あり |
TCP / IPプロトコル | 対応 |
サイズ-長辺 サイズ-短辺 サイズ-高さ | 73[mm] 54[mm] 29[mm] |
ボードはArduino UNOとArduino MEGAの二つに対応していると記載があります。
keyestudioの公式サイトからの画像をお借りします。
ここまで見ることはないと思いますが、ボード上の部品の対応は以下のようになっています。
ネットワークの状態を示すライトは以下のように設定されています。
項目 | 内容 |
L | D13 LED (HIGHで点灯、LOWで消灯) |
PWR | 電源確認 |
リンク | ネットワークが接続され、データを送受信すると点滅 |
100M | ネットワーク接続は100M/s |
FULLD | ネットワーク接続は全2重通信 |
COLL | ネットワークが競合を検出すると点滅 |
RX | ネットワークがデータを受信すると点滅 |
TX | ネットワークがデータを送信すると点滅 |
実際に通信を行った場合、以下のように点灯しました。
視認はしやすいです。
シールドを使用してブラウザに値を表示させる(一連の手順)
コードを書き込む
Arduinoエディタを開き、以下のコードを書き込みます。
コードは箱裏に記載されたQRコードで飛べるサイトにも記載されています。
#include <SPI.h>
#include <Ethernet.h>
//以下に自分で設定したMACアドレスを入力します。
//IPアドレスはローカルネットワークによって異なります。
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,***); //自分のIPアドレスを入力する。
EthernetServer server(80);
void setup() {
Serial.begin(9600);
while (!Serial) {
; //シリアルポートの接続を待機する。Arduino Leonardoのみ必要な処理のようです。
}
//イーサネット接続とサーバー接続を開始。
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");Serial.println(Ethernet.localIP());
}
void loop() {
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion
//of the response
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}
コードは以上です。
ArduinoIDEにコピペして貼り付けます。
自分のパソコンのIPアドレスを取得する
次にブラウザにArduinoでの取得情報を表示するために、IPアドレスの設定を行っていきます。
まず初めに自分のパソコンのIPアドレスが必要になるので調べます。
自分の使っているパソコンのIPアドレスは以下の方法で知ることができます。
1.「Windows + R」を同時に押す。
2.以下のようなウィンドウが開くので、入力欄に「cmd」と入力。
3.以下のようなコマンドプロンプトウィンドウが表示されるので、「ipconfig」と入力し
Enterキーを押す。
4.ネットワーク関係の各項目が表示されるので、「IPv4 Address. . . . . 」という項目の数字を読み取ってメモしておきます。
例:IPv4 Adress . . . . . . . 192.168.0.***
IPアドレスを設定する
前の操作で読み取った自分のパソコンのIPアドレスを、先ほどIDEにコピペしたコード上部に入力します。
以下の部分です。
IPAddress ip(192,168,0,***); //自分のIPアドレスを入力する。
その後、「***」の部分の3文字を適当な数字に変えます。
適当に決める数字は0~255の範囲であれば何でもいいようです。
ここで注意点が二つあります。以下の通りです。
・Arduinoシールドに設定するIPアドレスをパソコン固有のものとじにすると(変更しないと)、動作しない
・「***」の三桁以外は同じにしなければ動作しない(「***」以外は変えてはいけない)
今回は適当に177で設定しました。
なおパソコンに表示されるIPアドレスは「ドット区切り:“.”」ですが、Arduinoに書き込むときは、「カンマ区切り:“,”」なので注意してください。
//以下に自分で設定したMACアドレスを入力します。
//IPアドレスはローカルネットワークによって異なります。
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,177);//自分のIPアドレスを変更したうえで入力する。 ←←ココだよぉ!!
IPアドレスの設定の範囲についてですが、この範囲の理由はIPアドレスの仕様によるものらしく、日経XTECHのサイトで解説されていました。
勘違いしてない?IPアドレスとサブネットマスクの仕組みを図で再確認:日経XTECH
IPアドレスの設定は以上です。
MACアドレスを設定する
次にMACアドレスを決めていきます。
正規品だとMACアドレスがシールド裏面に記載してあるらしく、すでに決まっているらしいのですが、互換品やその他非正規品のWifiシールドはMACアドレスの記載がないことが多いようです。
これを知らなくて必死に調べる方法を検索してましたね、、、、
なので自分適当に決めて設定する必要があります。
今回公式が出しているコードに記載された以下のMACアドレスをそのまま使用してみましたが、
問題なく動作しました。
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
ただこのままだとこのシールド使っているひと全員このアドレスなのか、、、
と思ったので、以下のように「0x」以下のDE、、、などを変更してみました。
byte mac[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00 };
ちなみに決め方の基準なのですが、知恵袋の過去の質問に以下のようなものを見つけました。
手順だけ抜き取ってまとめてみると、
- 02で始まるMACアドレスは自由に設定できる
- そのほかは下位の桁を変更して自由に決められる
- 既存機器とのアドレスと重複しないように注意する
ということらしいです。
あんまりないかとは思いますが、ArduinoとWifiシールドで作成したウェブサーバーを家の中に10個くらい置きたい人は、下位の桁から00~10、、みたいに変更すればよい、ということだとおもう。
MACアドレスの設定は以上です。
ルーターとWifiシールドを接続する
次にArduino用Wifiシールドとルーターを接続します。
以下のようにルーターのLANポートとシールドのLANポートをLANケーブルで接続します。
Arduino本体はUSBケーブルでパソコンと接続します。
接続はこれで完了です。
以下のように確認LEDが点灯していれば問題ないと思います。
ブラウザに取得情報を表示できるよう設定する
次ににブラウザの設定を行っていきます。
Arduinoで取得した値をブラウザに表示させるにはブラウザのウィンドウにIPアドレスを入力する必要があります。
手順は以下の通り。
1.ブラウザの新しいウィンドウを開きます。
2.上記のURL入力欄に、ArduinoIDEにて設定したIPアドレスを入力します。
今回の例だと以下のようになります。
http://192.168.0.177/
この際、設定したIPアドレスは「ドット区切り:“.”」で入力します。
上記ではIPアドレスを、「http://」と「/」で囲んでいますが、なくても大丈夫なようです。
通信されない等、問題がある場合にはやってみるといいかもしれません。
動作確認を行う
次に動作確認をしてみます。これまでの操作で、
・ArduinoWifiシールドのIPアドレスの設定
・ArduinoWifiシールドのMACアドレスの設定
・Arduino本体へのプログラムの書き込み
が終わりました。
プログラムではAduinoのアナログ入力ポートからの情報を表示させるようになっているはずですので、ブラウザに以下のように値が表示されているか確認してみましょう。
おそらく5秒おきくらいに値が更新されるはずです。
現在アナログ入力ピンには何もつないでいませんが、
開放状態だと空間で適当に決まった電位が勝手に表示されるので確認は回路なしでもできます。
公式の表示部分のプログラムを変えれば温度や湿度などを表示させることも簡単にできると思います。
その他-コメント等
一応動作時の熱がそこそこあったため載せておきます。
測ってみたところ中心のICは60°程度になるので、年中稼働させたりケースに密封する場合は少し注意が必要かもしれん。
半導体的には壊れる温度ではないと思いますが、なんとなく寿命に響きそう。
まとめ
以上、Arduino用のWifiシールドを使用してウェブサーバーとして動作させる方法についてまとめてみました。
結論としては、MACアドレスのない非正規品では自分でIPアドレスとMACアドレスを設定してやる、という感じです。
純正以外のシールドを利用する人は参考にしてみてください。
またシールドとルーター間の通信速度がGbpsクラスだと動作しない、ということもあるようですが、今回使用したkeyestudio製のものは特に問題ありませんでした。
このkeystudioのシールド自体の評価ですが、かなり安いにも関わらず結構いい感じです。
Arduinoに関しては非正規品でも全然イケるので調べたらもっと安いのも出るかもしれない。
それではまた。