欢迎光临
我们一直在努力

W5100网路扩展板 适用于Arduino平台

1. 产品图片

2. 产品购买地址
点我购买

3. 产品概述
Arduino Ethernet W5100网络扩展模块,可以使Arduino成为简单的Web服务器或者通过网络控制读写Arduino的数字和模拟接口等网络应用。可直接使用IDE中的Ethernet库文件便可实现一个简单Web服务器。同时该版本的支持mini SD卡(TF卡)读写该扩展板采用了可堆叠的设计,可直接插到Arduino上,同时我们的其他扩展板也可以插上去。W5100是一款多功能的单片网络接口芯片,内部集成有10/100以太网控制器,主要应用于高集成、高稳定、高性能和低成本的嵌入式系统中。

4. 产品参数
1、支持全硬件TCP/IP协议,包括TCP\UDP\ICMP\IPv4\ARP\IGMP\PPPoE和Ethernet.
2、内嵌10 BaseT/100 BaseTX以太物网物理层。
3、支持自动应答(全双工/半双工模式)。
4、支持自动MDI/MDIX。
5、支持ADSL连接(支持PPPoE协议,带PAP/CHAP验证)。
6、支持4个独立端口。
7、内部16KB存储器作为TX/RX缓存。
8、0.18umCMOS工艺。
9、3.3V工作电压,I/o口可承受5V电压。
10、小巧的LQFP80无铅封装。
11、多种PHY指示灯信号输出(TX、RX、Full/Half duplex、Collision、Link和Speed)。

D卡插槽:
W5100带有Micro SD卡(即TF卡)插槽,可用于读/写Micro SD卡。
W5100指示灯(灯亮情况下的分别表示):
L:编程指示灯。
PWR:设备已通电。
LINK:网络已连接。当发送或接受数据时会闪烁。
FULLD:网络连接是全双工通信。
100M:当前为100Mb/s的网络连接。
RX:网络接收数据时闪烁。
TX:网络检测到冲突时闪烁。
需要注意的是,这里的RX和TX是网络通信指示灯,并不是其他控制器上的串口通信指示灯。

5. 示例程序一(官方示例)
使用mega2560 R3 请将W5100对准插孔插入。非本店购买的W5100可能会存在无法兼容MEGA2560的情况。

//中贝斯特UltiRobot以太网扩展板W5100示例
//程序效果:电脑端打开网页可以看到参数返回
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com

#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() {
  // You can use Ethernet.init(pin) to configure the CS pin
  Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  // 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
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  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");
  }
}

下载程序后,通过浏览器,访问Arduino Ethernet所在的IP地址(如程序中设定的IP地址为192.168.1.177) ,可以看到模拟pin的读书。如果电脑的IP地址和默认网关不在你所设置的(192.168.1.177)内,请手动设置您电脑的IP地址和默认网关。如下图:

程序效果:

5. 示例程序二
W5100网络扩展板模块上已经自带SD卡插口,实验通过网页的形式,将SD卡里的内容读取出来,例如:查看TXT文档、图片等。将SD卡插入W5100上的SD卡插口。

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};//mac地址
IPAddress ip(192, 168, 1, 177);//ip地址
EthernetServer server(80);//访问端口
String fakename = "Nginx/1.8.0 (ATmega328p/Ubuntu 12.04 LTS)"; //装逼参数(伪装服务器)
String res = "", path = "";
EthernetClient client;
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  //启动sd
  Serial.print("init sd:");
  if (!SD.begin(4)) {
    Serial.println("failed");
    return;
  }
  Serial.println("done");
  //启动eth
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("ip:");
  Serial.println(Ethernet.localIP());

}


void loop() {
  client = server.available();
  if (client) {
    Serial.println("new client");

    delay(200);
    res = ""; path = ""; /*httpget = "", */
    int resend = 1;
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Serial.write(c);
        //只读取一行
        if (c != '\n' && resend) {
          res += c;
        } else {
          resend = 0;
        }

        if (c == '\n' && currentLineIsBlank) {
          //判断GET头完整性
          if ((res.indexOf("GET ") != -1) && (res.indexOf(" HTTP") != -1)) {
            //判断是否存在get参数
            if (res.indexOf('?') != -1) {
              //httpget = res.substring(res.indexOf('?') + 1, res.indexOf(" HTTP"));
              path = res.substring(res.indexOf("GET ") + 4, res.indexOf('?'));
            } else {
              path = res.substring(res.indexOf("GET ") + 4, res.indexOf(" HTTP"));
            }
            Serial.println(res);
            //Serial.println("GET:" + httpget);
            Serial.println("path:" + path);
            //delay(100);
            File s = SD.open(path);
            if (s) {
              webprintDirectory(s);
            } else {
              client.println(s);
              s.rewindDirectory();
              s.close();
            }
            //client.println("<p>" + fakename + "</p></body></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");

  }
}

void webprintDirectory(File dir) {
  //判断是否为文件
  if (!dir.isDirectory()) {

    if (path.indexOf('.') != -1) {
      //获取后缀名
      http_header("200 OK", path.substring(path.indexOf('.') + 1));
    } else {
      http_header("200 OK", "txt");//文件没有后缀名 默认显示文本格式
    }
    //读文件
    while (dir.available()) {
      char sc = dir.read();
      client.print(sc);
    }
    dir.close();
    dir.rewindDirectory();
    return;//退出
  }
  //判断不是文件
  http_header("200 OK", "htm");
  client.print("<!DOCTYPE HTML><html><body><h1>200 Success</h1><br />;PATH:" + path + "<hr />");
  dir.rewindDirectory();//索引回到第一个位置
  while (true) {
    File entry =  dir.openNextFile();
    if (!entry) {
      //没有下一个索引了
      client.print("<br />No more files");
      dir.rewindDirectory();
      break;
    }
    if (path == "/") {
      client.print("<br /><a href=\"" + path);
    } else {
      client.print("<br /><a href=\"" + path + "/");
    }
    client.print(entry.name());
    client.print("\"target=\"_self\">");
    client.print(entry.name());
    client.print("</a>");
    if (!entry.isDirectory()) {
      // files have sizes, directories do not
      client.print("  ");
      client.println(entry.size(), DEC);
    }

    entry.close();
  }
  client.println("<p>" + fakename + "</p></body></html>");
  dir.close();
  delay(200);
}

void http_header(String statuscode, String filetype) {
  filetype.toLowerCase();//把后缀名变小写
  client.println("HTTP/1.1 " + statuscode);
  client.print("Content-Type: ");
  //判断文件mime类型
  if (filetype == "htm" || filetype == "html") {
    client.println("text/html");
  }
  if (filetype == "png" || filetype == "jpg" || filetype == "bmp" || filetype == "gif") {
    client.println("image/" + filetype);
  } else {
    client.println("text/plain");
  }
  client.println("Connection: close");
  client.println();
}

将程序上传到UNO开发板后,再将W5100插在UNO开发板的对应插口上,并连接好网线和USB线。通过浏览器,访问Arduino Ethernet所在的IP地址(如程序中设定的IP地址为192.168.1.177) ,可以看到内存卡的相关目录及文件。如果电脑的IP地址和默认网关不在你所设置的(192.168.1.177)内,请手动设置您电脑的IP地址和默认网关。如下图:
(电脑端IP地址设置参考)

程序效果:
网页浏览SD内存卡目录

SD内存卡内容查看:

串口操作显示:

6. 注意事项
1、内存卡文件名格式:【XXX.后缀名.后缀名】,例如TXT电子档:TEST.TXT.TXT(文件名:TEST.TXT)的格式为TXT;否则可能只显示首文件!
2、注意!访问不要太频繁,在上一个文件未完全关闭的情况下打开下一个文件可能会显示不正常或死链。
3、IP地址重新设置后,网络识别较慢,如无法识别网络,请拔掉网线后重试。网页无法显示,请多刷新几次或者检查您的设置是否正确。
4、使用Arduino mega2560主控板时,请将孔位对准后,将W5100网络模块插在mega2560上使用。

7. 相关资料
关于请求地址 表单 路径 后缀名截取方法 可以参考http://www.arduino.cn/thread-18012-1-1.html
W5100网络扩展板资料:http://pan.baidu.com/s/1bFTSnk

未经允许不得转载:Arduino-Maker » W5100网路扩展板 适用于Arduino平台

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

线上商城

中贝斯特创客空间蘑菇云创客教育