Micropythonを使用してイーサネットを高速化する方法の紹介です。
まず、このような速度向上は、WIZnetチップを搭載したpicoでのみ可能です。WIZnetイーサネットチップ(W5100SまたはW5500)には、HardWiredとLWIPの2つのモードがあることをご存知ですか?
HardWiredモードで動作させることにより、ネットワークの物理層タスクがMCUではなくイーサネットチップ上で実行され、ネットワーク速度とMCUの効率が向上します。
速度を向上させる他の多くの方法があり、さらなる強化も可能ですが、
今はとりあえずハードワイヤードモード設定を確認しましょう。
結果を見てみましょう!
default F/W (747 Kbits/sec) => custom F/W (1.34 Mbits/sec)
約74%の改善!!
ここで、FWを作成し、iperf3を使用してテストする方法を紹介します。
FW Build
コードをダウンロードする場所は、公式のmicropython GitHubリポジトリです。
コードをダウンロードした後、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
を使用しているため、そこに記載されているコマンドをわずかに変更する必要があります。
#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
を使用しました。)
インストール後、インストールディレクトリからコマンドプロンプトを開き、サーバー操作コマンドを入力してください:
iperf3.exe -s
動作しない場合は、ファイアウォール
を確認してください。
LWIPが正確に有効/無効になっているかを確認するために、ログを追加しました。
/extmod/network_wiznet5k.c
ファイルには、WIZnetチップを初期化する機能があります。
(参考までに、WIZNET5Kに関連する機能を変更したい場合、このコードを変更できます。)
分岐は、WIZNET5K_WITH_LWIP_STACK
のdefineに基づいて発生します。
LWIP_STACKが有効になっている場合、左側のコード(行173)が実行され、
無効になっている場合は右側のコード(行351)が実行されます。
公式のMicroPythonリポジトリにこの変更をプルリクエストとして提出する予定です。
これが受け入れられることを願っています。そうなれば、より速いネットワークの恩恵を全員が享受できるでしょう。
さらに、基本的なMicroPythonの例が必要な場合は、WIZnetの公式gitリポジトリにある例を使用してみてください。