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をNCにすると、通信の途中で自分のIPアドレスを見失います。

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

ATMEGA2560の接続でも、RSTピンはRESETポートに接続する必要があります。
W5500 ATMEGA2560
GND GND
5V
5V
MISO Pin#51
MOSI Pin#50
SCS Pin#10
SCLK Pin#52
RST RESET
INT N/C

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

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


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




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




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

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();
  uint8_t my_address[6]; // array for mac address
  Ethernet.macAddress(my_address);
  Serial.print("My MAC Address is ");
  for(int i = 0; i < 6; i++) {
    Serial.print(my_address[i],HEX);
  }
 
  Serial.println("");


なお、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);

続く...