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
V2EX  ›  Python

MicroPython 开发单片机应用上手

  •  
  •   xyjtou · 149 天前 · 3357 次点击
    这是一个创建于 149 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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.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 引脚上都可以。

    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 简单易上手。

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

    能不能推荐下单网口最便宜的开发板……
    masterclock
        7
    masterclock  
       149 天前
    micropython 写起来太不爽快,tinygo 更好玩点

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



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

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

    谢谢,研究研究……
    v2defy
        16
    v2defy  
       139 天前 via Android
    群二维码过期了,楼主更新一下,想加群,刚买了块 esp32 的未来板
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4125 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:48 · PVG 15:48 · LAX 00:48 · JFK 03:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.