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に合体してもピンヘッダを使用できる状態にする、ピンソケットの半田付けと加工を紹介しています。
ピン配置
![](http://tamanegi.digick.jp/wp-content/uploads/2022/11/ethernethat-pin-off.jpg)
Ethernet HATを使用する場合、ピン配置に基づいてRaspberry Pi PicoのSPI0を使用します。
外観
外観はピンソケットを取り付けています。
通常のピンソケットを取り付けるとRaspberry Pi PicoのほかのGPIOが使用できなくなってしまうので、ロングピンのソケットを加工しています。(加工は後日掲載予定)
![](http://tamanegi.digick.jp/wp-content/uploads/2022/11/EthernetHAT-top.jpg)
![](http://tamanegi.digick.jp/wp-content/uploads/2022/11/EthernetHAT-back.jpg)
使ってみて
簡単に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ファイルをダウンロード。
![](http://tamanegi.digick.jp/wp-content/uploads/2022/10/W5100SEVBPICO-DL1-1024x635.png)
2. Arduino IDEからZipファイルのライブラリをインストールする。
![](http://tamanegi.digick.jp/wp-content/uploads/2022/10/ZIPLibrary-Install.png)
3.ファイル選択のブラウザで、ダウンロードしたZipファイルを選択する。
使うもの
絵 | 名称(型番) | 用途 |
---|---|---|
![]() | Ethernet HAT | 今回の主役 ピンソケット加工済み |
![]() | Raspberry Pi Pico | Ethernet HATを動かすマイコン |
![]() | W5100S-EVB-PICO | TCP 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側に表示されます
コメント