マイコンから有線LAN通信を行うためのモジュールです。
pico-ETH-CH9121の通信設定をするアプリケーション、TCP Server/TCP Clientにして電文通信をした内容を記事にしました
pico-ETH-CH9121
簡単紹介
マイコン同士、またはマイコンとパソコンをLANケーブルで接続し、電文通信ができるモジュールです。
簡単なモジュールのセットアップの後はUART制御で実現できるモジュールです。
| 駆動電圧 | 3.3 / 5V |
| UART TTL | 3.3 / 5V |
| 通信モード | TCP/UDP |
| 通信速度 | 300 – 921.6Kbps |
入手
マルツ、スイッチサイエンス、AliExpressで入手できます。
ピン配置

UART TXとRXはタスキ掛けです。
マイコン側のTXをpico-ETH-ch9121のRXに、マイコン側のRXをpico-ETH-ch9121のTXに接続します。
外観

使ってみた
開発
Raspberry Pi Picoと合体して使いました。
開発環境はArduino、ボードライブラリは使いません。
あらかじめpico-ETH-CH9121にServer、またはClientとしてのネットワーク設定をします。
ネットワーク設定をするためにWaveshareの専用アプリケーションが必要で、セキュリティメッセージが表示されるので少し警戒気味になります。
必要な準備はこちらに記載しました。
Arduino環境上での開発はpico-ETH-CH9121を初期化する処理します。
スケッチはUARTプログラミングを記述することでLANによるソケット通信ができます。
合体
Raspberry Pi Picoとの合体が前提のピン配置になっているため、合体後の一体感は高めです。
Raspberry Pi PicoのすべてのGPIO端子はpico-ETH-CH9121のソケットと接続しますが、モジュールに使われているピンソケットの端子が長いので、合体後も一部のピンを除きRaspberry Pi PicoのGPIOを使用できます。

電源とGNDが配置互換で、Raspberry Pi PicoのUART0(TX = GP0, RX = GP1)に、UARTピンを設定できればマイコンが違っても使用できました。
通信
Raspberry Pi Picoとpico-ETH-CH9121をTCP Serverにしてパソコンと通信しました。
マイコン側で読み取ったセンサー情報をパソコンで読み取ったり、マイコンに接続したアクチュエータをパソコンからリモート制御したりできます。
下図はパソコンからマイコンのCPU温度をLAN経由で読み取っている様子です。
Raspberry Pi Picoとpico-ETH-CH9121を2セット使い、TCP ServerとTCP Clientの組み合わせで双方向通信をしました。
Arduinoのスケッチ上ではServer側でもClient側でも同じUARTスケッチで動作しました。
下図はマイコン同士で通信できていることを確認するために、パソコンからパソコンにpico-ETH-CH9121を経由して通信している様子です。
過去の記事では、WiznetのW5100S-EVB-Pico/W5500-EVB-Picoを使ったTCP ソケット通信を紹介しています。
W5100-EVB-Pico/W5500-EVB-Picoとも通信できました。
ServerとClientの組み合わせであれば通信できます。
今回Raspberry Pi Picoと電源系ピンが互換のWaveshare製 ESP32-S3-Picoを使ってみましたが、UARTとCFG, RSTピンを同じ位置に設定することで同じTCP/IP通信ができました。

形状の違いマイコンボードでもジャンパワイヤなどでUART、CFG、RSTピンを配線することで使用できそうです。
まとめ
パソコンとマイコンをLANケーブルでつないで通信できました。
電文を工夫するとマイコンからサンプリングデータをリアルタイムで読み取ったり、マイコンに命令を出してアクチュエータを制御したりできます。
マイコン同士をLANケーブルで接続することでマイコン同士の連携もできます。
pico-ETH-CH9121はLAN通信部分はあらかじめ設定アプリケーションにより設定しておくことでマイコン側は通信部分をUARTで記述するだけなのでスケッチの負担は小さくなりました。
無線と比べるとLANケーブルの取り回しに煩わしさがあり、手軽さはありません。
反対に無線のように電波状態による不安定さはなく、安定した通信を担保できる安心感があります。
準備
◆開発環境
Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
◆ボードライブラリ
Raspberry Pi Picoを使用します。
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。
| 追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
| 検索 | RP2040 |
| ボードライブラリ | Raspberry Pi RP2040 Boards(x.x.x)※ |
| 選択するボード | Raspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico |
◆モジュールライブラリ
ArduinoIDE、Githubなどからインストールするライブラリはありません。
以前は以下メーカーサイトからArduino用ライブラリが使用できましたが現在同梱されていません。
「pico-ETH-CH9121 スケッチ」に設定アプリケーションおよび、サーバ、クライアントに使用できるサンプルを用意しました。
pico-ETH-CH9121のサンプルプログラム(外部サイトへのリンク)
◆合体とケーブル接続
パソコンからの有線はUSB-LAN変換アダプタ(EDC-FUA2-W(ELECOM))を使いました。
(パソコンの有線LANコネクタから直接LANケーブルを使うこともできます)
pico-ETH-CH9121とRaspberry Pi Picoをドッキングさせます。
USB-LAN変換アダプタとpico-ETH-CH9121をLANケーブルで接続します。
Raspberry Pi Pico とパソコンをUSBケーブルで接続します。

◆通信設定(pico-ETH-CH9121側)
pico-ETH-CH9121をTCP ServerまたはTCP Clientとして使うかの設定と、ネットワーク設定をします。
注意
この設定を行うためにはアドミニストレータ権限が必要です。
また、セキュリティメッセージが表示されるので実行を継続する場合は自身のセキュリティポリシーに従い自己責任で行ってください。
手順
1.uf2ファイルのダウンロードとRaspberry Pi Picoのセットアップ
2.pico-ETH-CH9121設定アプリのダウンロードとネットワーク設定
1.uf2ファイルのダウンロードRaspberry Pi Picoのセットアップ
pico-ETH-CH9121をネットワーク上で認識させる準備をします。
サンプルプログラムとコンパイル済みスケッチをダウンロードし、Raspberry Pi Picoに書き込みます。
pico-ETH-CH9121のサンプルプログラム(外部サイトへのリンク)をダウンロードします。
(中国 Waveshareサイト : https://www.waveshare.com/wiki/Pico-ETH-CH9121)
ダウンロードした圧縮ファイルを解凍します。
Raspberry Pi PicoのBOOTボタンを押しながらRaspberry Pi Picoに電源供給します。
パソコンにストレージ認識されたら解凍したフォルダの「RX_TX.uf2」をRaspberry Pi Picoにドラッグ&ドロップします。
RX_TX.uf2フォルダ : (解凍フォルダ)\pico_ETH_CH9121_CODE\C\RX_TX\uf2\pico
フォルダ構成はメーカーが変更することがあります。

この作業をすることで次の設定アプリケーションがpico-ETH-CH9121を認識できます。
2.pico-ETH-CH9121設定アプリのダウンロードとネットワーク設定
pico-ETH-CH9121の設定アプリケーション(外部サイトへのリンク)をダウンロードします。
(中国 Waveshareサイト : https://www.waveshare.com/wiki/Pico-ETH-CH9121)
ダウンロードしたファイルを展開し、アプリケーションを起動します。
アプリケーションフォルダ : (解凍フォルダ)\Configuration_software
アプリケーション名 : NetModuleConfig.exe
注意
この設定を行うためにはアドミニストレータ権限が必要です。
また、セキュリティメッセージが表示されるので実行を継続する場合は自身のセキュリティポリシーに従い自己責任で行ってください。

Raspberry Pi Picoとpico-ETH-CH9121を合体させた状態で、Raspberry Pi Picoに給電します。
pico-ETH-CH9121はLANケーブルでパソコンと接続します。
(今回はパソコンにUSB-LAN変換アダプタを使っています)
アプリケーション起動後は下図手順により、pico-ETH-CH9121を認識させます。

「Module List (Double Click to get configuration)」に設定アプリケーションが認識したpico-ETH-CH9121がリストされます。
ダブルクリックすることで保存されている設定を読み出します。
本記事での動作では、Raspberry Pi Picoとpico-ETH-CH9121の組み合わせを2セット使い、片方をTCP Server 、もう片方をTCP Clientにして双方向の電文通信をします。
それぞれの設定は下図、表を参照します。
左図がTCP Server側、右図がTCP Clientの設定です。
値を入力したら右下の「SET ALL」ボタンをクリックします。

各項目の設定リストです。
※番号の値はServer側とClient側で完全一致している必要があります。
「Basic」に設定する内容
| TCP Serverにする設定 | TCP Clientにする設定 | |
|---|---|---|
| DHCP | レ点無し | レ点無し |
| IP | 192.168.1.200※1 | 192.168.1.100※2 |
| Mask | 255.255.255.0 | 255.255.255.0 |
| GateWay | 192.168.1.100※2 | 192.168.1.200※1 |
| Serial Nego | レ点無し | レ点無し |
「Port 1」タブに設定する内容
| TCP Serverにする設定 | TCP Clientにする設定 | |
|---|---|---|
| Mode | TCP SERVER | TCP CLIENT |
| Local Port | 5000※3 | 5000 |
| Conn Type | IP | IP |
| Dest IP | 192.168.1.100 | 192.168.1.200※2 |
| Dest Port | 5000 | 5000※3 |
| Baud | 115200 | 115200 |
| Data Bit | 8 | 8 |
| Stop Bit | 1 | 1 |
| Parity | None | None |
| Conn Lost | レ点有り | レ点有り |
| Pack Len | 1024 | 1024 |
| Pack TimeOut | 0 | 0 |
| Reconnect | レ点無し | レ点無し |
通信設定(パソコン側)
パソコンをTCP Client、pico-ETH-CH9121をTCP ServerとしたLAN通信をするための設定です。
パソコンとマイコンのLAN通信をさせない場合は不要です。
pico-ETH-CH9121は、「通信設定(pico-ETH-CH9121側)」により、TCP Serverの設定をします。
パソコン側はネットワーク接続から通信に使うネットワークアダプタの設定変更をします。
今回USB-LANアダプタを使用します。
重要
ネットワーク設定の変更にはAdministrator権限が必要です。
ネットワークの変更をすることでネット接続できなくなる問題が発生することがあります。

pico-ETH-CH9121 スケッチ
Raspberry Pi Picoを使ったTCP Server/Client
◆説明
pico-ETH-CH9121の初期化とLANでのTCP/IPソケット通信をします。
スケッチ上の通信箇所は特別な工夫の無いUARTスケッチです。
USBシリアルが受信したデータをUART0に送信します。
UART0が受信したデータをUSBシリアルに送信します。
このスケッチはpico-ETH-CH9121のServer側でもClient側でも共通で使用できます。
◆スケッチ
#define UART0_TX (D0)
#define UART0_RX (D1)
#define CH9121_CONFIG (D14)
#define CH9121_RESET (D17)
void initCH9121(void)
{
pinMode(CH9121_CONFIG, OUTPUT);
pinMode(CH9121_RESET, OUTPUT);
digitalWrite(CH9121_CONFIG, HIGH);
digitalWrite(CH9121_RESET, LOW);
digitalWrite(CH9121_CONFIG, LOW);
delay(100);
digitalWrite(CH9121_CONFIG, HIGH);
digitalWrite(CH9121_RESET, HIGH);
}
void setup()
{
initCH9121();
Serial.begin(115200);
Serial1.setTX(UART0_TX);
Serial1.setRX(UART0_RX);
Serial1.begin(115200);
}
void loop()
{
char buf = 0;
if(Serial.available())
{
buf = Serial.read();
Serial1.write(buf);
}
if(Serial1.available())
{
buf = Serial1.read();
Serial.write(buf);
}
}◆結果(パソコンとTCPサーバーの通信)
pico-ETH-CH9121をTCP Serverにする設定によりTCP Serverにします。
スケッチを書き込み再起動した後に、Teraterm を使いpico-ETH-CH9121とTCP/IP接続、Raspberry Pi PicoとUSBシリアル接続をします。
下図左はサーバー側(pico-ETH-CH9121側)のIP 192.168.1.200、Port 5000を接続、数右はRaspberry Pi Pico側(USBシリアル)COM12を接続する例です。

下図は接続図と文字列送受信の結果です。
結果1ではTeraterm左(USB-LANアダプタ)から送信した文字列をTeraterm右(USBシリアル)が受信した結果です。
”Hello world” + Enterキーを押すことでまとめて送信しました。
結果2ではTeraterm右(USBシリアル)から送信した文字列をTeraterm左(USB-LANアダプタ)が受信した結果です。
“tamanegi blog”を入力すると一文字ずつ送信しました。

USB-LANアダプタとpico-ETH-CH9121の間をLANケーブルで通信することで、パソコンとマイコンをLANで通信できることが分かりました。
◆結果(マイコン同士のとTCP/IP通信)
Raspberry Pi Picoとpico-ETH-CH9121の組み合わせを2セット使います。
pico-ETH-CH9121をTCP Serverにする設定により、1セットはTCP Server、1セットはTCP Clientにします。
Raspberry Pi Picoに書き込むスケッチは2セットともに同じ「パソコンとTCP Serverの通信」で使用したスケッチを使用します。
この接続で左側のセットはCOM12、右側のセットはCOM5で認識されました。
Teraterm左(COM12)側から入力した”tamanegi”がTeraterm右(COM5)側に受信されました。
Teraterm右(COM5)側から入力した” BLOG”がTeraterm左(COM12)側で受信されました。
ServerとClientともに意識することなく通信できました。

ESP32-S3-Picoを使ったTCP Server
◆説明
「Raspberry Pi Picoを使った TCP Server/Client」をESP32-S3-Picoにアレンジしたものです。
ESP32-S3では、任意の位置にUART1を設定できるため、Raspberry Pi PicoのデフォルトUART0位置に割り当てます。
USBシリアルが受信したデータをUART0に送信します。
UART0が受信したデータをUSBシリアルに送信します。
このスケッチはpico-ETH-CH9121のServer側でもClient側でも共通で使用できます。
◆スケッチ
#define UART0_TX (11)
#define UART0_RX (12)
#define CH9121_CONFIG (39)
#define CH9121_RESET (41)
void initCH9121(void)
{
pinMode(CH9121_CONFIG, OUTPUT);
pinMode(CH9121_RESET, OUTPUT);
digitalWrite(CH9121_CONFIG, HIGH);
digitalWrite(CH9121_RESET, LOW);
digitalWrite(CH9121_CONFIG, LOW);
delay(100);
digitalWrite(CH9121_CONFIG, HIGH);
digitalWrite(CH9121_RESET, HIGH);
}
void setup()
{
initCH9121();
Serial.begin(115200);
Serial1.begin(115200, SERIAL_8N1, UART0_RX, UART0_TX);
}
void loop()
{
char buf = 0;
if(Serial.available())
{
buf = Serial.read();
Serial1.write(buf);
}
if(Serial1.available())
{
buf = Serial1.read();
Serial.write(buf);
}
}◆結果(パソコンとTCPサーバーの通信)
pico-ETH-CH9121をTCP Serverにする設定によりTCP Serverにします。
使用するマイコンとスケッチ以外の作業はRaspberry Pi Picoを使ったTCPサーバーと同じです。
下図はWaveshareのESP32-S3-picoを使用した時の様子です。
通信の結果は省略しますが、Raspberry Pi Picoを使った時と同じ結果が得られました。
電源系がRaspberry Pi Picoと互換マイコン基板を変えても使用するUARTやRESET, CFGを同位置に設定することで使えることが分かりました。





コメント