EtherNetShieldについて調べてみました

最終更新日 2019年11月1日

ArduinoもLAN接続可能です。NICが直接載っているArduino(Arduino Leonardo ETH/Arduino Yun/Arduino Ethernet Rev3/Arduino Tian)も有りますし、Shieldとして或いはmoduleとして提供しArduinoと接続して使用するモノも有ります。

Arduino自体メモリサイズが小さいため、バッファ等はNIC側回路で賄い、TCP/UDP/HTTP/FTP/SMTP等のプロトコルによる通信が実現出来ます。

NICとしては正規品はWIZnet社のW5100ないしはW5500というchipが使用されています。
互換機では上記に加えてWIZnet社のW5200、W5300、microchip社のENC28J60程度かと思います。ライブラリさえちゃんと用意されていれば、どのchipでも構わないのですが、安定した通信をするにはボード設計の良いモノを選ばないといけないようです。正規品でW5100搭載機はリセット回路が宜しくなく、電源投入時に初期化できないようです。

EtherNetShield版は基本的にNIC以外にMicroSDカードスロット回路が搭載されています。バスはSPIで、CSはETH=10、SD=4となっています。※例外もあるかと思います。
SPIバスはICSPでは無く11/12/13番pinが割り当てられています。注意。

EtherNetModule版も基本SPIバスです。CSは必ずしも10では無いようです。また、SDカードスロットが必ずしもバンドルとなっているわけではないです。

正規品と互換機には大きな違いがあります。それは正規品はMACアドレスをメーカがちゃんと取得してボードに割り当てているのに対し、互換機はMACアドレスを取得していないと云う事です。個人でMACアドレスを有償取得も出来るのですが余りに煩雑なので正規品を買うのがリーズナブルであることは確かです。
※MACアドレス6Byteの内、最初の3桁はメーカ固有の値です。Arduinoはこの値が、90−A2−DA−XX−XX−XXとなっています。
※MACアドレス自体は自分でスケッチに打ち込んで使用する必要があります。W5100やENC28J60にはchip内にMACアドレスを保持できないようです。一方W5500がどうなのか気にしています。調査が必要です。
※スイッチサイエンスから購入するとメーカが提供していないMACアドレスをスイッチサイエンスで取得したMACアドレスを添えて提供してくれます。大変重宝です。
ex)Wiz820io、Wiz850io 00-50-c2-97-xx-xx

1

2

3

4

5

6

仕様

ベンダーID (OUI)
(Organizationally Unique Identifier)

機種ID

シリアルID

Arduino
90 A2 DA      

Wiznet
00 08 DC      

スイッチサイエンス
00 50 C2      


現在手元にはKeyeStudioのEthernetShield(ks0156)があります。2基目で、最初に購入したモノは不良品だったようです。
※不良かどうかの判断もなかなか難しいです。W5100の場合、SMDで意図的に半田ブリッジpinがあります。この点が問題に様にも思っています。8カ所あります。
このShieldをUNO互換機に接続して、WOL(WakeOnLAN)コントローラを作成するというプロジェクトを実施しました。引き合いがあったからです。

仕様は以下の通りです。

これにより汎用コードをArduinoに書き込んで置き、パラメータとなる部分はSDカード内のファイルをレタッチする事で対応出来ることになります。

実際にWOLを実行してみましたが、ちゃんとターゲットPCを起動させることが出来ました。パチパチ。一応スケッチを示します。
必要な環境ファイルは以下のようなものです。

[WOL]
Debug? = TRUE
Title = WOL
[SET]
MyMACAddress = 90:A2:DA:99:70:e5
MyIPAddress = 192.168.0.199
MySubnetmask = 255.255.255.0
MyGateway = 192.168.0.1
MyDNSserver = 8.8.8.8
TargetMac1 = 28:d2:44:99:70:e5
TargetMac2 = FF:FF:FF:FF:FF:FF
TargetMac3 = FF:FF:FF:FF:FF:FF
TargetMac4 = FF:FF:FF:FF:FF:FF

WOLコントローラって必要か?

PCにWOLソフトがあれば、そこから登録されているターゲットに対してWOLを実行すれば良いので、敢えてArduinoで実現しなければいけないシチュエーションが浮かびません。寧ろタブレットにWOLソフトをインストールしておき、PCやNAS等に対してリモート処理が出来る方が需要がありそうです。


実際の調査で判ったこと


2018/6/20追記

その後、NICモジュールをたくさん購入しました。WIZ550io/WIZ850io/W5500/ES_USR1・・・・ いずれもWIZnet社のW5500チップを搭載したモジュールです。
いろいろ試したところ、W5100は3.3Vの電源電流が180mA程度は必要で、Arduinoボードからの供給では賄いきれず、安定した通信は困難だと感じています。
また、W5100用のライブラリもCS=10でないとうまく動かないようなライブラリです。自由にCSpinが設定できない。そしてリセットを確実に実現出来ない。
そんなこんなでW5500+ #include <Ethernet3.h> でリーズナブルな配線が実現出来、確実なリセットが出来る事と、Arduinoボードを選れば、供給電源で安定した通信が可能となることが判りました。また、W5100よりもW5500の方がコンパイル後のコード面積も小さく出来ます。実行パフォーマンスも明らかにW5500の方が上です。
chipによる比較表を作ってみました。

NIC比較
chip種 ENC28J60 W5100 W5200 W5500 8720A
メーカ Microchip WIZNet WIZNet WIZNet SMSC/Microchip
Status(2018.6) Active Active Active Active Active
チップ単価 \350 チップ高い\750 チップ高い\800 \500 \150
  10 Base-T PHY 10/100 Base-T/TX PHY 10/100 Base-T/TX PHY 10/100 Base-T/TX PHY 10/100
Base-T/TX PHY
インターフェース SPI SPI SPI SPI SMI
電圧 - 供給 3.1 V〜3.6 V 3 V〜3.6 V 2.97 V〜3.63 V 2.97 V〜3.63 V 1.6 V〜3.6 V
電流 - 供給 160mA 5μA 160mA/175mA 132mA 24 mA, 49 mAMax
コメント 古くからSTM32で利用されている 初期のEthernetShieldで採用されている DFRobotのモジュールで採用されている 現在リリースされているEthernetShieldで採用されている
実効データ転送レートはW5100より4倍は速い
ENC28J60の代わりに使用したいがライブラリは共通ではない。
接続方法がよく判らない。ForumでW5200の速度が遅いのでこれを使いたいという書込があった
ReferenceClock 25MHz 25MHz 25MHz 25MHz 50MHz
パッケージ DIPあり 24-QFN 小さい

また、Arduinoボードに搭載されているEEPROMを使用してMACアドレスを保持する方法も確立しました。
MACアドレスはソースコード内に埋め込んでしまうと同じHEXデータから派生したオブジェクトは同じMACアドレス/IPアドレスとなり調子よくありません。ユーザが変更できるようにしたいです。しかしソースコードのレタッチで対応するのは限界があります。
EEPROMには書き換え回数の制限がありますので、起動時に毎回書き込む様な方法は取れませんが、IDを用意しておいて、起動時にEEPROMから読込内部登録して、更新要求があれば、書き換える。また、IDが登録されていない場合は新規基板なのでソースコード内の初期値を書込と云う事でまずまずの結果となります。
ブラウザから更新出来るように実現出来るため見栄えも作り手次第です。
UNOだとメモリが足りないかもしれませんがMEGAで有れば十分可能です。

2019/11/1追記

EtherNetInfoをEEPROMに書き込んで、Web頁で更新管理することは、NICモジュールを装備したシステムでは必須だなと思っています。
STM32duinoでも、BluePillにEEPROMが搭載されていなくても使える仕組みが用意されているし、STM_SmartV2ならボード内にEEPROMが追加されています。

BluePillでAjaxによるIOコントロールモジュールや、Modbusモジュールを試作し、そのスケッチ内にもIPアドレスや、MACアドレスをソースコードで管理するので無く、出荷検査で書き込む様な仕組みをはじめから組み込むことは有意義だと思っています。

実際に組み込んでいて、実行時エラー/文字化けが頻発するようになってきました。これが結構問題で対策を考慮中です。
テストコードは普通に実行出来るんです。しかし本体に組み込むとエラーとなってしまいます。どうも PROGMEM で登録した文字列をブラウザに送信するところで問題が起きているようです。 strcpy_P の問題なのか、バッファメモリが確保出来ずに失敗するのか?原因追及に四苦八苦です。
ArduinoIDEだけではデバッグするのが本当に大変だと改めて感じています。

問題の表示画面を載せておきます。

strcpy_Pに失敗した部分が影響していると思っています。buffer[100]で行っていますが、もっと小さくしないと実行メモリが不足するのかもしれません。BluePillは20kBのユーザメモリがあり、このコードの場合グローバルで5kB程度使っていますが十分な空きメモリのはずなんですが。。。。
※BluePillのフラッシュメモリは128kBとされています。MEGA2560は256kBであり、WebPage内容をフラッシュに保存するとなると、128kBが小さいなと感じるようになります。とはいうものの、UNOだとフラッシュ32kB、メモリ2KBですので本件のような案件には役不足となる事は明解です。

最大131072バイトのフラッシュメモリのうち、スケッチが55168バイト(42%)を使っています。
最大20480バイトのRAMのうち、グローバル変数が4744バイト(23%)を使っていて、ローカル変数で15736バイト使うことができます。


戯言(nonsense)に戻る


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。