物联网应用——从源代码为ESP8266创建NodeMCU


引言

我们撰写了一系列关于连接到“物联网”(Internet of Things,IoT)以及如何使用“物联网”的文章,这些文章难度较大,本文是其中的第一部分。这一项目涉及许多高大上的概念,包括编辑源文件、交叉编译,所以还是提前说一声,胆小的人请略过本文。我建议在尝试这个项目之前,最好熟悉一下在Linux终端从源代码编译软件。

现在的生活真是好呀!现在的手机、冰箱、袜子甚至水杯都有微处理器。随着物联网逐渐走入我们的生活,把各种设备和传感器连接到网上也变得更加便宜和简单了。对于价格低廉的物联网连接来说,最振奋人心的技术就是中国芯片厂商乐鑫信息科技公司研发的ESP8266 无线微控器。ESP8266最初是一个为微控器提供Wifi串口透传的设备,它实际是一个32bitTensilica Xtensa LX106 处理器,时钟频率为80 MHz, 有一个完整的无线WiFi堆栈。

在线社区很快意识到芯片的市场,于是就开始把技术文档翻译成英文,同时创建工具把芯片用作一个非常完善的嵌入式处理器。ESP8266可以有不同的开源硬件,不过本文主要介绍ESP8266-12所在的开发板NodeMCU devkit。我现在用的是0.9版本,虽然已经有1.0版本了,但我用不来。这两个版本非常相似,只是固件和USB转串口芯片有所不同。如果你用的是Devkit V1.0, 本文也可以用到,请在评论里留言。总之Devkit 是ESP8266-12的开发板,有一个CH341 USB转串口透传(相当于平时经常使用的 FTDI FTL232R)、一个微型USB连接器和一些按钮。下图是我所用的开发板:




我在Ebay 买的这个NodeMCU,总共花了$10,Alibaba上有很多可供选择。如果你比较喜欢知名的开源硬件厂商,可以选择Adafruit 和Sparkfun,它们都有自己研发的开发板。你在此编译的固件二进制文件适用于你所选择的ESP8266-12开发板,但把这一固件载入开发板的方式有很多种。由于人们对芯片的兴趣正呈爆炸式增长,许多在线社区提供了许多编程方法与之交互, 例如Arduino add-onMicroPython,在裸机上建立C语言和C++环境。本文主要介绍将NodeMCU firmware编译并安装到设备上,设置一下连接WiFi,与GPIO管脚交互,从ADC读取电位输入。 

所需设备:

· 一台运行Linux的电脑(Ubuntu 15.04 Vivid Vervet)

 
·1个有ESP8266-12的0.9版本的NodeMCU Devkit 


关于Linux的注意事项

我现在用的是64位版本的Ubuntu 15.04 Vivid Vervet,Linux kernel 3.19.0-22-generic。 所用的指令必须对系统没有任何要求,但要记住的一点是,在设置依赖项时需要调整指令,像apt-get、pacman和yum等不同的软件包管理器有不同的命名规范。


什么要为NodeMCU及其源代码费心?

NodeMCU使用Lua脚本语言编程。该平台基于eLua开源项目,允许ESP8266 基于事件的编程。固件二进制文件可以在网上自定义生成并下载下来,所以严格来讲,不需要从源代码开始编译。不过我们还是想自己尝试一下,研究一下怎样做比较精简,同时更能控制硬件的运行,使其更透明化。因此运行一个新的处理器的第一步也是最没劲的一步就是获取工具链,设置依赖项,这样就可以对它进行编程了。本文的重点是下载NodeMCU固件源代码,在github创建工具,选择我们需要的模组,编译模组,在Linux环境下把它烧录进ESP8266。指令适用于Ubuntu 15.04 Vivid Vervet,但也要适用于其他版本和开源硬件——要知道其中有一些细微的差别。

 

一切准备就绪

1)  在主流 Linux 内核当中可以实现USB转串口桥接器的驱动,但是Windows和 OSX的用户需要安装驱动程序。要想知道设备是否运作起来,先将NodeMCU-Devkit 插入电源,在终端输入:

dmesg | grep tty

你会看到以下信息:

[50859.311796] usb 2-1.2: ch341-uart converter now attached to ttyUSB0

这是我们把代码发送给ESP8266时需要与之通信的串口。


2)  安装依赖项,以控制ESP8266的编译顺序和通信。 

sudo apt-get install make unrar autoconf automake libtool gcc g++ gperf flex bison \
texinfo gawk ncurses-dev libexpat-dev python python-serial sed git libtool-bin screen

 

我们用的软件开发包是 esp-open-sdk。这个SDK包含可以为 Xtensa 处理器交叉编译的工具、硬件抽象层库(HAL)esptool,还有一个可以转换代码并将代码上传至设备的python脚本。

3) 创建自己的目录,克隆Github的esp-open-sdk 仓库:

mkdir ~/.opt && cd ~/.opt
git clone --recursive https://github.com/pfalcon/esp-open-sdk.git # --recursive since this repo contains more repos

 

4)  编译一个独立版本的开源SDK,其中内置vendor SDK文件。然后把SDKbin目录添加到PATH环境变量中去:

cd esp-open-sdk
make STANDALONE=y


 

这一过程要等待一会儿...


 
make 
指令需要运行一段时间,所以你可以去倒杯咖啡或者别的了。尽管这个独立的SDK很容易在本地编写代码,但也有一些需要注意的地方。点击这里可以看到有关ipfalcon需要注意的方面,其中涉及可移植性和协议许可。然后把新建的工具二进制文件添加至PATH环境变量当中。这样你在编译Xtensa代码时系统就知道到哪里查找信息了。

echo 'PATH=$PATH:/opt/esp-open-sdk/xtensa-lx106-elf/bin' >> ~/.profile
PATH=$PATH:~/.opt/esp-open-sdk/xtensa-lx106-elf/bin

 

既然我们可以利用工具创造一切,那么我们也可以得到NodeMCU固件,并根据具体需求进行配置。  

5) 克隆Nodemcu固件:

cd ~/.opt
cd nodemcu-firmware

 

现在是细节问题了!许多NodeMCU用户讨论的一个常见问题是启动这个项目之后芯片就没剩余内存空间了。ESP8266只有64KB的指令内存和96KB的数据内存,所以内存还是很珍贵的。如果项目不需要的话为什么还要安装I2C和u8g图形库呢?默认模式下,所有的模块都会被安装,所以我们可以注释掉这次不需要的模块。


6) 选择模块进行编译和安装

利用你最喜欢的编辑器(Sublime Text 3 with Vim key bindings),打开../nodemcu-firmware/app/include/user_modules.h

这个项目只需要node、file、 gpio、wifi、net、 pwm、 定时器、 adc和 uart 模块就够了。我编辑自己的 user_modules.h其中我加了一些评论:

                    #ifndef __USER_MODULES_H__
#define __USER_MODULES_H__

#define LUA_USE_BUILTIN_STRING		// for string.xxx()
#define LUA_USE_BUILTIN_TABLE		// for table.xxx()
#define LUA_USE_BUILTIN_COROUTINE	// for coroutine.xxx()
#define LUA_USE_BUILTIN_MATH		// for math.xxx(), partially work
// #define LUA_USE_BUILTIN_IO 		// for io.xxx(), partially work

// #define LUA_USE_BUILTIN_OS		// for os.xxx(), not work
// #define LUA_USE_BUILTIN_DEBUG	// for debug.xxx(), not work

#define LUA_USE_MODULES

// Check out http://www.nodemcu.com/docs/ for more info on what you need and what you don't. 
#ifdef LUA_USE_MODULES
#define LUA_USE_MODULES_NODE		// NodeMCU system related functions (restart, info, etc)
#define LUA_USE_MODULES_FILE		// File system for managing lua files 
#define LUA_USE_MODULES_GPIO		// General purpose I/O. Good stuff!
#define LUA_USE_MODULES_WIFI		// Nowhere near as cool of a chip without this
#define LUA_USE_MODULES_NET		// Do things with TCP and UDP
#define LUA_USE_MODULES_PWM		// Pulse width modulation -- gonna dim some LEDs!
//#define LUA_USE_MODULES_I2C		// Peripheral communications library
//#define LUA_USE_MODULES_SPI		// Peripheral communications library
#define LUA_USE_MODULES_TMR		// Timer functions like delay() and all that 
#define LUA_USE_MODULES_ADC		// 10-bit analog-to-digital converter. Read pots & batts.
#define LUA_USE_MODULES_UART		// Need it to talk to the durn thing through CH341
//#define LUA_USE_MODULES_OW		// 1-Wire peripheral communications library
//#define LUA_USE_MODULES_BIT		// Bitwise manipulation (xor, not, and, or, etc)
//#define LUA_USE_MODULES_MQTT		// light weight messaging protocol on top of TCP/IP
//#define LUA_USE_MODULES_COAP		// IDK... No docs :'(
//#define LUA_USE_MODULES_U8G		// Neato burrito graphics lib: github.com/olikraus/u8glib
//#define LUA_USE_MODULES_WS2801	// IDK... No docs :'( More LEDs???
//#define LUA_USE_MODULES_WS2812	// Cool RGB LED strips
//#define LUA_USE_MODULES_CJSON		// Provides JSON support for Lua
//#define LUA_USE_MODULES_CRYPTO	// Super secret spy stuff
//#define LUA_USE_MODULES_RC 		// IDK... No docs :'(
//#define LUA_USE_MODULES_DHT		// IDK... No docs :'(

#endif /* LUA_USE_MODULES */

#endif	/* __USER_MODULES_H__ */

                  

在用0.9版本的Devkit时,还需要修改一下../nodemcu-firmware/app/include/user_config.h,使配置符合0.9版本的Devkit。把代码的第四行注释掉之后就会看到:

#define DEVKIT_VERSION_0_9 1     // define this only if you use NodeMCU devkit v0.9

开始创建吧!


7) 编译NodeMCU:

cd ~/.opt/nodemcu-firmware # make your way back to the firmware dir if you weren't there already
make # this might take a while

 

8)  把你自己添加到对话群当中,把固件烧录至设备中:

在上载编译的图像或与设备通信之前,必须得到允许访问串口。/dev/ttyUSB0也属于对话群,所以可以把自己加入,输入:

sudo adduser $USER dialout

 

现在应该可以把NodeMCU图像上载到设备当中:

make flash # this assumes the tty device is /dev/ttyUSB0

 

如果一切运行正常,而且没有出现什么错误的话,现在就可以开始原型测试了:

注意:在make flash指令当中,生成文件调用了一个Python脚本esptool.py,把编译的二进制文件写入ESP8266的各个内存当中。Esptool是一个独立的项目,不过NodeMCU克隆Esptool,并把它纳入自己的项目当中。'make flash' 调用的指令是:

 

../tools/esptool.py --port /dev/ttyUSB0 write_flash 0x00000 ../bin/0x00000.bin 0x10000 
../bin/0x10000.bin

 所以如果你的CH341不是在/dev/ttyUSB0,而是在不同的位置(或者你用了Frightanic的自定义生成的工具),改为你的设备名称和二进制文件。  

结束语

本文主要讲述了ESP8266是基于Lua固件的,下次我会着重讲一下它的实用性。我接下来介绍如何利用Linux Screen连接至NodeMCU的Lua解释器,如何写脚本与Wifi、网络,以及开发板上的10-bit ADC和GPIO进行交互。我接下来还会介绍Luatool和其他程序是怎样和ESP8266进行交互的,接下来的文章将会很精彩,期待我们下次见!  


若想阅读第二部分,可点击如何使用集成了ESP8266芯片的NodeMCU以配置一个可交互的TCP服务器?

 

版权声明:


本译文仅用于学习和交流目的。转载请注明译者、出处,并保留文章的完整链接。

原文来源:http://www.allaboutcircuits.com/

原文标题:Guts of the IoT: Building NodeMCU from Source for the ESP8266

原文地址:http://www.allaboutcircuits.com/projects/guts-of-the-iot-part-1-building-nodemcu-from-source-for-the-esp8266/




展开阅读全文

没有更多推荐了,返回首页