純正品を購入するか否か迷ったのですが、結局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の記述する順番が逆になっている模様です。
私もこのW5100のイーサネットシールドの購入を考えています。ソフトウェアの互換性、使い勝手以外で、ハードウェア周りで何かお気づきになった違いはありますか?W5100の内蔵バッファ(16KB?)は同じですよね。さすがに、両方比べてみないと分からないとは思いますが・・・
Kenji.Yさんコメントありがとうございます。お尋ねの件ですが、説明書等は付いてこないのでWiznet W5100を使用しているという事だけしかわかりません。バッファサイズも不明です。特筆すべきは、後付けのPoEモジュールは載せることができないので、そこは注意が必要です。使って間もないのですが、EtherNetとSDカードは特に問題なく使えるようです。あまりお役に立てなくてすみません。今後ともよろしくお願いいたします。
管理人さん、さっそくご返答ありがとうございます。そうですね、PoEは非対応みたいですね。かなり、迷いましたが、純正を購入しようかと思います。送料込みで$40のところを発見しました。しかもR3でした。
ガイガカウンタ製作日記、更新、楽しみにしております。参考にさせていただいています。
どうもありがとうございます。そうですよね、リファレンスになる純正品を購入するのがベストですね。仮に何かあった時、無駄な時間を使わず済みますしね。
今、まさに開封し、サンプルのEhternet->Webclientで固定アドレス設定に変更して実行・・で、この問題にぶち当たった者です。 助かりましたぁ 情報有り難うございました。
とおりすがりさんこんばんは。お役に立つことが出来てうれしいです。(^^)v