W5500 Lite LAN通信モジュール

コンピュータ、組み込み

LAN通信するためのモジュールとしてW5500を入手しました。
T-LITEと組み合わせたTCP Client、ESP8266系、ESP32-WROOM、D4、C3、S2、S3、RP2040系との接続について記載します。

紹介するもの

W5500 Lite

特徴

マイコンとSPI接続することでLAN通信ができます。

このモジュールはT-LITE(ESP32)とワイヤ配線不要で接続することができます。
通常モジュール側はピンヘッダがついているので、T-LITE側にピンソケットを半田します。
当方ではT-LITEをピンヘッダにしたかったので、モジュール側をピンソケットに付け替え加工をしています。

ピン配置

MI(MISO)とMO(MOSI)の位置はTLITEと反対に設定されています。
T-LIETEとドッキングして使用する場合は、スケッチ上からピン配置の変更をしてください。
ブレッドボードを使用し、結合した時と同じピン配置のスケッチを掲載します。(後半)

外観

T-LITE

T-LITEの紹介、使用方法についてはこちらを参照してください。

準備

ライブラリ

WiznetサイトからW5100S-EVB-Pico用のライブラリをダウンロードしてインストールをします。
ライブラリマネージャから検索で見つからないライブラリです。

1.W5100S-EVB-Pico GithubからZipファイルをダウンロード。

2. Arduino IDEからZipファイルのライブラリをインストールする。

3.ファイル選択のブラウザで、ダウンロードしたZipファイルを選択する。

使うもの
名称(型番)用途
W5500-LITE今回の主役
T-LITEW5500を動かすマイコン
W5100S-EVB-PICOTCP Clientの紹介では、TCP Serverとして通信相手
TCP Serverの紹介では、TCP Clientとして通信相手
LANケーブル通信線
ブレッドボードマイコン基板だけでは軽いので
土台になってもらいます。

配線

T-LITE配線W5500
3V3VIN 3.3
GNDGND
GPIO5 (SPI CS)CS
GPIO19(SPI MISO)MO
GPIO23(SPI MOSI)MI
GPIO18(SPI SCK)SCLK
[2022/12/25 配線図の修正]

MISO と MOSIの配線を逆にしています。
T-LITEとW5500-LITEを結合して使用する場合、MISOとMOSIの位置が反対であるためにスケッチ側のピン設定でMISOとMOSIのピン設定をしているためです。

加工

通常、T-LITEとW5500を合体させるために、T-LITE側にピンソケットを取り付けます。
個人的にマイコン基板にはピンヘッダをつけてブレッドボードで使用したい気持ちがあるので、W5500側をピンソケットに付け替える作業をしました。

こちらの記事で付け替え加工について紹介しています。

スケッチ

TCP Client

説明

TCP ClientとしてTCP Serverと通信します。
今回サーバーには、当サイトで紹介した[W5100S-EVB-Pico]を使用します。


こちらで紹介したTCP Serverも使用することができます。
pico-ETH-CH9121

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
T-LITEとW5500-TLITEの組み合わせで利用できます。

【スケッチの説明】
Telnet ClientとしてTelenet Serverと通信します。
接続先サーバは 192.168.1.200/24, Port 5000

COMから読み取った文字をServerへ送信します。
Serverから読みとった文字をCOMへ送信します。

【ライブラリ】
esp32 ESP32 Dev Module
Ethernet Library for Arduino

【バージョン情報】
2022/11/12 : 新規
**********************************************************************/
//W5500 with T-LITE

#include <SPI.h>
#include <Ethernet.h>

//T-LITEと結合して使用する場合のピン指定
#define PIN_CS 5      //CS
#define PIN_RESET 4   //RESET
#define PIN_DC 33     //DC
#define PIN_MOSI 19   //MOSI ※T-LITEのピンアサインではGPIO19はMISOですが、W5500-LITEと結合する場合、MOSIにはGPIO19を使用する。
#define PIN_MISO 23   //MISO ※同じくW5500-LITEと結合する場合はMISOにはGPIO23を使用する。
#define PIN_SCK 18    //SCK


//Mac アドレスと ローカルIPアドレスの設定
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);                       //たまねぎブログの紹介記事により TCP Client側は 192.168.1.100としています。

IPAddress server(192, 168, 1, 200);                   //接続先のサーバIP 
#define PORTNO 5000                                   //接続先サーバポート番号

EthernetClient client;

void setup() {

  SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS);


  Ethernet.init(PIN_CS);                              // T-LITE の CS

  Ethernet.begin(mac, ip);                            // Ethernet 接続開始

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

  //Ethernetシールド確認
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }

  //接続ができるまで待機
  while (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
    delay(500);
  }

  delay(1000);
  Serial.println("connecting...");

  //サーバー側との接続
  if (client.connect(server, 5000)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{

  //LANからの読み取りが可能であれば、読み取った結果をCOMで送信
  if (client.available() != 0)
  {
    char cClient = client.read();
    Serial.print(cClient);
  }

  //COMからの読み取りが可能であれば、読み取った結果をLANで送信
  while (Serial.available() > 0)
  {
    char cCOM = Serial.read();
    if (client.connected() == true)
    {
      client.print(cCOM);
    }
  }

  // サーバから切断された場合、ポーリング待機
  if (client.connected() == false) 
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    // do nothing:
    while (true)
    {
      delay(1);
    }
  }
}
結果

結果の画像はW5500とT-Liteを直接接続した図です。
ジャンパワイヤを使用した配線例の方法でも同じ結果が得られます。

結果はTeratermを2つ起動して確認します。
1つはW5100S-EVB-Pico のCOM用でSeverとして起動させます。
もう一つはT-LITE + W5500-LITEのCOM用でClientとして起動させます。

T-LITE側のCOMターミナルから入力した文字は、W5100S-EVB-Pico側に表示されます。
W5100S-EVB-Pico側のCOMターミナルから入力した文字は、T-LITE側に表示されます。

TCP Server

説明

TCP SeverとしてTCP Clientと通信します。
今回Clientには、当サイトで紹介した[W5100S-EVB-Pico]を使用します。


こちらで紹介したTCP Clientも使用することができます。
pico-ETH-CH9121


スケッチのサンプルコードは、T-LITE用にSPIピン位置を変更しています。

準備

このサンプルではESPを使用する場合そのままではコンパイルできません。

ArduinoのESPライブラリフォルダ内にある server.h の修正が必要です。
server.h の上部コメントにはLGPLライセンスの記載がありますので、利用許諾、条件についてはコメントに従ってください。

修正前にはファイルのバックアップを保存しておくことをお勧めします。

Arduino IDE 2.0での ESP server.hの位置
“C:\Users\<your ID>\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.3\cores\esp32”
変更前 : virtual void begin(uint16_t port = 0) = 0;
変更後 : virtual void begin() = 0;

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【注意】
※ESPではこのままコンパイルするとコンパイルエラーが発生します。
ArduinoのESPライブラリフォルダ内にある server.h の修正が必要です。
server.h の上部コメントにはLGPLライセンスの記載がありますので、利用許諾、条件についてはコメントに従ってください。

修正前にはファイルのバックアップを保存しておくことをお勧めします。

Arduino IDE 2.0での ESP server.hの位置
"C:\Users\<<your ID>>\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.3\cores\esp32"
変更前 : virtual void begin(uint16_t port = 0) = 0;
変更後 : virtual void begin() = 0;

【マイコン基板】
T-LITE 基板で使用できます。

【スケッチの説明】
Telnet ServerとしてTelnet Clientと通信します。

COMから読み取った文字をClientへ送信します。
Clientから読みとった文字をCOMへ送信します。

【ライブラリ】
esp32 > ESP32 Dev Module

【バージョン情報】
2022/12/25 : 新規
**********************************************************************/

#include <SPI.h>
#include <Ethernet.h>

#define SOCKET_PORT    5000             // 接続ポート
#define PIN_CS 5      //CS
#define PIN_RESET 4   //RESET
#define PIN_DC 33     //DC
#define PIN_MOSI 19   //MOSI ※T-LITEのピンアサインではGPIO19はMISOですが、W5500-LITEと結合する場合、MOSIにはGPIO19を使用する。
#define PIN_MISO 23   //MISO ※同じくW5500-LITEと結合する場合はMISOにはGPIO23を使用する。
#define PIN_SCK 18    //SCK

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE
};

IPAddress ip(192, 168, 1, 200);
IPAddress myDns(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 100);
IPAddress subnet(255, 255, 255, 0);

EthernetServer server(SOCKET_PORT);

void setup()
{
  //W5500 のピン配置に合わせて、T-LITEのSPIピン変更を行う
  SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS);

  Ethernet.init(PIN_CS);                            // WIZnet W5100S-EVB-Pico の CS

  // Ehternet 接続
  Ethernet.begin(mac, ip, myDns, gateway, subnet);

  Serial.begin(115200);
  
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1);
    }
  }

  Serial.println("ok....");
  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());

  server.begin();
  Serial.println("Server Start");
}

void loop()
{
  EthernetClient client = server.available();

   //LANからの読み取りが可能であれば、読み取った結果をCOMで送信
  if (client.available() != 0)
  {
    char cClient = client.read();
    Serial.print(cClient);
  }

  //COMからの読み取りが可能であれば、読み取った結果をLANで送信
  if(Serial.available() > 0)
  {
    char cCOM = Serial.read();
    server.print(cCOM);
  }

}
結果

Teratermを2つ起動して確認します。
1つはW5100S-EVB-Pico のCOM用でClientとして起動させます。
もう一つはT-LITE + W5500のCOM用でServerとして起動させます。

T-LITE側のCOMターミナルから入力した文字は、W5100S-EVB-Pico側に表示されます。
W5100S-EVB-Pico側のCOMターミナルから入力した文字は、T-LITE側に表示されます。

応用

そのほかのマイコン基板

W5500はT-Liteとはピンヘッダとピンソケットで直接合体できるモジュールです。
SPIの使用できるモジュールであれば、W5500と接続してEther接続することができます。

代表としてFREENOVE ESP8266、ESP32-Pico-KIT、Raspberry Pi Pico-BOOTを掲載します。
これら以外の基板は、同じ系統のCPUを使用している場合の改変箇所を載せるので参考にしてください。

FREENOVE ESP8266(他 ESP8266, D1, WROOM02)

説明

SPIピン変更のできない基板では、CSピンのみ指定して実行します。
ピン配置は各基板のピン配置に従い配線します。

配線

サンプルとしてFREENOVEのESP8266で接続します。
SPIですが、RESETとDCを接続しなくても動作します。

ESP8266配線W5500
3.3VVIN
GNDGND
GPIO15(CS)CS
GPIO13(MOSI)MO(MOSI)
GPIO16(MISO)MI(MISO)
GPIO14(SCK)SCLK(CLK)
スケッチ

ESP8266とW5500をTCP Client、W5100S-EVB-PicoをTCP Serverで通信するスケッチ
ESP8266、D1、WROOM02で使用できると思います。(未確認)

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP32-D1, WROOM02系

【スケッチの説明】
W5500を使用します。
Telnet ClientとしてTelenet Serverと通信します。
接続先サーバは 192.168.1.200/24, Port 5000

COMから読み取った文字をServerへ送信します。
Serverから読みとった文字をCOMへ送信します。

【ライブラリ】
esp32 ESP32 Dev Module
Ethernet Library for Arduino

【バージョン情報】
2022/12/12 : 新規
2022/12/24 : ESP32 D1, WROOM02 デフォルトピンを使用する。
**********************************************************************/

#include <SPI.h>
#include <Ethernet.h>

//SPI CSピンの設定
#define PIN_CS 15      //CS


//Mac アドレスと ローカルIPアドレスの設定
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);                       //たまねぎブログの紹介記事により TCP Client側は 192.168.1.100としています。

IPAddress server(192, 168, 1, 200);                   //接続先のサーバIP 
#define PORTNO 5000                                   //接続先サーバポート番号

EthernetClient client;

void setup() {

  Ethernet.init(PIN_CS);                              // T-LITE の CS

  Ethernet.begin(mac, ip);                            // Ethernet 接続開始

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

  //Ethernetシールド確認
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }

  //接続ができるまで待機
  while (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
    delay(500);
  }

  delay(1000);
  Serial.println("connecting...");

  //サーバー側との接続
  if (client.connect(server, 5000)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{

  //LANからの読み取りが可能であれば、読み取った結果をCOMで送信
  if (client.available() != 0)
  {
    char cClient = client.read();
    Serial.print(cClient);
  }

  //COMからの読み取りが可能であれば、読み取った結果をLANで送信
  while (Serial.available() > 0)
  {
    char cCOM = Serial.read();
    if (client.connected() == true)
    {
      client.print(cCOM);
    }
  }

  // サーバから切断された場合、ポーリング待機
  if (client.connected() == false) 
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    // do nothing:
    while (true)
    {
      delay(1);
    }
  }
}

ESP32-PICO-KIT(他 ESP32-WROOM, D4, S2, S3)

説明

SPIピンの変更ができるESP系では、CS, MOSI, MISO, SCK をSPI.begin()でピン指定して実行します。

配線

サンプルとしてESP32-PICO-KITで接続します。
SPIですが、RESETとDCを接続しなくても動作します。

ESP32-PICO-KIT配線W5500
3.3VVIN
GNDGND
GPIO25(CS)CS
GPIO32(MOSI)MO(MOSI)
GPIO26(MISO)MI(MISO)
GPIO33(SCK)SCLK(CLK)
スケッチ

ESP32-PICO-KITとW5500をTCP Client、W5100S-EVB-PicoをTCP Serverで通信するスケッチ
ESP32-WROOM, D4, C3, S2, S3 で使用できると思います(未確認)

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】

【スケッチの説明】
W5500を使用します。
Telnet ClientとしてTelenet Serverと通信します。
接続先サーバは 192.168.1.200/24, Port 5000

COMから読み取った文字をServerへ送信します。
Serverから読みとった文字をCOMへ送信します。

【ライブラリ】
esp32 ESP32 Dev Module
Ethernet Library for Arduino

【バージョン情報】
2022/12/12 : 新規
2022/12/24 : ESP32 D4(WROOM32), C3, S2, S3でSPI変更しての動作確認
**********************************************************************/

#include <SPI.h>
#include <Ethernet.h>

//SPIピンをデフォルトから変更する場合
#define PIN_CS 25      //CS
#define PIN_MOSI 32   //MOSI
#define PIN_MISO 26   //MISO
#define PIN_SCK 33    //SCK


//Mac アドレスと ローカルIPアドレスの設定
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);                       //たまねぎブログの紹介記事により TCP Client側は 192.168.1.100としています。

IPAddress server(192, 168, 1, 200);                   //接続先のサーバIP 
#define PORTNO 5000                                   //接続先サーバポート番号

EthernetClient client;

void setup() {

  //SPIピンをデフォルトから変更する場合(ESP系 (D4, WROOM32, C3, S2, S3))
  SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS);

  Ethernet.init(PIN_CS);                              // T-LITE の CS

  Ethernet.begin(mac, ip);                            // Ethernet 接続開始

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

  //Ethernetシールド確認
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }

  //接続ができるまで待機
  while (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
    delay(500);
  }

  delay(1000);
  Serial.println("connecting...");

  //サーバー側との接続
  if (client.connect(server, 5000)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{

  //LANからの読み取りが可能であれば、読み取った結果をCOMで送信
  if (client.available() != 0)
  {
    char cClient = client.read();
    Serial.print(cClient);
  }

  //COMからの読み取りが可能であれば、読み取った結果をLANで送信
  while (Serial.available() > 0)
  {
    char cCOM = Serial.read();
    if (client.connected() == true)
    {
      client.print(cCOM);
    }
  }

  // サーバから切断された場合、ポーリング待機
  if (client.connected() == false) 
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    // do nothing:
    while (true)
    {
      delay(1);
    }
  }
}

Raspberry Pi Pico BOOT(他 RP2040)

説明

SPI0ピンをGPIOピンから使用できるRP2040系では、CS, MOSI, MISO, SCK を

SPI.setCS(PIN_CS);
SPI.setTX(PIN_MOSI);
SPI.setRX(PIN_MISO);
SPI.setSCK(PIN_SCK);

でピン指定して実行します。

配線

サンプルとしてFREENOVEのESP8266で接続します。
SPIですが、RESETとDCを接続しなくても動作します。

Raspberry Pi Pico BOOT配線W5500
3.3VVIN
GNDGND
GPIO1(CS)CS
GPIO3(MOSI)MO(MOSI)
GPIO0(MISO)MI(MISO)
GPIO2(SCK)SCLK(CLK)
スケッチ

Raspberry Pi Pico BOOT とW5500をTCP Client、W5100S-EVB-PicoをTCP Serverで通信するスケッチです。
他SPI0をGPIOピンで使用できるRP2040搭載基板で使用できると思います(未確認)

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP32-D1, WROOM02系

【スケッチの説明】
W5500を使用します。
Telnet ClientとしてTelenet Serverと通信します。
接続先サーバは 192.168.1.200/24, Port 5000

COMから読み取った文字をServerへ送信します。
Serverから読みとった文字をCOMへ送信します。

【ライブラリ】
esp32 ESP32 Dev Module
Ethernet Library for Arduino

【バージョン情報】
2022/12/12 : 新規
2022/12/24 : RP2040 SPI0デフォルトピンを変更して使用する。
**********************************************************************/

#include <SPI.h>
#include <Ethernet.h>

//SPI CSピンの設定
#define PIN_CS 1      //CS
#define PIN_MOSI 3    //MOSI
#define PIN_MISO 0    //MISO
#define PIN_SCK 2     //SCK

//Mac アドレスと ローカルIPアドレスの設定
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);                       //たまねぎブログの紹介記事により TCP Client側は 192.168.1.100としています。

IPAddress server(192, 168, 1, 200);                   //接続先のサーバIP 
#define PORTNO 5000                                   //接続先サーバポート番号

EthernetClient client;

void setup() {

  //RP2040系でSPIピン変更をする場合
  SPI.setCS(PIN_CS);
  SPI.setTX(PIN_MOSI);
  SPI.setRX(PIN_MISO);
  SPI.setSCK(PIN_SCK);

  Ethernet.init(PIN_CS);                              // T-LITE の CS

  Ethernet.begin(mac, ip);                            // Ethernet 接続開始

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

  //Ethernetシールド確認
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }

  //接続ができるまで待機
  while (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
    delay(500);
  }

  delay(1000);
  Serial.println("connecting...");

  //サーバー側との接続
  if (client.connect(server, 5000)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{

  //LANからの読み取りが可能であれば、読み取った結果をCOMで送信
  if (client.available() != 0)
  {
    char cClient = client.read();
    Serial.print(cClient);
  }

  //COMからの読み取りが可能であれば、読み取った結果をLANで送信
  while (Serial.available() > 0)
  {
    char cCOM = Serial.read();
    if (client.connected() == true)
    {
      client.print(cCOM);
    }
  }

  // サーバから切断された場合、ポーリング待機
  if (client.connected() == false) 
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    // do nothing:
    while (true)
    {
      delay(1);
    }
  }
}

コメント

タイトルとURLをコピーしました