【雕爷学编程】Arduino动手做(135)---W5100 网络扩展板模块

发布时间 2023-06-29 10:11:41作者: 行者花雕

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十五:Ethernet W5100 网络扩展板 SD卡扩展模块 支持MEGA

 

知识点:W5100S芯片

采用WIZnet技术的硬件TCP / IP设计的W5100S芯片是一款嵌入式以太网控制器。在使用 W5100S时MCU 可以方便的处理 IPv4,TCP,UDP,ICMP,IGMP,ARP,PPPoE等TCP/IP 协议。W5100S 分别有 8KB 的发送缓存和接收缓存,可以减少MCU 的开销。 主机可以同时使用 W5100S 的 4 个独立的硬件SOCKETs,并基于每个硬件SOCKET 开发独立的互联网应用。2019年7月30日-8月1日,WIZnet公司携W5100S参加了IOTE2019第十二届国际物联网展(深圳站) 展会。

W5100S芯片是WIZnet最新推出的一款集成全硬件 TCP/IP协议栈的性价比更高的嵌入式以太网控制器,为单片机提供了更加简单、快速、稳定、安全的以太网接入方案。全硬件TCP/IP协议栈简化传统的软件TCP/IP协议栈,卸载了MCU用于处理TCP/IP这部分的线程,节约MCU内部ROM等硬件资源,工程师只需进行简单的Socket编程和少量的寄存器操作即可方便地进行嵌入式以太网上层应用开发,减少产品开发周期,降低开发成本。

W5100S支持间接并行总线和高速SPI接口2种方式与主机进行通信。其内部还集成了以太网数据链路层(MAC)和10Base -T/100Base -T 以太网物理层(PHY),支持自动协商(10/100-Based全双工/半双工)。与传统软件协议栈不同,W5100S内嵌的4个独立硬件Socket可以进行4路独立通信,该4路Socket的通信效率互不影响,可以通过W5100S芯片上的16K字节的收/发缓存灵活定义各个Socket的大小。

W5100S还提供WOL(局域网唤醒)和掉电模式,便于对功耗有要求的客户使用。

W5100S主要特征

全硬件TCP/IP协议栈

– 支持TCP, UDP, WOL, ICMP, IGMPv1/v2, IPv4, ARP, PPPoE协议

– 硬件网络引擎,不受网络攻击

支持SPI 和并行总线接口

– 高速 SPI接口(MODE 0/3)

– 系统总线接口(2位地址线和8位数据线)

支持嵌入式操作系统:Linux & RTOS

支持4路独立硬件Socket同时通信,通信效率互不影响

支持SOCKET-less 指令

– ARP请求

– PING请求

内部16K字节收发缓存供TCP/IP包处理

支持以太网掉电模式和主时钟选通节能模式

支持基于UDP的网络唤醒(WOL)功能

集成 10BaseT / 100Base-T 以太网 PHY

支持自动协商(全/半双工,10M/100M)

支持Auto-MDIX功能(只在以太网自动协商模式下支持)

网络指示灯 (全/半双工, 链接指示, 10Mb/100Mb指示,传输指示 )

工业级:-40℃ ~ 85℃

工作电压 3.3V,I/O 5V 耐压

48管脚LQFP封装和QFN封装 (无铅,7x7mm, 0.5mm 间距)

 

W5100S主要参数
尺寸                                     7 x7毫米
以太网I / F                            物理层
工作温度                           -40至+85°C
工作电压                              3.3伏
功能                       3合1,MCU + TCP / IP + MAC
自动协商                               是
网络套接字数                         4
内部DPRAM缓冲存储器      16千字节
包                                  轻量级计划
针数                                     48
自动MDIX                             是
局域网唤醒                           是
掉电模式                              是
典型值 能量消耗                  待定
SPI(最大速度)                70兆赫
MCU I / F 8位(间接)         SPI
PHY芯片                          W5100S
针脚间距                         0.50毫米
信息产业部                         没有
以太网速度                       10/100
并行内存总线                   8位间接
制造商                             无线网

 

 

 

以太网(Ethernet)
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET。

以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。经典以太网是以太网的原始形式,运行速度从3~10 Mbps不等;而交换式以太网正是广泛应用的以太网,可运行在100、1000和10000Mbps那样的高速率,分别以快速以太网、千兆以太网和万兆以太网的形式呈现。 以太网的标准拓扑结构为总线型拓扑,但目前的快速以太网(100BASE-T、1000BASE-T标准)为了减少冲突,将能提高的网络速度和使用效率最大化,使用集线器来进行网络连接和组织。如此一来,以太网的拓扑结构就成了星型;但在逻辑上,以太网仍然使用总线型拓扑和CSMA/CD(Carrier Sense Multiple Access/Collision Detection,即载波多重访问/碰撞侦测)的总线技术。以太网实现了网络上无线电系统多个节点发送信息的想法,每个节点必须获取电缆或者信道的才能传送信息,有时也叫作以太(Ether)。(这个名字来源于19世纪的物理学家假设的电磁辐射媒体-光以太。后来的研究证明光以太不存在。) 每一个节点有全球唯一的48位地址也就是制造商分配给网卡的MAC地址,以保证以太网上所有节点能互相鉴别。由于以太网十分普遍,许多制造商把以太网卡直接集成进计算机主板。

Arduino Ethernet  W5100S网络扩展模块,可以使Arduino成为简单的Web服务器或者通过网络控制读写Arduino的数字和模拟接口等网络应用。可直接使用IDE中的Ethernet库文件便可实现一个简单Web服务器。 同时该版本的支持mini SD卡(TF卡)读写。该扩展板采用了可堆叠的设计,可直接插到Arduino上,同时我们的其他扩展板也可以插上去。

W5100S网络扩展模块主要参数

 

模块参考电原理图

 W5100S网络扩展模块供电

该板还可以通过外部电源,可选的以太网供电(PoE)模块或使用FTDI电缆/ USB串行连接器供电。 外部电源可以来自交流转直流适配器(壁式电源适配器)或电池。可以通过将2.1mm中心正插头插入板子的电源插孔来连接适配器。可以将电池的导线插入POWER连接器的Gnd和Vin引脚接头中。 该板可在6至20伏的外部电源上运行。但是,如果电源电压低于7V,则5V引脚的电源电压可能低于5V,电路板可能会不稳定。如果使用的电压超过12V,则稳压器可能会过热并损坏电路板。推荐的范围是7到12伏。

电源引脚如下:

VIN 当Arduino板使用外部电源时的输入电压(与USB连接或其他稳压电源提供的5伏电压相反)。您可以通过该引脚供电,或者,如果通过电源插孔供电,则可以通过该引脚供电。

5V。该引脚从板上的调节器输出稳定的5V电压。可以通过直流电源插孔(7-12V),USB连接器(5V)或板的VIN引脚(7-12V)为该板供电。通过5V或3.3V引脚供电会绕过稳压器,并可能损坏电路板。我们不建议这样做。

3V3。板载稳压器产生3.3伏电源。最大电流消耗为50 mA。

地 接地引脚。

IOREF。Arduino板上的此引脚提供了供微控制器操作的参考电压。正确配置的屏蔽层可以读取IOREF引脚电压并选择合适的电源,或者在输出上启用电压转换器,以使用5V或3.3V电压。

可选的PoE模块旨在从传统的双绞线5类以太网电缆提取功率:

符合IEEE802.3af

低输出纹波和噪声(100mVpp)

输入电压范围36V至57V

过载和短路保护

9V输出

高效DC / DC转换器:典型值75%@ 50%负载

1500V隔离(输入到输出)

 

输入输出

可以使用pinMode(),  digitalWrite()和  digitalRead()  函数将以太网板上的14个数字引脚中的每个用作输入或输出。它们在5伏特下工作。每个引脚最多可提供或接收40 mA的电流,并具有一个20-50 kOhms的内部上拉电阻(默认情况下已断开)。此外,某些引脚还具有特殊功能:

串行:0(RX)和1(TX)用于接收(RX)和发送(TX)TTL串行数据。

外部中断:2和3。这些引脚可以配置为在低值,上升沿或下降沿或值改变时触发中断。有关 详细信息,请参见  attachInterrupt()函数。

PWM:3、5、6、9和10。提供带有AnalogWrite()  函数的8位PWM输出  。

SPI:10(SS),11(MOSI),12(MISO),13(SCK)。这些引脚支持使用SPI库的 SPI通信。

LED:9.数字引脚9上连接有内置LED。当该引脚为HIGH值时,该LED点​​亮;当该引脚为LOW时,其熄灭。在大多数其他arduino板上,此LED位于第13针上。它位于以太网板上的第9针上,因为第13针用作SPI连接的一部分。

以太网板有6个模拟输入,标记为A0至A5,每个模拟输入提供10位分辨率(即1024个不同值)。默认情况下,它们的测量范围是从地到5伏,尽管可以使用AREF引脚和AnalogReference()函数更改其范围的上限  。此外,某些引脚具有特殊功能:

TWI:A4(SDA)和A5(SCL)。使用Wire库支持TWI通信  。

板上还有几个其他引脚:

AREF。模拟输入的参考电压。与  analogReference()一起使用。

重启。将此线拉低以复位微控制器。通常用于在屏蔽板上添加一个重置按钮,以屏蔽板上的一个按钮。

 

 

通讯
Arduino以太扩展版具有许多用于与计算机,另一个Arduino或其他微控制器通信的设施。 一个  SoftwareSerial库  允许任何欧诺的数字引脚串行通信。 ATmega328还支持TWI和SPI通信。Arduino软件包含一个Wire库,以简化TWI总线的使用; 有关详细信息,请参见相关文档。对于SPI通信,请使用 SPI库。 该板还可以通过以太网连接到有线网络。连接到网络时,您将需要提供IP地址和MAC地址。该  以太网库  完全支持。 可通过SD库访问板载microSD卡读卡器  。使用该库时,SS位于引脚4上。

编程设计
可以通过两种方式对Arduino以太网板进行编程:通过6引脚串行编程接头,或使用外部ISP编程器。 6针串行编程接头与FTDI USB电缆以及Sparkfun和Adafruit FTDI风格的基本USB到串行分线板(包括Arduino USB串行连接器)兼容。它具有对自动重置的支持,允许上传草图而无需按下板上的重置按钮。当插入FTDI风格的USB适配器时,Arduino以太网将关闭适配器电源。 您还可以绕过引导程序,并使用Arduino ISP  或类似产品通过ICSP(在线串行编程)标头对微控制器进行编程 。

 

 

 

安装 "Ethernet.h"库-工具-管理库-搜索-安装
项目测试 :通过插入W5100 以太网扩展板,实现Arduino NUO 接入以太网

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十五:Ethernet W5100 网络扩展板 SD卡扩展模块 支持MEGA

 安装 "Ethernet.h"库-工具-管理库-搜索-安装

 项目测试 :通过插入W5100 以太网扩展板,实现Arduino NUO 接入以太网

*/



#include <Ethernet.h>

#include <SPI.h>

//mac地址可以是随便的48位地址,只要设备间不相互冲突就行

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress staticIP(192, 168, 31, 159);

EthernetServer server(80);

void connectToInternet()

{

 if (Ethernet.begin(mac) == 0)//看看DHCP是否能动态分配ip给Arduino

 {

  Serial.print("[ERROR] Failed to Configure Ethernet using DHCP");

  Ethernet.begin(mac, staticIP);//DHCP不能动态分配,就静态设置ip给Arduino

 }

 delay(1000);

 Serial.println("[INFO] Connection Successsful");

 Serial.print("");

 printConnectionInformation();

 Serial.println("-------------------------");

 Serial.println("");

}

void printConnectionInformation()

{

 Serial.print("[INFO] IP Address: ");

 Serial.println(Ethernet.localIP());

 Serial.print("[INFO] Subnet Mask: ");

 Serial.println(Ethernet.subnetMask());

 Serial.print("[INFO] Gateway: ");

 Serial.println(Ethernet.gatewayIP());

 Serial.print("[INFO] DNS: ");

 Serial.println(Ethernet.dnsServerIP());

}

void setup() {

 // 将设置代码放在此处,运行一次:

 Serial.begin(9600);

 connectToInternet();

 server.begin();

}

void loop()

{

 //当有客户连接服务器时,服务器available函数会返回一个客户端对象用以向客户反馈信息

 EthernetClient client = server.available();

 if (client) {

  // http请求以空行结束

  boolean current_line_is_blank = true;

  while (client.connected()) {

   if (client.available()) {

    char c = client.read();

    // 如果我们排到了队伍的尽头

    // (字符)且该行为空,则http请求已结束,

    // 所以我们可以回复

    if (c == 'n' && current_line_is_blank) {

     // 发送标准http响应头

     client.println("HTTP/1.1 200 OK");

     client.println("Content-Type: text/html");

     client.println();

     // 输出每个模拟输入引脚的值

     client.print("welcome to tinyos electronics");

     client.println("<br />");

     client.print("//*************************************");

     client.println("<br />");

     client.print("");

     client.println("<br />");

     client.print("//*************************************");

     client.println("<br />");

     for (int i = 0; i < 6; i++) {

      client.print("analog input ");

      client.print(i);

      client.print(" is ");

      client.print(analogRead(i));

      client.println("<br />");

     }

     break;

    }

    //有的教程里也有用(c == '\n')和 (c != '\r')的

    //用(c == '\n')和 (c != '\r')的话,客户端连接不上服务器,不能用

    if (c == 'n') {

     // 我们要开始新的生产线

     current_line_is_blank = true;

    } else if (c != 'r') {

     // 我们在当前行中找到了一个角色

     current_line_is_blank = false;

    }

   }

  }

  client.stop();

 }

}

  

实验串口返回情况

 

在网页中显示了A0至A5所读出的模拟值,你也可以通过修改以上程序,显示其他类型的数据。

以上程序修改自Arduino IDE自带的Web Server例程,它是通过不断刷新网页来获取Arduino反馈来完成的。实际上,在当今web开发上,几乎都是通过ajax不刷新网页,来与服务器通信的。

ARDUINO W5100 WebClient 测试

基础工作:W5100扩展板插在ARDUINO上。用网线把W5100和自己家的路由器连接。插上网线能看到侧面网口指示灯变亮。路由器开启DHCP服务(一般都是开启的)。
1.打开官方例程里面的Ethernet->WebClient
2.修改里面的谷歌服务器为百度的。
3.修改IP地址为本地的局域网号码段,比如你的电脑是192.168.1.100。那么设置你的w5100,也在192.168.1.x。后面的x不能与局域网内的其它设备重复。
 
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百三十五:Ethernet W5100 网络扩展板 SD卡扩展模块 支持MEGA

 安装 "Ethernet.h"库-工具-管理库-搜索-安装

 项目测试之二 :ARDUINO W5100 WebClient 测试

*/



#include <SPI.h>

#include <Ethernet.h>

// Enter a MAC address for your controller below.

// Newer Ethernet shields have a MAC address printed on a sticker on the shield

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// if you don't want to use DNS (and reduce your sketch size)

// use the numeric IP instead of the name for the server:

//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)

char server[] = "www.baidu.com";  // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign

IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet client library

// with the IP address and port of the server

// that you want to connect to (port 80 is default for HTTP):

EthernetClient client;

void setup() {

 // Open serial communications and wait for port to open:

 Serial.begin(9600);

 while (!Serial) {

  ; // wait for serial port to connect. Needed for Leonardo only

 }

 // start the Ethernet connection:

 if (Ethernet.begin(mac) == 0) {

  Serial.println("Failed to configure Ethernet using DHCP");

  // no point in carrying on, so do nothing forevermore:

  // try to congifure using IP address instead of DHCP:

  Ethernet.begin(mac, ip);

 }

 // give the Ethernet shield a second to initialize:

 delay(1000);

 Serial.println("connecting...");

 // if you get a connection, report back via serial:

 if (client.connect(server, 80)) {

  Serial.println("connected");

  // Make a HTTP request:

  client.println("GET /search?q=arduino HTTP/1.1");

  client.println("Host: www.baidu.com");

  client.println("Connection: close");

  client.println();

 }

 else {

  // kf you didn't get a connection to the server:

  Serial.println("connection failed");

 }

}

void loop()

{

 // if there are incoming bytes available

 // from the server, read them and print them:

 if (client.available()) {

  char c = client.read();

  Serial.print(c);

 }

 // if the server's disconnected, stop the client:

 if (!client.connected()) {

  Serial.println();

  Serial.println("disconnecting.");

  client.stop();

  // do nothing forevermore:

  while (true);

 }

}

  能显示服务器返回的数据,证明通讯成功。

Ethernet Library(以太网库)

通过Arduino Ethernet 开发板或者shield,使能网络连接(本地和互联网)。

更多的信息参考[size=13.3333px]https://www.arduino.cc/en/Reference/Ethernet。

适用于所有Arduino开发板板。

  • Advanced Chat Server: 建立一个简单的聊天服务器。
  • Barometric Pressure Web Server: 输出从气压传感器传来的数值,作为一个网页。
  • Chat Server: 建立一个简单的聊天服务器。
  • Dhcp Address Printer: 通过DHCP获取一个IP地址,并打印出来。
  • Dhcp Chat Server: 一个简单的DHCP聊天服务器
  • Telnet Client: 一个简单的telnet客户端。
  • UDP Ntp Client: 通过UDP查询网络时间协议(NTP)服务器。
  • UDP Send Receive String: 通过UDP发送和接收文本字符串。
  • Web Client: 做一个HTTP请求。
  • Web Client Repeating: 重复HTTP请求。
  • Web Server: 创建一个简单的HTML页面,用来显示模拟传感器的数值。