LoginSignup
1
0

Micropython: PICO EthernetをHardWired TCP/IPでブーストしよう!

Last updated at Posted at 2024-03-15

Micropythonを使用してイーサネットを高速化する方法の紹介です。

まず、このような速度向上は、WIZnetチップを搭載したpicoでのみ可能です。WIZnetイーサネットチップ(W5100SまたはW5500)には、HardWiredとLWIPの2つのモードがあることをご存知ですか?

HardWiredモードで動作させることにより、ネットワークの物理層タスクがMCUではなくイーサネットチップ上で実行され、ネットワーク速度とMCUの効率が向上します。

image.png

速度を向上させる他の多くの方法があり、さらなる強化も可能ですが、

今はとりあえずハードワイヤードモード設定を確認しましょう。

結果を見てみましょう!

image.png
default F/W (747 Kbits/sec) => custom F/W (1.34 Mbits/sec)
約74%の改善!!

ここで、FWを作成し、iperf3を使用してテストする方法を紹介します。

FW Build

コードをダウンロードする場所は、公式のmicropython GitHubリポジトリです。

https://github.com/micropython/micropython

コードをダウンロードした後、HardWiredモードに設定します。

変更する部分はmakeファイルの1行だけです。

micropython/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.cmake

4行目で、LWIP設定を無効にします。

set(MICROPY_PY_LWIP 0) #set(MICROPY_PY_LWIP 1)

ビルドを進めましょう。

ビルド方法はmicropython gitのREADME.mdによく説明されています。

https://github.com/micropython/micropython/blob/master/ports/rp2/README.md

例としてPico Wが使用されていますが、W5100S-EVB-PICOまたはW5500-EVB-PICOを使用しているため、そこに記載されているコマンドをわずかに変更する必要があります。

image.png

#W5100S-EVB-PICO
$ make BOARD= W5100S_EVB_PICO submodules
$ make BOARD= W5100S_EVB_PICO clean
$ make BOARD= W5100S_EVB_PICO
# W5500-EVB-PICO
$ make BOARD= W5500-EVB-PICO submodules
$ make BOARD= W5500_EVB_PICO clean
$ make BOARD= W5500_EVB_PICO

Speed Test

改善が実際にあるかを確認する必要がありますね。私は通常iperf3を使用します。

まず、iperf3ライブラリを追加してインポートします。ここからライブラリをダウンロードできます:

https://github.com/micropython/micropython-lib/blob/master/python-ecosys/iperf3/iperf3.py

以下の例を使用してください。

次のgitリポジトリからダウンロードできます。

https://github.com/wiznetmaker/Hard_wired_WIZNET5K-Micropython/tree/main/examples/iperf3_test

定義されたネットワーク情報とサーバーIPを変更してください。サーバーIPはテストPCのIPです。

import machine
import network
import uiperf3

SERVER_IP = "192.168.11.100" # テストPCのIP
DEVICE_IP = "192.168.11.101"
GATEWAY = "192.168.11.1"
NETMASK = "255.255.255.0"
DNS = "8.8.8.8"
def wiznet_init():
    spi = machine.SPI(0, baudrate=2000000, mosi=machine.Pin(19), miso=machine.Pin(16), sck=machine.Pin(18))
    nic = network.WIZNET5K(spi, machine.Pin(17), machine.Pin(20))
    nic.active(True)
    nic.ifconfig((DEVICE_IP, NETMASK, GATEWAY, DNS))
    
    print('IP address :', nic.ifconfig())
    
def main():
    wiznet_init()
    uiperf3.client(SERVER_IP)

さらに、PC上にiperf3を設定してください。

ここからiperf3をダウンロードしてください。(私はバージョン3.1.3を使用しました。)

https://iperf.fr/iperf-download.php

インストール後、インストールディレクトリからコマンドプロンプトを開き、サーバー操作コマンドを入力してください:

iperf3.exe -s

動作しない場合は、ファイアウォールを確認してください。

image.png

LWIPが正確に有効/無効になっているかを確認するために、ログを追加しました。
/extmod/network_wiznet5k.cファイルには、WIZnetチップを初期化する機能があります。
(参考までに、WIZNET5Kに関連する機能を変更したい場合、このコードを変更できます。)

分岐は、WIZNET5K_WITH_LWIP_STACKのdefineに基づいて発生します。

LWIP_STACKが有効になっている場合、左側のコード(行173)が実行され、
無効になっている場合は右側のコード(行351)が実行されます。

image.png

公式のMicroPythonリポジトリにこの変更をプルリクエストとして提出する予定です。

これが受け入れられることを願っています。そうなれば、より速いネットワークの恩恵を全員が享受できるでしょう。

さらに、基本的なMicroPythonの例が必要な場合は、WIZnetの公式gitリポジトリにある例を使用してみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0