Arduinoのネットワーク通信

W5500(無印)とWIZ550IO

W5500チップを使ったSPI接続のEthernetモジュールを入手したので紹介します。
今回入手したのはMACアドレスなしのモジュールとMACアドレス付きのモジュール(WIZ550io Rev1.2)の2種類です。

まず、MACアドレスなしのモジュールですが写真のようにW5500チップ、25Mhzクリスタル、5V→3.3Vのレギュレータが主な部品とし て実装されています。
5V→3.3Vのレギュレータが実装されているので、Arduinoの5Vから直接給電することができます。




このモジュールはEthernetライブラリでは動きません。Ethernet2ライブ ラリを使 う必要があります。
MACアドレスは内蔵していないので、W5100と同様にスケッチ内で任意のMACアドレスを指定する必要があります。

モジュールのRSTピンはボードのRESETポートに接続する必要があります
UNOやNANOのRESETポートはリセットが掛かると一瞬GNDに落ちて、その後PullUpします。
このEthernetモジュールは、通常はRSTピンをPullUpしておく必要があります。
RSTをOPENにすると、通信の途中で自分のIPアドレスを見失います。

ATMEGA328 W5500 ATMEGA328

3.3V 5V 5V
Pin#12 MISO GND GND
Pin#11 MOSI RST RESET
Pin#10 SCS INT
Pin#13 SCLK N/C

ATMEGA2560の接続でも、RSTピンはRESETポートに接続する必要があります。
ATMEGA2560 W5500 ATMEGA2560

3.3V 5V 5V
Pin#50 MISO GND GND
Pin#51 MOSI RST RESET
Pin#10 SCS INT
Pin#52 SCLK N/C

ライブラリだけを変更すれば、W5100のスケッチがそのまま使えます。



W5500にはこのような形状のモジュールもあります。


裏面に全ての回路が実装されています。
このモジュールは3.3V専用です。


ピンマップはRJ45コネクタを上にして以下の様になっています。
ATMEGA328 W5500 ATMEGA328
GND GND GND GND
GND GND 3V3 3.3V
Pin#11 MOSI 3V3 3.3V
Pin#13 SCLK N/C
Pin#10 CS RST RESET

INT MISO Pin#12

ATMEGA2560 W5500 ATMEGA2560
GND GND GND GND
GND GND 3V3 3.3V
Pin#51 MOSI 3V3 3.3V
Pin#52 SCLK N/C
Pin#10 CS RST RESET

INT MISO Pin#50




次に、MACアドレス付きのモジュール(WIZ550io Rev1.2)ですが、こちらは3.3Vの単一給電となっています。
Arduinoの3.3Vでは電流不足で安定して駆動できないので、5Vを3.3Vにレベルシフトして給電する必要があります。
こ ちらにハードウェアのschematicが公開されています。
Rev1.2のSchematicを確認したところW5500チップのほかに、25Mhzクリスタル、PIC12F519のマイコン、
MC74VHC157DTR2Gの2-Channel Multiplexerが実装されていてます。
回路図の斜め読みですが、PIC12F519のマイコン側にMACアドレスが書き込まれていて、
電源投入時にPIC12F519のマイコンから、W5500にMACアドレスを通知しているようです。
MultiplexerはPIC12F519→W5500と、ホストマイコン→W5500の入力切り替えに使われていて
入力チャンネルの切り替えはPIC12F519で行っています。




モジュールとの結線は上のW5500と同じです。

ATMEGA328 WIZ550io ATMEGA328
GND GND

GND GND 3.3V 3.3V
Pin#11 MOSI RDY
Pin#12 MISO RSTn RESET
Pin#13 SCLK NC
Pin#10 CS INTn
3.3V 3.3V GND GND
3.3V 3.3V


ATMEGA2560 WIZ550io ATMEGA2560
GND GND

GND GND 3.3V 3.3V
Pin#51 MOSI RDY
Pin#50 MISO RSTn RESET
Pin#52 SCLK NC
Pin#10 CS INTn
3.3V 3.3V GND GND
3.3V 3.3V


モジュールのピンアサインはこ ちらに公 開されています。

PICマイコン内蔵のMACアドレスを使わずに、スケッチ内で任意のMACアドレスを指定する場合は
Ethernet2ライブラリがそのまま使えます。
PICマイコン内蔵のMACアドレスを使うためにはEthernet3ライブラリを使い、
ライブラリ内のEthernet3.hに以下を追加する必要があります

/*
 modified 12 Aug 2013
 by Soohwan Kim (suhwan@wiznet.co.kr)

 - 10 Apr. 2015
 Added support for Arduino Ethernet Shield 2
 by Arduino.org team

 */
#ifndef ethernet3_h
#define ethernet3_h

#include <inttypes.h>
#include "utility/w5500.h"
#include "IPAddress.h"
#include "EthernetClient.h"
#include "EthernetServer.h"
#include "Dhcp.h"

#define WIZ550io_WITH_MACADDRESS


ArduinoのスケッチではMACアドレスを指定する必要はありません。
PICマイコン内蔵のMACアドレスが自動的に使われます。
macAddress()でPICマイコン内蔵のMACアドレスを取り出すことができます。
void setup() {
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  
  Serial.begin(9600);
#if defined WIZ550io_WITH_MACADDRESS
  if (!Ethernet.begin() ) {
#else
  if (!Ethernet.begin(mac) ) {
#endif
    Serial.println("Ethetnet begin fail");
    while(1) {}
  }
  Serial.print("localIP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("subnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("dnsServerIP: ");
  Serial.println(Ethernet.dnsServerIP());

  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    if (thisByte != 3) Serial.print("-");
  }
  Serial.println();


#if defined WIZ550io_WITH_MACADDRESS
  uint8_t MACaddress[6]; // array for mac address
  Ethernet.macAddress(MACaddress);
  Serial.print("WIZ550io MAC Address is ");
  for(int i = 0; i < 6; i++) {
    if (MACaddress[i] < 0x10) Serial.print("0");
    Serial.print(MACaddress[i],HEX);
    if (i != 5) Serial.print("-");
  }
  Serial.println("");
#endif
}

Etherner2ライブラリではPICマイコン内蔵のMACアドレスを正しく取得できません。



Ethernet2 Ethernet3どちらのライブラリもMACアドレス以外のパラメータが無いときはint型の関数、
MACアドレス以外のパラメータが1つでもあるとvoid型の関数になるので注意が必要です。

  int begin(void);
  void begin(IPAddress local_ip);
  void begin(IPAddress local_ip, IPAddress subnet);
  void begin(IPAddress local_ip, IPAddress subnet, IPAddress gateway);
  void begin(IPAddress local_ip, IPAddress subnet, IPAddress gateway, IPAddress dns_server);


  int begin(uint8_t *mac_address);
  void begin(uint8_t *mac_address, IPAddress local_ip);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress subnet);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress subnet, IPAddress gateway);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress subnet, IPAddress gateway, IPAddress dns_server);

続く...