MicroPython 开发单片机应用上手 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xyjtou

MicroPython 开发单片机应用上手

  •  
  •   xyjtou 2022 年 2 月 8 日 5581 次点击
    这是一个创建于 1537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    esp8266_mcu.jpg

    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_gpio.jpg 视频介绍

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

    • 家电器
    • 家庭动化
    • 智能插座、智能灯
    • 业线控制
    • 婴监控器
    • IP 摄像机
    • 传感器络
    • 可穿戴电产品
    • 线位置感知设备
    • 安全 ID 标签
    • 线定位系统信标

    附件: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 ,等待几秒钟就烧录完成了。

    flash_download_tool.png

    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() 

    esp8266_display.jpg

    这块显示屏是 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.temerature() 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 引脚上都可以。

    esp8266_dht.jpg 视频介绍

    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 就可以打开网站了。

    microdot_demo.png

    通过 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 ,开发板入网就完成了。

    emqx_mqtt.PNG

    现在打开 ESP8266 设备终端,以及 MQTT 远端,查看上行、下发的实时消息。

    esp8266_mqtt_1920x900.jpg 视频介绍

    设备联网后,就可以通过手机应用 App 或浏览器网页查看设备信息,也可以从远程操作终端设备。

    如果对操作时效要求不高的话,也可以采用 http 协议,通过轮询的方式实现 pub/sub 模式,在外网远程管理终端设备。

    7. 更多应用

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

    小结

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

    18 条回复    2023-02-19 20:17:40 +08:00
    levelworm
        1
    levelworm  
       2022 年 2 月 8 日 via Android
    快速 prototyoe 倒底确实不错
    advancejar
        2
    advancejar  
       2022 年 2 月 8 日
    买个几十块的香橙派,装个普通 python 用的也挺好的
        4
    xlsepiphone  
       2022 年 2 月 8 日
    3 年前玩过,开发体验很差,就没关注了。
    listkun
        5
    listkun  
       2022 年 2 月 8 日
    python mqtt 连接腾讯云经常掉线.使用 c 就稳定没问题
    NewYear
        6
    NewYear  
       2022 年 2 月 8 日
    ESP8266 是神器,但是有时候 WIFI 环境是缺乏的。

    能不能推荐下单网口最便宜的开发板……
    masterclock
        7
    masterclock  
       2022 年 2 月 8 日
    micropython 写起来太不爽快,tinygo 更好玩点

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



    @NewYear #6 便宜的就是香橙派,nano 这种国产
    esp 这类想要 rj45 你可以买模块扩展一下.比单独买便宜和灵活多了.
    sebastianwade
        9
    sebastianwade  
       2022 年 2 月 8 日
    @masterclock @xyjtou
    也可以试试 rust esp32 ^_^

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

    谢谢,研究研究……
    v2defy
        16
    v2defy  
       2022 年 2 月 17 日 via Android
    群二维码过期了,楼主更新一下,想加群,刚买了块 esp32 的未来板
    fox0001
        17
    fox0001  
       2023 年 2 月 19 日
    @xlsepiphone #4 近来玩过,MicroPython 官方的库都有 bug……第三方写的反而更好用
    fox0001
        18
    fox0001  
       2023 年 2 月 19 日
    @CallMeReznov #8 合宙 esp32c3-core ,可以留意下。最低 9.9 包邮。带 2.4GHz WiFi 和蓝牙 5 BLE
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2901 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 74ms UTC 03:25 PVG 11:25 LAX 20:25 JFK 23:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86