본문 바로가기

RaspberryPi/W55RP20

[W55RP20-4032] W55RP20 Arduino - iperf를 이용한 이더넷 전송률 테스트

W55RP20 의 Arduino 환경에서 이더넷은 현재 lwIP 만지원하고 있다. RP2040 Pi-pico SDK 환경에서는 이더넷 전송률이 25Mbps로 상당히 빠르게 측정이 되었지만 Arduino 환경에서는 속도가 느릴것 같다.

이전 테스트에서 RP2040 Arduino 환경에서 W5500 네트웍 전송률은 상당히 느려서 라이브러리를 변경해서 속도를 높일 수 있었다.

https://nexp.tistory.com/3868

 

[RP2040_W5500] Arduino IDE에서 Iperf TCP Throughput 측정 테스트 (Ethernet_Generic 라이브러리 수정)

RP2040 C++ SDK 환경에서 iperf 전송율 테스트 결과 전송 속도는 잘 나오지만 웹서버를 위한 라리브러리가 불편한점이 많다. [RP2040_W5500] RP2040 C++ SDK 환경에서 iperf 를 이용한 W5500 TCP 전송률 테스트 . Ard

nexp.tistory.com

 

 

우선 Arduino 환경에서 lwIP 스택의 iperf 전송률을 측정해 보자.

#include <W55RP20lwIP.h>

const uint16_t port = 5001;

Wiznet55rp20lwIP eth(20 /* chip select */);
WiFiServer server(5001);

void setup() {
  Serial.begin(115200);
  delay(5000);
  Serial.println();
  Serial.println();
  Serial.println("Starting Ethernet port");

  // Start the Ethernet port
  if (!eth.begin()) {
    Serial.println("No wired Ethernet hardware detected. Check pinouts, wiring.");
    while (1) {
      delay(1000);
    }
  }

  while (!eth.connected()) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("Ethernet connected");
  Serial.println("IP address: ");
  Serial.println(eth.localIP());

  server.begin();
}


byte buf[2048];  
void loop() {
  static bool wait = false;
  
  unsigned int len = 0;

  // Use WiFiClient class to create TCP connections
  WiFiClient client;

  client = server.available();

  if (client)
  {
    Serial.println("Here is new client for check arduino performance");
  
    while (client.connected())
    {
      len = client.available();
      if (len)
      {
       client.read(buf, len);
      }
    }
    // close the connection:
    client.stop();

    Serial.println("client disonnected");
  }
}

 

 

최종 테스트 결과 W55RP20 Arduino lwIP 환경에서 iperf TCP 전송률은 2Mbps 정도 된다.

 

이정도는 44khz 오디오 전송은 가능하긴 하지만 24bit 고음질 오디오나 96khz 음질의 오디오 전송에는 문제가 있을것 같다.

아무래도 RP2040 C/C++ SDK 개발환경 에서 테스트 해볼 필요가 있을것 같다.

 

lwIP 는 W55RP20의 전체 하드웨어 TCP 스텍을 사용하는 것이 아니라 MAC RAW 모드로 소프트웨어 스택을 사용하기 때문에 아무래도 속도가 느려지는것 같다. (그래도 10배 차이는 좀 심한것 같지만...)

아무튼 W55RP20의 네트웍 속도는 W5500의 H/W TCP스택을 사용해야 정상 속도가 나오기 때문에 고음질의 네트웍 스피커를 제작 하려면 C/C++ SDK로 개발하거나 W55RP20의 아두이노 드라이버를 사용하는것이 좋을것 같다.

 

참고로 W55RP20의 Arduino 지원 lwIP 라이브러리 코드는 아래 폴더에 위치해 있다.

AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\5.6.0\libraries\lwIP_w55rp20


네트웍 스피커는 기본적으로 마스터에서 멀티캐스트 기능을 지원해야 하므로 UDP 통신으로 구성해야 할것 같다.

 

UDP 에서 iperf 전송률 테스트를 해보자

#include <W55RP20lwIP.h>

const uint16_t port = 5001;
Wiznet55rp20lwIP eth(20 /* chip select */);

IPAddress ip(192, 168, 1, 104);
IPAddress subnet(255, 255, 254, 0);
IPAddress gateway(192, 168, 1, 1);

WiFiUDP udp;

void setup() {
  Serial.begin(115200);
  delay(5000);
  Serial.println();
  Serial.println();
  Serial.println("Starting Ethernet port");

  eth.config(ip, gateway, subnet);

  // Start the Ethernet port
  if (!eth.begin()) {
    Serial.println("No wired Ethernet hardware detected. Check pinouts, wiring.");
    while (1) {
      delay(1000);
    }
  }

  while (!eth.connected()) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("Ethernet connected");
  Serial.println("IP address: ");
  Serial.println(eth.localIP());

  udp.begin(port);
  Serial.print("Listening for UDP iperf on port ");
  Serial.println(port);
}

byte buf[2048];  
unsigned long lastPacketTime = 0;
bool isTesting = false;

void loop() {
  int packetSize = udp.parsePacket();
  
  if (packetSize > 0) {
    if (!isTesting) {
      isTesting = true;
      Serial.println("\n[알림] UDP iperf 테스트 시작 (데이터 수신 중...)");
    }
    lastPacketTime = millis();

    int bytesToRead = packetSize;
    if (bytesToRead > sizeof(buf)) {
      bytesToRead = sizeof(buf);
    }

    udp.read(buf, bytesToRead);
  }

  if (isTesting && (millis() - lastPacketTime > 2000)) {
    isTesting = false;
    Serial.println("[알림] UDP iperf 테스트 종료 (대기 상태)");
  }
}

 

 

 

W55RP20 Arduino lwIP 에서 UDP 전송률은 1Mbps 정도로 측정이 된다.

이정도면 Arduino에서는 네트워크로 WAV파일 송출이 불가능 한데...