MicroPython 开发单片机应用上手

2022-02-08 11:45:58 +08:00
 xyjtou

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 开发工具

MicroPython 开发者工具虽然和 Arduino 生态相比还有差距,但 MicroPython 官方提供的工具套件该有的也都有,烧录工具 esptool ,预编译工具 mpy-corss ,交互式解释器 REPL 等等。第三方 IDE 支持的也不少,VSCode 、PyCharm 、Jupyter 、Thonny 、Mu Editor 都有专门的插件或功能模块,支持 MicroPython 的开发。常见的 Terminal 终端比如 PuTTY 、Xshell 也可以直接连接 MicroPython 开发板进行调试。


ESP8266 开发板

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 电源电压供电。

视频介绍 »

乐鑫官方推荐的应用场景包括:

附件:ESP8266 官方技术规格书


安装 & 环境搭建

  1. 电脑安装 USB 转串口的驱动

在沁恒 WCH 官网下载 CH341SER.exe 的驱动程序( Windows 、Linux 、Mac 都支持),安装完成后,把开发板接入电脑的 USB 口,这时在系统的设备管理中心,就可以看到多了一个串口设备(比如显示 COM4 )。

  1. 烧录 MicroPython 固件

从 MicroPython 官网下载 最新版固件,当前版本是:esp8266-20220117-v1.18.bin 然后用 MicroPython 官方提供的烧录工具 esptool ,或者在乐鑫下载 flash download tool 工具,把 MicroPython 固件烧入 ESP8266 开发板。这里用的是 Download Tool ,开发板上电后点击 START ,等待几秒钟就烧录完成了。

  1. 连接 WiFi

打开 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 开发环境就准备好了。

  1. 开发应用 App

只需要在 MCU 开发版的设备根目录下,创建 main.py 文件,就可以开发一个 MicroPython 的 App 。开发板上电、或重启(按键 RST )时,会自动执行 main.py 程序。


应用示例

1. 访问 Web 网络

# 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 图形浏览器啦。

2. 心跳 LED 灯

# 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 颗灯做出来的效果就酷炫多了。

3. 数字显示屏

# 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 线供电,或者用锂电池供电,这里是一块普通充电宝直接供电。

4. 温度 /湿度监测

物联网设备的一个重要功能,就是通过 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 。

5. Web 服务器

# 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 网站的。

6. 远程控制

物联网设备进行远程连接和控制,通常都会使用 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 模式,在外网远程管理终端设备。

7. 更多应用

还有很多玩家喜欢的创客项目,比如智能机器人、AI 人像 /物品识别 等应用,欢迎有兴趣的朋友一起交流学习。

小结

相比 C/C++ 程序,MicroPython 在运行速度方面处于劣势,如果用在飞行器、自动驾驶等高速设备上,程序运行的速度微秒必争,但对于大多数静止、或低速运动的设备,几毫秒、微秒级的性能差距完全可以忽略,在编程方面 MicroPython 开发效率就具有较大的优势,REPL 也为调试代码带来很多便捷性。目前,大多数 Arduino 能做的应用,基本上 MicroPython 都能做,Arduino 生态更成熟,MicroPython 简单易上手。

4460 次点击
所在节点    Python
18 条回复
levelworm
2022-02-08 12:24:22 +08:00
快速 prototyoe 倒底确实不错
advancejar
2022-02-08 12:30:14 +08:00
买个几十块的香橙派,装个普通 python 用的也挺好的
leimao
2022-02-08 12:54:51 +08:00
xlsepiphone
2022-02-08 13:07:24 +08:00
3 年前玩过,开发体验很差,就没关注了。
listkun
2022-02-08 13:42:47 +08:00
python mqtt 连接腾讯云经常掉线.使用 c 就稳定没问题
NewYear
2022-02-08 15:19:16 +08:00
ESP8266 是神器,但是有时候 WIFI 环境是缺乏的。

能不能推荐下单网口最便宜的开发板……
masterclock
2022-02-08 15:25:34 +08:00
micropython 写起来太不爽快,tinygo 更好玩点

@NewYear
nanopi neo 100 100 多
mangopi 自己连个 phy ,也是 100 多,risc-v 的核
CallMeReznov
2022-02-08 16:03:53 +08:00
这 1-2 年间断的在接触 esp8266,esp32 做业余游玩.
单片机这种 1kb 都得省着用的环境还是搞搞 arduino. 用 micropython 属实找不痛快.



@NewYear #6 便宜的就是香橙派,nano 这种国产
esp 这类想要 rj45 你可以买模块扩展一下.比单独买便宜和灵活多了.
sebastianwade
2022-02-08 19:49:34 +08:00
@masterclock @xyjtou
也可以试试 rust esp32 ^_^

https://github.com/esp-rs
sebastianwade
2022-02-08 19:50:00 +08:00
@advancejar
香橙派好像也涨价了
advancejar
2022-02-08 20:06:50 +08:00
@sebastianwade zero,多个渠道 70 左右可以卖到
sickoo
2022-02-08 20:14:40 +08:00
我用 platformio 来开发板子( esp-32 ),我觉得 esp32 开发体验比 esp8266 好
Thatscode99
2022-02-08 22:30:03 +08:00
@listkun 同感,新手上手 micropython 简单,同样的水平用 c 写出来的稳定太多了。
ALLROBOT
2022-02-11 19:13:57 +08:00
但我还是选择 arduino....这平台对新人太友好了,至于 python 单片机,我折腾了大半天没搞懂 seeeduino xiao 为啥不执行 main 函数.....arduino 分分钟就搞定了
NewYear
2022-02-12 14:19:06 +08:00
@masterclock
@CallMeReznov

谢谢,研究研究……
v2defy
2022-02-17 18:41:40 +08:00
群二维码过期了,楼主更新一下,想加群,刚买了块 esp32 的未来板
fox0001
2023-02-19 20:14:48 +08:00
@xlsepiphone #4 近来玩过,MicroPython 官方的库都有 bug……第三方写的反而更好用
fox0001
2023-02-19 20:17:40 +08:00
@CallMeReznov #8 合宙 esp32c3-core ,可以留意下。最低 9.9 包邮。带 2.4GHz WiFi 和蓝牙 5 BLE

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/832400

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX