初试 W5500 模块给 Arduino 增加 Ethernet 功能

目录 Content
[hide]

网络上常见的 Arduino Ethernet 通讯例子使用的是基于 W5100 芯片的 Ethernet Shield,不过 W5100 存在功耗大的缺点,现在可被 W5500 取代,但是采用 W5500 芯片的 Shield 价格比Arduino本身都贵,本着电子产品买新不买旧的原则,LT 最终选了 W5500 模块,不过呢,并不能直接使用官方 IDE 自带的 Ethernet 库。

一、问题背景

官方的 Ethernet 库 只是针对 W5100 Ethernet Shield 的,如果直接使用,你就会发现是驱动不起来 W5500 模块的。官方的 Ethernet Shield 长这样:

而卖家给的 W5500 模块 的例程都是STM32、51的,没法借鉴。

二、解决方案

使用 WIZ_Ethernet_Library 替换掉 Arduino IDE 自带的 Ethernet 库即可正常使用。

Arduino IDE 1.5.x
Download all files and replace the “\libraries\Ethernet\src” folder in your Arduino IDE. This will update the “utility” folder also under “\libraries\Ethernet\src”.

三、功能测试

连线如下:

W5500引脚   Arduino引脚
 SCK        D13
 MISO       D12
 MOSI       D11           
 CS         D10

 RST        RESET
 5V         5V
 GND        GND

网口直接与电脑网口连接。使用 example 代码 WebServer, IDE 1.8.0 和 IDE 1.6.3 测试通过,实测工作电流 120mA 左右。

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 02 Sept 2015
 by Arturo Guadalupi

 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

效果如图 :

扩展阅读

Leave a Reply

Your email address will not be published. Required fields are marked *