为了实现在设备间的通信,人们发明了各种不同的解决方案:蓝牙、Zigbee、XBee、NRF2401、红外等等,他们适合在不同环境、不同场合下使用。在这其中,WiFi则更适合用来为嵌入式设备提供网络功能。WiFi不仅和蓝牙一样可以和手机直接连接,而且可以直接连接到互联网。
WiFi是一种可以将个人电脑、移动设备、游戏机或数字音频播放器从一定范围内的无线网络连接到网络的技术。最早的WiF标准是1997年出现的802.11标准,然后就是1999年出现的IEEE 802.11b标准,即我们通常说的WiFi。第三代WiFi是2002年左右推出的802.11g/a标准。从2007年开始一直沿用到现在的802.11n标准是第四代WiFi。
WiFi只是一个标准,为了将我们的设备连上网络,我们还需要路由器。尽管已经找不到最早诞生的无线路由器了,但是说起路由器就不得不说到Linksys生产的最著名的产品WRT54G。当时为了降低成本,Linksys决定在这个设备上使用基于Linux操作系统的固件。随后就诞生了OpenWRT,一个开源免费的嵌入式Linux。由于这个路由器开源出来的软件方案,使得这个系统在这个领域颇受欢迎。也因此有了今天的各种智能路由器,如小米路由器、极路由等等。
在WiFi芯片领域长期以来使用的是32位的MIPS核心的处理器。作为主要的WiFi解决方案提供商Broadcom、Atheros、Ralink、Marvell等都主要采用这个核心。由于ARM架构已经占领了绝大多数的手机芯片市场,一些产商也在开始使用ARM方案,如Realtek的Ameba,以及联发科的LinkIt ONE。但是由于这些芯片都存在一个造价高的问题,Espressif在这时推出了ESP8266。
ESP8266是一块由乐鑫espressif设计的wifi芯片,虽然它的定位是个Wi-Fi网络解决方案,但它更像一个物联网解决方案。它不仅体积小——大概11*10毫米左右,而且造价便宜,一个ESP8266的集成板只需要十几块。相比之下,在同等类似的芯片中,WRTNode需要一百多,而Particle(Spark Core)则需要更多的花费。
ESP8266的核心是一块Diamond Standard 106Micro控制器,一个低功耗的32位RISC控制器。它拥有GPIO、I2C、ADC、SPI、PWM等模块,你可以用它做一些微控制器能做的事。它还可以支持AP(Access Point)、STA(Station)、AP+STA共存模式,并且使用高效的AT指令。
如同官方所示,它还具有下面的一些特性:
由于其性价比高,一些国外的爱好者甚至成立了一个ESP8266的社区论坛: ESP8266 Community Forum,来分享一些用ESP8266创造新奇的玩意儿。它们也在Github上开源了一些相关的项目,如ESP8266 Core for Arduino。在这个项目中,你可以直接在ESP8266上使用Arduino的函数和库。
我们只要在Additional Board Manager URLs中添加ESP8266 Core for Arduino项目的API,然后在Tools > Board中打开Boards Manager,再安装完ESP8266平台就可以使用它了。
随后,连接上我们的ESP8266模块,打开Arduino的示例:
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
}
void loop() {
digitalWrite(BUILTIN_LED, LOW);
delay(1000);
digitalWrite(BUILTIN_LED, HIGH);
delay(2000);
}
编译、上传,我们就可以看到我们的LED在闪烁了。对于那些习惯使用Arduino编程方式的人来说,这无疑是一个特别好的消息——他们可以直接在上面运行他们原有的应用。此外你还可以使用TCP和UDP协议进行通信、建立HTTP、mDNS、SSDP和DNS服务器、进行OTA更新、在闪存中使用文件系统、SD卡、舵机等等。这已然可以和Arduino做同样的事情,并且速度还可能更快。
另外一个不得不提及的ESP8266开发板就是——NodeMCU(在ESP8266 Core for Arduino 项目中也可以选择这个开发板)。
NodeMCU是一款基于ESP8266的开源快速硬件原型平台,包括固件和开发板,用几行简单的Lua脚本就能开发物联网应用。
NodemMCU芯片是乐鑫公司基于他们的前一代芯片ESP8089研发的。乐鑫公司主营Wi-Fi无线芯片的研发,他们的主打产品ESP8089经过五年的研发和优化,已经达到高主频、超低耗、低成本的市场要求。2013年下半年,乐鑫公司出了ESP8266,进入中低端智能硬件市场。
而NodeMCU项目的发起人是黄锐,发起这个项目的时候他还是一名在读研究生。当时黄锐想把正在制作的脑电波传感器加上WiFi功能,便开始选型WiFi芯片。他在了解到ESP8266的内核LX106后,发现这个芯片性能颇为强大,比起畅销的MTK7681更胜一筹。基于ESP8266的脑电波传感器完成之后,黄锐决定再做点什么,来消除软件工程师和硬件工程师的隔阂。和开源社区爱好者zeroday商量后,他决定发起一个NodeMCU项目。NodeMCU的Firmware是由zeroday主导,并和黄锐共同完成的。起初他们想在上面移植JS,但是受限于8266的内存,便考虑使用Lua。因为脚本语言比较轻量,而且支持c编写,几行代码就能搞定别人很多代码量的工作。
作为一名程序员,我们对脚本语言与编译型语言的印象就是:脚本语言更适合原型开发——能用简洁的方式表达我们的想法。当然,使用脚本语言还可以省略搭建编译环境的过程,我们就不需要下载动辄上百M的SDK、开发环境。
举个例子,我们可以用下面的代码点亮引脚1:
pin = 1
gpio.mode(pin,gpio.OUTPUT)
gpio.write(pin,gpio.HIGH)
我们可以在敲入代码的同时观察开发板的变化,这个特性在设计原型过程中非常有用。同样的,为了实现一个HTTP服务,在ESP8266 Arduino中大概只需要50行代码,在传统的C语言中就需要上百行。而在NodeMCU中则可以:
conn=net.createConnection(net.TCP, false)
conn:on("receive", function(conn, pl) print(pl) end)
conn:connect(80,"121.41.33.127")
conn:send("GET / HTTP/1.1\r\nHost: www.nodemcu.com\r\n"
.."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
代码行数越多,维护成本越高。
当然NodeMCU只是其中的一个选择,但是它可以更快、更便捷的创造出原型。
ESP8266芯片就是这样一个高性价比的WiFi芯片,如果你关注于物联网解决方案,可以来了解一下这个芯片。不仅连网简单,而且快速上手。你可以用Arduino来编程,也可以用Lua语言来写相关代码。