
Etherenet Shield from ebay
段々とArduinoの深みにはまって来た私です。さてさて、良い獲物を見つけてしましました。「Ethernetシールド!!」です。早速調達です。
純正品を購入するか否か迷ったのですが、結局ebayから互換品を注文することにしました。検討の結果「Ethernet Shield W5100 For Arduino 328 UNO Mega 2560」と表示されていた品物を「beauty.2011」という香港の業者に発注しました。金額は送料込みで$23.5でした。
今回発注したものはWiznet W5100 というチップが乗っていて、Arduinoのオフィシャルライブラリが使えるとWebに記述があります。同じ互換Ethernetシールドでも ENC28J60チップが乗っているものは少し安く買うことができます。しかし、使う事が出来るライブラリが異なるみたいでした。これを選んで正解だったと思います。
その時点で純正のEthernetシールドが$45でしたので、今回購入価格は純正品のだいたい半分の値段です。値が安いというのは非常に良い事ですが、その反面ちゃんと動くか否か一抹の不安があります。
さて、現物が到着してさっそく実験です。Arduino 1.0の環境でテストを行うことにしました。「File」-「Example」-「DnsWebClient」の順に選択して、スケッチをロードしました。このスケッチはグーグルのサーバにアクセスして “arduino”の検索結果をシリアルモニタに表示させるプログラムです。新規購入のEhternetシールドの動作確認にはもってこいですね。
スケッチ中の注釈を読むと、新型純正品のEthernet ShieldにはMACアドレスが書かれたステッカーが貼られていると書かれています。今回購入したEthernet shieldには残念がらMACアドレスはついていませんでした。きっと登録作業がされていないのでしょう。
まぁ、今回は特に何も影響が無いので例題のまま”00:AA:BB:CC:DE:02″を、使うことにします。でも仮に、もう一つのEthernet シールドを同一ネットワークで使用するときには、このMACアドレスに注意をしなければなりません。あまり関係はないですが、調べたところ上位3オクテットで表現される“00:AA:BB”のベンダーは登録されていませんでした。
驚くべき事に、スケッチの中身を見てみるとIPアドレスを設定する箇所がありません。Arduino自身のIPアドレスはDHCPから受け取って設定し、宛先のwebサーバ(www.google.com)のIPアドレスもDNSサーバから引いて来るようです。恐るべし!ですね。
早速スケッチをアップロードして、走らせてみます。シリアルモニタを開いてみると、ちゃんとwww.google.comにつながって、データを読んできました。良かったです、この購入したEthernetシールドは、ちゃんと使えるようです。
ここまでは順調だったのですが、ここからが大はまりでした。
続いて、本家のリファレンスにあるEthernetClient()を元にDHCPを使用しない設定を試してみました。レスポンスが早くなり、メモリも節約できるはずです。先ほどの例文とほとんど同じですが、今度はDHCP及びDNSを使わないで通信します。
まず、スケッチ中のグーグルwebサーバのIPアドレスが異なっていたので正しいアドレスに変更します。あと、IPアドレス等を、私の家の環境にあわせセットします。
byte server[] = { 74, 125, 235,176 }; // Google IPアドレス変更
byte ip[] = {192, 168, xxx, xxx }; ArduinoのIPアドレスに変更
byte gateway[] = {192 ,168 ,xxx, xxx}; デフォルトゲートウエイを追加
byte subnet[] = {255,255,255,0}; サブネットマスクを追加
Ethernet.begin(mac, ip ); gatewayとsubnetを書き加える
修正した後のスケッチ
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, xxx, xxx };
byte gateway[] = {192,168,xxx,xxx};
byte subnet[] = {255,255,255,0};
byte server[] = { 74,125,235,176}; // www.google.com
EthernetClient client;
void setup()
{
Ethernet.begin(mac, ip, gateway, subnet);
Serial.begin(9600);
delay(1000);
Serial.println("connecting...");
if (client.connect(server, 80)) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
}
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}
さて、万全の自信を持ってスケッチを実行してみます。が、残念ながら期待通り動きません。
[シリアルウインドウ]
connecting...
connection failed
disconnecting.
何度やっても connection faild です。リセットをかけてもだめ、何をやっても全然だめです。いろいろやってみましたが外部のサーバを参照することができません。(ローカルは可)
ルータをいじって、デフォルトゲートウエイを変えてみたり、サブネットマスクの値を変えてみたりしましたがだめでした。どうやらgatewayとsubnetを指定するとだめみたいです。
散々時間がかかった後、ようやく答えを見つけました。
0022 Ethernet.begin(mac, ip, gateway, subnet);
1.0 Ethernet.begin(mac, ip, subnet, gateway);
リファレンスにも載っていないのですが、Arduino 1.0 ではgatewayとsubnetの記述する順番が逆になっている模様です。