esp8266 萌新三连:刷机(MicroPython)、亮灯、联网

Posted on Sun 12 November 2017 in 遗迹

前言

书接上回。在前一篇《入手指南》之中我们已经比较详细的列举了 esp8266 的一些信息,所以这里就……还是要简单介绍一下这枚芯片。这是一枚主频在80/160mhz双模式并集成WIFI的32位物联网芯片,比1元硬币大一点,仅售10元,使用这枚芯片的简单的开发板价格也不超过20块钱,堪称物美价廉。

我们的目标是在这片小小的板子上运行一个缩水的 python 解释器 —— MicroPython,并让它连入我们的局域网WIFI。

坦白的说,这篇文章介绍的都是一些入门问题,不存在什么高深的操作,也是对我自己探索开荒过程的回顾,若有同路者,希望能以本文免去大家一小段奔波之苦。

P.S. 本文在 Windows 环境下完成

刷机

前文的选购中我们介绍了两种开发板,其实如无意外大家买到的接近20块钱的开发板应该都是这种样式:

也就是 Nodemcu 制式的开发板。这个开发板集成了 usb-ttl 芯片,因此你弄个 microusb 线就可以完成所有操作了。

那么首先下载固件:http://micropython.org/download

选择 esp8266-20171101-v1.9.3.bin (elf, map) (latest) 就可以了,刚刚更新的。

刷机工具:https://github.com/nodemcu/nodemcu-flasher

老实说好多年不见 delphi 写的工具了,这门语言还是很棒的,可惜时下比较封闭,越发的没落了。

都准备好之后,打开设备管理器,找到“端口(COM和LPT)”,如无意外有一项和其他长的不一样,这就是我们要用的端口了。

通过串口访问板子,是刷机后进行配置时必不可少的一步,不妨先做了。

以我这里的 XShell 为例,新建一个连接,协议选择 Serial

然后选择一下端口和波特率即可

连上之后按reset,显示的内容可能与我这里有些不同,但一般来说能看到一些可读信息,这就可以了。比如我这里的 ready。

其他软件,例如 Putty 也是同理,设置界面大同小异。

Linux 用户自行选择,也只给出一个 picocom 的例子,或者用 Putty 也没什么问题。

picocom /dev/ttyUSB0 -b 115200

测试完之后记得断开连接!不然刷机程序无法工作。

打开刷机工具,切换到 Config 下,点第一项右边的齿轮选择固件

波特率(Baudrate)也改一下

切到第一个选项卡,点 Flash 即可

刷机中。。。

刷机完成

这个开发板在刷机的时候不需要你做什么,如果点下 Flash 进度条还没开始走,那你试着按按板子上的 flash 按钮,一般来说会自动检测,还是很顺的。

而上文中提到的另一种自己焊接的开发板就没有这么方便了,还记得那张转接板的原理图吗?

就是这张

按照图中的说法,我们要把 GPIO0、GPIO15 和 GND 接在一块,再加上 USB-TTL 线本身的 GND 线,所以这里是四根线。绿线+黄线那个就是 USB-TTL 线的接地。四个在面包板上插一排,就这样接在一块了。

这里最好再把 reset 那个孔插一根公对公的线。这时候你在刷机程序上点了 Flash,如果不开始读条的话,你就用 reset 空出的那个头去碰一下 GND 的金属部分,以便顺利继续刷机程序。记住这个过程千万别乱动板子,很容易停止刷机进程,但貌似也刷不坏就是了。

其他系统用户建议使用 esptool 进行刷机:https://github.com/espressif/esptool

这样刷机就说完了。

亮灯

关掉刷机程序,连线也恢复正常。这时再次用软件连上串口,按 reset 后大致会出现这样的画面:

一般情况下会直接从 MircoPython vX.Y.Z ... 开始(呃,我截图的时候还是1.9.2,现在是1.9.3了)

进去之后直接是一个 MicroPython 的 REPL,支持 TAB 补全,按 Ctrl + E 能进入粘贴模式,感觉还挺6的,但很遗憾不支持中文。这里请大家无视我丢人的 ls 操作。

目前为止都是一些软件操作,下面我们来做一个能够直接影响现实的操作:亮灯。

from machine import Pin

p2 = Pin(2, Pin.OUT)
p2.value(0)

esp8266上自带一个蓝色的 LED 灯,如无意外这时候已经被点亮了。想要熄灭也很简单,调用 p2.value(1) 即可。

据说之所以能亮是因为GPIO2和是和灯绑定在一块的,具体为啥是GPIO2不是别的这个我也不是很清楚,毕竟我也只是个硬件菜鸡,只是比萌新们多飞了一会。

总之这样一来我们终于也是完成了一件与硬件直接相关的操作了,可喜可贺。

联网

诸位应该记得 esp8266 的定位是一个 wifi 物联网芯片,可以使用 wifi 连接是其最大的亮点。那么如何接入网络呢?

import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan()
wlan.isconnected()
wlan.connect('WIFI 热点', '密码')
wlan.config('mac')
wlan.ifconfig()
print(wlan)

这样我们就获得了一个联网设备。特别注意一点,由于无法输入中文,中文热点需要自行转码成 utf-8 编码的 bytes 加进去才能上网。这样设置了之后,每次启动设备都会自动连入指定热点,即使热点消失也会等待自动重连。

现在我们有一件有趣的事情可以做了,那就是使用 WebREPL。在终端输入:

import webrepl_setup

然后会有几句这样那样的提示,问你要不要开机启动,建议选“是”,不然每次用都要执行下面这两句:

import webrepl
webrepl.start()

调整好后访问 http://micropython.org/webrepl/ ,修改IP为自己设备的然后 Connect,这时候会跟你要密码,默认密码为 micropythoN,注意大小写。

这样就可以在网页里对板子做操作了,这个页面还可以上传文件。现在我们就可以基本脱离 usb-ttl 线来使用设备了。

不过这个页面总是写默认IP为192.168.4.1(默认情况下板子会自己开一个热点给你连接,你连上之后IP就是这个),每次都要改很麻烦,这里提供一个猴子脚本去自动改地址:

// ==UserScript==
// @name Micropython Websocket REPL
// @namespace Violentmonkey Scripts
// @include       http://micropython.org/webrepl/
// @grant none
// ==/UserScript==

document.getElementById('url').value = 'ws://192.168.0.103:8266/'

除了连接 wifi 之外,esp8266还可以开热点,两者是可以同时进行的。

import network
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid='test')
print(ap)

全参数的话是

ap.config(essid='test', channel=11, authmode=network.AUTH_WPA_WPA2_PSK, password='123123123')

特别提醒一下,wifi密码有最小长度限制,如果写短了的话的话会报一个这样的错误:

Traceback (most recent call last):                                                       
  File "<stdin>", line 1, in <module>                                                    
OSError: can't set AP config 

让人很是摸不着头脑。

EX:安装软件包和文件管理

MicroPython 提供了一个简单的包管理工具,称为upip,令人惊奇的是upip也是从pypi安装软件包的。不过我感觉因为由于网络、内存、储存空间等等限制,目前实用性还是比较差。

由于我们现在有且只有 REPL,熟悉的 shell 命令方式调用 pip 是无法使用的。这里需要使用调用的方式安装软件包:

import upip
upip.install('xxx')

软件包会安装在 /lib 目录,而REPL所在的目录是 / 。默认情况下当然是没有 /lib 这个目录了,比较奇怪的是这种情况下我这里会直接报一个 memory allocation failed 的错误。当然这种时候使用 os.mkdir('lib') 就能解决问题。

此外 MicroPython 很大一个问题还是文件管理不方便,REPL 还是不如真正的 shell 来的顺手。为了解决这一问题人民群众也是想了很多办法,我看到一个大家比较认可的方案是这样的:

https://github.com/wendlers/mpfshell

用起来也比较简单,但注意这货不知怎的在 Windows 下不会直接在 Scripts 下生成 exe 文件,这样就不能通过 cmd 直接启动它。所以我就先在 mingw 里试了一下:

pip3 install mpfshell
mpfshell
mpfs> open ws:192.168.0.103,123123

注意这里,open ws:192.168.0.103 后面不要带端口号,后面的 123123 是访问密码。

这是通过 websocket (和WebREPL一致)来访问设备,当然也可以通过串口访问:

另外 cmd 其实也可以进行访问,不过要手动 import 调用一下:

不过由于使用了 sh 方式的控制字符来设置终端的特殊格式(也就是文字颜色什么的),也很明显没有做 Windows 兼容。而我们知道这些控制字符实际上是特定的不可见字符+参数,所以在 cmd 下会显示乱码,如下图:

所以还是推荐大家在 mingw 或类似环境下使用。不过 mpfshell 下的 repl 仍然会有乱码问题,这就没办法了。微软的 WSL 我没有试过,不知能否提供更好些的兼容。此外这个 shell 的具体功能这里就不赘述了,参见项目页面即可。

在知道这玩意之前,我自己也写了一个辣鸡脚本来做一些简单操作。与 mpfshell 不同,我这个脚本是直接在板子上运行的:

https://gist.github.com/fy0/982488ddbb5eafcda565923621895cb6

不完全地支持 ls cat mkdir rm quit(q) 五个命令,当然我这个实现也是很菜的,也只是用来应应急。使用的话把文件用各种手段(比如WebREPL)传上去就算完事了,然后 from mpt import sh,再 sh() 即可。

为了方便可以把这句话加到 boot.py 的最后一行,这样每次开机就自动运行了,不需要再每次 import 后才能使用,就如同这样:

虽然加在末尾不那么 PEP8,不过更为现实的考量是如果我们在修改这个脚本的过程中出现问题,那么这一行的异常会中断其他项目的加载。因此选择在预设项目都加载完成后再加载自定义脚本。

后记

文档与参考:

固件下载:http://micropython.org/download

刷机工具(Win):https://github.com/nodemcu/nodemcu-flasher

刷机工具(通用):https://github.com/espressif/esptool

MicroPython esp8266官方文档:http://docs.micropython.org/en/latest/esp8266/

MicroPython 官方论坛:http://forum.micropython.org

其实这篇文章又是拖了很久,从一些截图的时间和版本就可以看出来。其实我计划中10月期间能够分享一下使用 OrangePi 和初次使用电烙铁的经验,但不幸的是今天已经是11月12日,果然还是太摸了啊……

以上就是我想说的,祝大家玩的愉快。