Ethernet Shield Arduino 1.0 大はまり

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の記述する順番が逆になっている模様です。

Ethernet Shield Arduino 1.0 大はまり” への6件のコメント

  1. 私もこのW5100のイーサネットシールドの購入を考えています。ソフトウェアの互換性、使い勝手以外で、ハードウェア周りで何かお気づきになった違いはありますか?W5100の内蔵バッファ(16KB?)は同じですよね。さすがに、両方比べてみないと分からないとは思いますが・・・

    • Kenji.Yさんコメントありがとうございます。お尋ねの件ですが、説明書等は付いてこないのでWiznet W5100を使用しているという事だけしかわかりません。バッファサイズも不明です。特筆すべきは、後付けのPoEモジュールは載せることができないので、そこは注意が必要です。使って間もないのですが、EtherNetとSDカードは特に問題なく使えるようです。あまりお役に立てなくてすみません。今後ともよろしくお願いいたします。

      • 管理人さん、さっそくご返答ありがとうございます。そうですね、PoEは非対応みたいですね。かなり、迷いましたが、純正を購入しようかと思います。送料込みで$40のところを発見しました。しかもR3でした。
         ガイガカウンタ製作日記、更新、楽しみにしております。参考にさせていただいています。

        • どうもありがとうございます。そうですよね、リファレンスになる純正品を購入するのがベストですね。仮に何かあった時、無駄な時間を使わず済みますしね。

  2. 今、まさに開封し、サンプルのEhternet->Webclientで固定アドレス設定に変更して実行・・で、この問題にぶち当たった者です。 助かりましたぁ 情報有り難うございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です