RaspberryPi PicoでEthernet通信 WIZnet Ethernet HAT(LAN通信モジュール)

コンピュータ、組み込み

LAN通信するためのモジュールとしてWIZnetのEthernet HATを入手しました。
マイコンボードRaspberry Pi Pico用で合体して使用するモジュールです。
Raspberry Pi Picoを使用して、TCP ClientとServerを動作させてみます。

紹介するもの

WIZnet Ethernet HAT

特徴

W5100sが搭載されていて、SPI通信で接続してEthernet通信をします。
Raspberry Pi Pico用に設計されていて、合体することで配線不要で使用できます。

Raspberry Pi Picoに合体してもピンヘッダを使用できる状態にする、ピンソケットの半田付けと加工を紹介しています。

ピン配置

Ethernet HATを使用する場合、ピン配置に基づいてRaspberry Pi PicoのSPI0を使用します。

外観

外観はピンソケットを取り付けています。
通常のピンソケットを取り付けるとRaspberry Pi PicoのほかのGPIOが使用できなくなってしまうので、ロングピンのソケットを加工しています。(加工は後日掲載予定)

使ってみて

簡単にLAN通信をすることができました。
Raspberry Pi Picoとの接続設計になっているので、接続後の外観もまとまりのあるすっきりしたものです。
このモジュールはRaspberry Pi Pico用に設計されていますが、SPIを使用することでそのほかの基板でも使用することができます。

同じWIZnetの製品にW5100S-EVB-PicoというRaspberry Pi Picoの基板にW5100Sを搭載したもの藻あります。
分割できるかEthernet HATにするか、一体型のW5100S-EVB-Picoにするかはお好みで。


UARTを使用してLAN通信を行う pico-ETH-CH9121 と、同じWIZnetのもっと小型のW5500を搭載したLAN通信モジュールW5500-LITEも紹介しているので参考にしてください。

準備

ライブラリ

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

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

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

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

使うもの

名称(型番)用途
Ethernet HAT今回の主役
ピンソケット加工済み
Raspberry Pi PicoEthernet HATを動かすマイコン
W5100S-EVB-PICOTCP Clientの紹介では、TCP Serverとして通信相手
TCP Serverの紹介では、TCP Clientとして通信相手
LANケーブル通信線
ブレッドボードマイコン基板だけでは軽いので
土台になってもらいます。

配線

ドッキングして使用するため配線不要。
パソコンとのUSB接続と、LANケーブルによる接続を行います。

サンプルスケッチ

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/

参考
Wiznet-Arduino Ethernetライブラリ
スケッチ例 > Ethernet > TelenetClient

【マイコン基板】
Raspberry Pi Pico + Ethernet HAT基板で使用できます。

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

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

【ライブラリ】
Raspberry Pi Pico/RP2040 > Raspberry Pi Pico

【バージョン情報】
2022/11/13 : 新規
**********************************************************************/
//Raspberry Pi Pico

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

//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                                   //接続先サーバポート番号

#define PIN_CS 17     //CS
#define PIN_RST 20    //RST
#define PIN_DC 21     //INT
#define PIN_MOSI 19   //TX
#define PIN_MISO 16   //RX
#define PIN_SCK 18    //SCK

EthernetClient client;

void setup() {
  Ethernet.init(PIN_CS);                                  // WIZnet W5100S-EVB-Pico の 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);
    }
  }
}
結果

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

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

TCP Server

説明

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


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

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

【マイコン基板】
Raspberry Pi Pico + Ethernet HAT基板で使用できます。

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

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

【ライブラリ】
Raspberry Pi Pico/RP2040 > Raspberry Pi Pico

【バージョン情報】
2022/11/13 : 新規
**********************************************************************/
//Raspberry Pi Pico

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

#define SOCKET_PORT    5000             // 接続ポート

#define PIN_CS 17     //CS
#define PIN_RST 20    //RST
#define PIN_DC 21     //INT
#define PIN_MOSI 19   //TX
#define PIN_MISO 16   //RX
#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()
{
  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つはRaspberry Pi Pico + EthernetHATのCOM用でServerとして起動させます。
もう1つはW5100S-EVB-Pico のCOM用でClientとして起動させます。

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

コメント

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