TL;DR: 对于熟悉软件开发的用户,MicroPython 在编程方面上手很简单,容易踩坑的是数字电路、驱动兼容等硬件问题。作为“吃软不吃硬”的开发者,以不用电焊枪为原则,只用现成的零件组装,可以较快开发出所需的功能。
单片机开发用得最多的是 C 、C++,而大多互联网应用的开发,主要语言还是 Java 、PHP 、Javascript 、Python 、Go 等等。都说互联网太卷,AI + 物联网是下一个大趋势,但对于软硬一体的嵌入式开发,这之间的跨度还是不小。在 2013 年底一次众筹活动后,剑桥大学科学家 Damien George 开始着手把 Python3 移植到微处理器上运行,称为 MicroPython project ,实现了一个完全 Python 的编译器和运行时。这样,大量熟悉 Python 的软件开发者,只需要编写 Python3 程序,就可以很方便的对物联网硬件、各种传感器进行访问和控制。
都 2022 年了,MicroPython 支持的 开发板 已经相当丰富,除了官方出品的 Pyboard 以外,经典的 STM32 ,ESP8266 ,ESP32 ,CC3200 等 MCU 均有适配,树莓派新出的 Pico 、赛灵思(最近被 AMD 收购) Xilinx 的 PYNQ 项目也都支持 MicroPython 。这里上手用的是经典又经济的 ESP8266 开发板,相比用较新的板子,更少会遇到开发板、传感器等驱动、兼容性问题。除非是数电大牛,根据厂家技术手册能自己 DIY 电路、编写驱动程序,一般还是尽量避免 Debug 硬件。
MicroPython 开发者工具虽然和 Arduino 生态相比还有差距,但 MicroPython 官方提供的工具套件该有的也都有,烧录工具 esptool ,预编译工具 mpy-corss ,交互式解释器 REPL 等等。第三方 IDE 支持的也不少,VSCode 、PyCharm 、Jupyter 、Thonny 、Mu Editor 都有专门的插件或功能模块,支持 MicroPython 的开发。常见的 Terminal 终端比如 PuTTY 、Xshell 也可以直接连接 MicroPython 开发板进行调试。
ESP8266 是由乐鑫科技 Espressif 推出的 MCU 模组,全球出货量超过一亿片,在智能物联网(特别是智能家电)市场上是一块广受欢迎的大路货。ESP8266 最大的特色就是内置 WiFi 模块,这对需要联网的设备而言,节省了外接 WiFi 模块的成本(物联网芯片价格上要是便宜一块钱,大规模采购就节省很多钱)。
ESP8266 的核心 CPU 是一块 Tensilica L106 32 bit 处理器,RISC 指令集,时钟频率最高 160 MHz ,支持实时操作系统 RTOS ,可以将 80% 的算力留给应用编程和开发。由于后来 Tensilica 被 Cadence 公司收购( Cadence 的名字可能大家比较熟悉,那批断供 HW 的 EDA 公司之一,Cadence 是全球最大的电子设计自动化、半导体技术解决方案和设计服务供应商),没有查到 CPU 的公开规格,参照乐鑫之后推出的升级版 ESP32 采用台积电 40 纳米工艺制程,推测 ESP8266 的芯片制程可能在 65 纳米 / 90 纳米工艺,由于具有深度睡眠功能,所以实现低功耗是没有问题的。
由于 RISC 是开源指令集,不会出现 ARM 、X86 这样的 IP 知识产权限制,不仅在物联网 IC 领域非常受欢迎,最近有媒体报道,基于 RISC-V 指令集的“香山”芯片( 14nm 工艺),也已经可以支持运行 Linux 。
上手的这块 ESP8266 开发板型号是 ESP-12F ,集成了一个沁恒 WCH 的 CH340G ( USB 转串口)芯片,支持 5V 电源电压和 3.3V 电源电压供电。
乐鑫官方推荐的应用场景包括:
在沁恒 WCH 官网下载 CH341SER.exe 的驱动程序( Windows 、Linux 、Mac 都支持),安装完成后,把开发板接入电脑的 USB 口,这时在系统的设备管理中心,就可以看到多了一个串口设备(比如显示 COM4 )。
从 MicroPython 官网下载 最新版固件,当前版本是:esp8266-20220117-v1.18.bin 然后用 MicroPython 官方提供的烧录工具 esptool ,或者在乐鑫下载 flash download tool 工具,把 MicroPython 固件烧入 ESP8266 开发板。这里用的是 Download Tool ,开发板上电后点击 START ,等待几秒钟就烧录完成了。
打开 Terminal 终端(比如 PuTTY or Xshell ),选择开发板对应的串口,就可以进入 MicroPython 开发环境了。
>>> help()
Welcome to MicroPython!
For online docs please visit http://docs.micropython.org/en/latest/esp8266/ .
For diagnostic information to include in bug reports execute 'import port_diag'.
Basic WiFi configuration:
import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan() # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected() # Check for successful connection
# Change name/password of ESP8266's AP:
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid="<AP_NAME>", authmode=network.AUTH_WPA_WPA2_PSK, password="<password>")
Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode
For further help on a specific object, type help(obj)
ESP8266 支持 WiFi 的 AP/STA/AP+STA 工作模式,简单说就是既可以作为接入设备,也可以作为被连接设备(类似于手机开 WiFi 热点)。这里把开发板作为终端设备,填写办公室或家里 WiFi 的 "AP_name", "password" 即可接入网络。(建议把 WiFi 的连接程序写到 boot.py 文件中,以后每次开发板上电就可以自动连上 WiFi 啦)。
现在,完整的 MicroPython 开发环境就准备好了。
只需要在 MCU 开发版的设备根目录下,创建 main.py 文件,就可以开发一个 MicroPython 的 App 。开发板上电、或重启(按键 RST )时,会自动执行 main.py 程序。
# main.py
import urequests
r = urequests.get('http://baidu.com')
print('status code: ', r.status_code)
print(r.text)
运行结果:
status code: 200
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
当然,不能指望在 ESP8266 上运行 Web 图形浏览器啦。
# main.py
import machine
import time
led = machine.Pin(2, machine.Pin.OUT)
while True:
led.on()
time.sleep(0.5)
led.off()
time.sleep(1)
由于这块板子上只有一颗 LED 灯,只能简单点亮闪一闪,想要实现 Yeelight 那种彩光灯带的效果,建议去买 WS2812B 灯带条,插在 ESP8266 板子上,60 颗灯做出来的效果就酷炫多了。
# main.py
import machine
from machine import RTC
import time
import ntptime
import ssd1306
rtc = RTC()
ntptime.settime()
rtc_datetime = rtc.datetime()
i2c = machine.I2C(scl=machine.Pin(2), sda=machine.Pin(0))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
display.fill(0)
display.text('Happy New Year!', 0, 0)
display.text('Today is:', 0, 16)
print('rtc_datetime: ', rtc_datetime)
time_str = str(rtc_datetime[0]) + '-' + str(rtc_datetime[1]) + '-' + str(rtc_datetime[2])
display.text(time_str, 0, 32)
display.show()
time.sleep(60)
display.poweroff()
这块显示屏是 I2C 接口,有四个引脚,GND 接地、VCC 供电、SCL 、SDA 分别接 GPIO 数据引脚 D4 、D3 即可。电源可以用 USB 线供电,或者用锂电池供电,这里是一块普通充电宝直接供电。
物联网设备的一个重要功能,就是通过 ADC 传感器,将各种模拟信号转换成数字信号,然后传给本地设备或云端网络进行计算、数据处理。温湿度传感器就是比较常见的 ADC 模块,用来监控环境温度、湿度。
# main.py
import machine
from machine import RTC
import time
import ntptime
import ssd1306
import dht
rtc = RTC()
ntptime.settime()
rtc_datetime = rtc.datetime()
i2c = machine.I2C(scl=machine.Pin(2), sda=machine.Pin(0))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
d = dht.DHT22(machine.Pin(4))
while True:
d.measure()
t = d.temperature()
h = d.humidity()
display.fill(0)
display.text('Hi MicroPython!', 0, 0)
time_str = str(rtc_datetime[0]) + '-' + str(rtc_datetime[1]) + '-' + str(rtc_datetime[2])
display.text('Date:' + time_str, 0, 16)
display.text('Temp:' + str(t), 0, 32)
display.text('Humidity:' + str(h), 0, 48)
display.show()
time.sleep(1)
DHT22 和 DHT11 都是常用的温湿度传感器,这里选用的是 DHT22 ,比 DHT11 测量精度更准确。DHT22 是单总线通信,除了正负引脚分别接 3V 和 G 以外,中间那根数据线接在开发板的 D1 或 D2 引脚上都可以。
DHT22 温度测量范围:-40~80℃,温度测量精度:±0.5℃,湿度测量范围:0~100%RH ,湿度测量精度:±2%RH 。
# main.py
from microdot import Microdot
app = Microdot()
@app.route('/')
def hello(request):
return 'Hello, world!'
app.run()
Microdot 是一个类似 Flask 的 Python & MicroPython Web 框架,可以在低性能的单片机上运行,为开发板提供 Web Server 服务。这样,就可以把 ESP8266 开发板作为一个 Web 服务器, 访问本机 IP 就可以打开网站了。
通过 micropython.mem_info() 可以查看开发板的内存信息,系统可用内存不到 40K ( CPU 是 80MHz/160MHz ),这个配置显然是跑不动大型 Web 网站的。
物联网设备进行远程连接和控制,通常都会使用 MQTT 协议,可以自己搭建 MQTT Broker 服务器,也可以使用云服务。这里使用 EMQ X Cloud 的 MQTT 消息服务进行连接,打开 https://cloud.emqx.com 登录 /注册账号,创建实例之后,在 MQTT 项目控制台就可以看到连接地址( server )和端口( port ),添加一个认证用户名 /密码(这里设为 admin/password )。
# main.py
from umqtt.simple import MQTTClient
import time
client_id = "cid_esp8266"
server = "<mqtt_server_address>"
topic = "device/esp8266"
def sub_cb(topic, msg):
print(topic, msg)
client = MQTTClient(client_id, server, port=11216, user="admin", password="password", keepalive=0)
client.connect()
client.publish(topic, "Initial message from esp8266.")
client.set_callback(sub_cb)
client.subscribe(topic)
while True:
client.check_msg()
time.sleep(2)
client.publish(topic, "Telling Time: " + str(time.time()))
time.sleep(2)
将应用程序写入 ESP8266 开发板,然后给开发板上电或按下 RST 按钮重启,打开 MQTT 远端控制台,监控台显示新增加了一个已连接设备 cid_esp8266 ,开发板入网就完成了。
现在打开 ESP8266 设备终端,以及 MQTT 远端,查看上行、下发的实时消息。
设备联网后,就可以通过手机应用 App 或浏览器网页查看设备信息,也可以从远程操作终端设备。
如果对操作时效要求不高的话,也可以采用 http 协议,通过轮询的方式实现 pub/sub 模式,在外网远程管理终端设备。
还有很多玩家喜欢的创客项目,比如智能机器人、AI 人像 /物品识别 等应用,欢迎有兴趣的朋友一起交流学习。
相比 C/C++ 程序,MicroPython 在运行速度方面处于劣势,如果用在飞行器、自动驾驶等高速设备上,程序运行的速度微秒必争,但对于大多数静止、或低速运动的设备,几毫秒、微秒级的性能差距完全可以忽略,在编程方面 MicroPython 开发效率就具有较大的优势,REPL 也为调试代码带来很多便捷性。目前,大多数 Arduino 能做的应用,基本上 MicroPython 都能做,Arduino 生态更成熟,MicroPython 简单易上手。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.