ESP32是近年很火的国产低成本MCU系列。

买了芯片ESP32-C3的模组安信可 ESP-C3-32S的开发板安信可 NodeMCU ESP-C3-32S-Kit 。开发板很小,没有任何多余的东西,还不如叫它「最小系统+最小连接板」。

烧录只需要以上加一条microUSB线就可以,不用买任何的232 TTL、烧录器之类的,开发板上有USB转串口的芯片。

另外,看文档说,改变接线后,可以启用USB JTAG(无需任何额外芯片),然后可以单步调试、看寄存器之类的(有对应的开源跨平台软件openocd)。这一开发板也引出了USB数据的两个pin

便宜是便宜,但买得不够好。不好的原因及造成的限制:

  1. ESP32-C3这个芯片型号是RISC-V架构。若使用MicroPython,那么MicroPython的native code或viper(这两个东西能让python写的东西运行更快)都尚未支持。ESP32-Cx属于ESP32系列中的便宜精简系列。要求高的建议买ESP32系列的其他架构的型号。

  2. 这个模组配的Flash只有2M。MicroPython官方提供的bin文件(1.4M左右)虽然足够烧进去,但功能有问题。建议至少选4M Flash的。

    不过还好

    1. 这里有个老外编译了2M Flash版本的ESP32C3的MicroPython的bin。版本号 1.16.0 210824 v1.16-236-gb51e7e9d0,python 3.4.0。其中也包括他修改自己的安信可开发板,焊上缺失的两个开关管的说明。
    2. (建议)我自己编译了MicroPython 1.19 for ESP32-C3 2M Flash

    若选CircuitPython: 这是MicroPython的衍生版。它提供针对这一开发板的2M Flash固件adafruit-circuitpython-ai_thinker_esp32-c3s-2m-en_US-7.3.3.bin。Python 3.4.0

  3. 这个开发板买回来缺少两开关管,和几个0402的电阻电容。可能就是这个原因,导致ampy(一个PC上的与MicroPython通信的工具,非必须)无法使用。不过我也试出了补救方法。你可以像上面那个老外那样自己焊上去,也可以用我这里将要介绍的经验,在不用ampy的情况下使用

以下描述都是在Linux下进行。Windows用户请将串口/dev/ttyUSB0自行替换为Windows的COM

烧录MicroPython/CircuitPython到ESP32C3 (2M Flash)

  1. 使用esptool.py清除整个Flash(必须)。其中的esptool.py来自ESP官方IDF

  2. 烧录:

    1. esptool.py --chip esp32c3 --port /dev/ttyUSB0 write_flash -z 0x0 firmware_gereric_c3_2mb_210824.bin

    (下载上面链接的老外提供的MicroPython .bin文件。(你若愿意自己编译更好).bin

    或选择CircuitPython

    1. esptool.py --chip esp32c3 --port /dev/ttyUSB0 write_flash -z 0x0 adafruit-circuitpython-ai_thinker_esp32-c3s-2m-en_US-7.3.3.bin

通过USB串口线连接获得python shell

使用Linux上picocom这个串口工具

  1. picocom -b 115200 --lower-dtr --lower-rts /dev/ttyUSB0

启动后自动连wifi

连路由器的wifi也可以。若是想在Linux电脑上设个专门的wifi也行:

  1. sudo lnxrouter --ap wlan0 ssid -p 密码 -g 192.168.5.1

我们想要在Flash上创建wifi.pymain.py(在boot.py之后固件会自动调用main.py),实现启动后自动连接wifi。由于目前ampy不可用,所以,在python shell中利用文件读写函数来创建文件

  1. fileContent = """
  2. import network
  3. nic = network.WLAN(network.STA_IF)
  4. nic.active(True)
  5. nic.ifconfig( [ "192.168.5.20", "255.255.255.0", "192.168.5.1", "192.168.5.1" ])
  6. nic.connect("ssid", "密码")
  7. """
  8. wfile = open('wifi.py','w')
  9. wfile.write(fileContent)
  10. wfile.flush()
  11. wfile.close()
  12. fileContent = """
  13. import wifi
  14. """
  15. wfile = open('main.py','w')
  16. wfile.write(fileContent)
  17. wfile.flush()
  18. wfile.close()

以上是MicroPython的。CircuitPython的wifi函数都不一样,略

webREPL

webREPL是MicroPython带的东西,可以在电脑和ESP的Flash之间传文件上传、下载文件,也可以提供无线python shell。有了这个就能够快速更新.py代码,相当于可以OTA。(它是通过websocket协议通信的。)

用python shell时还是串口线好用,无线webREPL的输入和回显有延时

CircuitPython那边,似乎还没有这样完整的一套无线shell和无线传文件的东西。有相关讨论、有一些文档,略看了一下,还不完整不易用。

让webREPL自动启动

在MicroPython的python shell中:

  1. >>> import webrepl_setup
  2. WebREPL daemon auto-start status: enabled
  3. Would you like to (E)nable or (D)isable it running on boot?

输入E。然后会让你设置密码。完成之后它会改写boot.py,并创建webrepl_cfg.py用于记录密码

用webREPL在电脑和ESP之间传文件

用来当OTA升级程序真的快。

webREPL仓库里的文件下载下来。里面的HTML可以用浏览器打开(Firefox不支持),即可以获得一个GUI界面。

虽然有web GUI,但频繁的上传.py文件当然是用CLI更快:

  1. ./webrepl_cli.py -p 密码 /电脑上的路径/test.py 192.168.5.20:test.py

上传了test.py后,平时就可以在python shell里使用

  1. exec(open('test.py').read())

(用import test也会执行,但与exec不一样)

来直接执行该文件

GPIO点个灯

  1. import machine
  2. pin5 = machine.Pin(5, machine.Pin.OUT)
  3. pin5.value(0)
  4. pin5.value(1)

ADC采个样

  1. from machine import Pin
  2. from machine import ADC
  3. pin0 = Pin(0, Pin.IN)
  4. ad0 = ADC(pin0)
  5. ad0.read_u16()

偶尔用UDP代替串口接收输出

串口的默认115200的baud很慢。在有大量文字输出时,不如电脑用wifi UDP接收。经测试,电脑显示最快达到过1MB/s接收速度。

在电脑上:

  1. nc -k -u -l 0.0.0.0 9995

在MicroPython那边:

  1. import socket
  2. u = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  3. def log(s) :
  4. u.sendto(str(s)+'\n' , ('192.168.5.1', 9995) )
  5. log("xxxxxx")

但要注意:

  1. 测试while连续地使用UDP的sendto()函数,有时会出现ENOMEM错误(有时换个wifi ap可以避免)。要try处理一下gc.collect()time.sleep_ms()、重发。
  2. 而且,UDP是不保证收到的

串口高波特率

ESP32C3手册说支持5M baud。开发板上的CH340C串口转USB芯片说支持2M baud。实测调成2M(即200kB/s)在连续发送时有字节丢失。调成1M baud(即100kB/s)则无问题。

简单的性能测试

内存:经测试,gc.mem_free()显示的可用内存,MicroPython最大时有约110kB(在gc.collect()过之后)。据说自己编译MicroPython,改些参数,就可以让用户可分配的内存更多。而CircuitPython有87kB。这一芯片的实际内存是300kB+。

速度:Python解析执行起来肯定比C慢(据说慢100倍)。

MicroPython的time模块里有一些可以用于记录时间的函数:

  1. import time
  2. time.ticks_cpu() # 据说最精确
  3. time.ticks_us() # 微秒
  4. time.ticks_ms() # 毫秒

经试验,每通过python语句执行一个与硬件有关的操作,至少需要30us。

而CircuitPython则是用

  1. import time
  2. time.monotonic_ns()

可以看时间。

这速度,在有实时性高的需求时,不启用DMA或native code或viper肯定是不行的。但risc-v架构还不能使用MicroPython的native或viper。(所以目前ESP32的「C3」这个型号在这种情况下建议选用)

另外,测试了MicroPython的长时间运行一个有实时性要求的任务。刚开始10分钟内没什么问题的,但几分钟后,开始有多次时不时的定时器中断不能及时响应的现象。所以,它还算不上一个可靠的实时系统。

略介绍直接内存读写(类似指针)、操作寄存器、DMA

MicroPython只对部分的型号添加了DMA模块,我们这个还没有支持DMA。

但MicroPython支持用mem32,mem16,mem8来直接读写任何地址,也就可以配置MCU寄存器,来让DMA工作。也可以操作任何的硬件模块。

CircuitPython目前未实现直接读写任何地址。

创造自己的python模块

由于乐鑫官方ESP-IDF提供了大量example,多于MicroPython已支持的。

MicroPython的固件本身就是C写的,用ESP-IDF编译出来的。为了不浪费ESP官方的example,应该学习一下如何搞自己的python固件编译进MicroPython里。

官方文档:

  1. Implementing a Module — MicroPython latest documentation
  2. MicroPython external C modules — MicroPython latest documentation

或者参考上面我自己编译的例子

乐鑫ESP的初步体验总结

官方芯片手册文档写得不够完整,不如ESP-IDF完整。手册中会出现某部分篇章未完成(已是极少量了)之类的提示。

试过自己配置寄存器,结果出现过这样的状况:1. 发现过手册中的错误。 2. 按照手册里的软件流程做,失败。利用ESP-IDF里的examples才成功。

花10几元买ESP32-C3,体验一下MicroPython (和CircuitPython)的更多相关文章

  1. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  2. Java开发中经典的小实例-( 鸡蛋0.1元一个,鸭蛋3元一个,鹅蛋6元一个。求一百元买一百个蛋。)

    public class Test24 {    public static void main(String[] args) {        // 鸡蛋0.1元一个,鸭蛋3元一个,鹅蛋6元一个.求 ...

  3. Java实现 基础算法 百元买百鸡

    public class 百元买百鸡 { public static void main(String[] args) { //母鸡 for (int i = 1; i < 33; i++) { ...

  4. 10元买啤酒问题Java解法

    10元去买啤酒,2元一瓶.每两个瓶可以换一瓶啤酒,每四个瓶盖可以换一瓶啤酒.最多买几瓶? public class Java { public static void main(String[] ar ...

  5. 通向高可扩展性之路(WhatsApp篇)---- 脸书花了190亿买来的WhatsApp的架构

    原文链接:http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-bill ...

  6. EZchip花1.3亿美元买Tilera然后以8亿美元把自己与Tilera一起卖掉

    2014年7月EZchip花1.3亿美元收购的Tilera2015年10 Mellanox 8亿美元收购EZchip,2016年1月完成.EZchip转手卖掉Tilera与自己? http://www ...

  7. Python3求解字符串滤值与百元买百鸡算法

    [本文出自天外归云的博客园] 第一题:给你一个字符串,打印出来前后没有空格,单词之间只有一个空格的字符串. 第二题:公鸡3元/只,母鸡4元/只,小鸡1元3只,给你money元一共多少种买法. 普通版解 ...

  8. Win10《芒果TV》更新v3.4.10春光版:优化弹窗体验,修复热键和推送

    春来触地故乡情,忽见风光忆两京,金谷踏花香骑入,曲江碾草钿车行,Win10版<芒果TV>更新v3.4.10,进一步优化弹窗体验,修复热键和推送异常. Win10版<芒果TV>V ...

  9. 10享元模式Flyweight

    一.什么是享元模式 Flyweight模式也叫享元模式,是构造型模式之 一,它通过与其他类似对象共享数据来减小内存 占用. 二.享元模式的结构 三.享元模式的角色和职责 抽象享元角色: 所有具体享元类 ...

  10. 设计模式(C#)——10享元模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言       在软件开发中,当我们需要对某些对象重复创建,且最终只需要得到单一结果.如果使用一般思维,那我们将浪费很多内存空 ...

随机推荐

  1. DHorse日志收集原理

    实现原理 基于k8s的日志收集主要有两种方案,一是使用daemoset,另一种是基于sidecar.两种方式各有优缺点,目前DHorse是基于daemoset实现的.如图1所示: 图1 在每个k8s集 ...

  2. .netcore项目docker化,以及docker之间通信

    简言: 最近刚完成公司的新系统,系统使用的是微服务架构,由于领导说要将服务docker化.下面将我的研究结果分享出来,如若有错误的地方,还请各位多多指点. 目录: 什么是docker? 使用docke ...

  3. A_A01_001 KEIL4-KEIL5软件安装

    @ 目录 一.软件下载 二.交流学习 三.防止电脑误删文件操作步骤 四.KEIL4安装 五.KEIL5安装 六.注意事项 一.软件下载 KEIL4/KEIL5网盘链接 戳它跳转 提取码:omni 二. ...

  4. 使用pip命令安装库时提示Could not build wheels for six, since package 'wheel' is not installed

    在使用pip命令安装库时提示Could not build wheels for six, since package 'wheel' is not installed 解决以上问题可用 pip in ...

  5. week_9(异常检测)

    Andrew Ng 机器学习笔记 ---By Orangestar Week_9 This week, we will be covering anomaly detection which is w ...

  6. 【Python】pip的镜像安装异常解决方案

    在安装pip的出现异常提示: ERROR: Could not find a version that satisfies the requirement pillow (from versions: ...

  7. Java基础篇——注解和反射

    注解 注解Annotation可以被其他程序(编译器)读取,常见的有@override 内置注解 @Override 适用于修饰方法,表明重写父类中的一个方法 @Deprecated 用于修饰类.方法 ...

  8. 万字干货! 使用docker部署jenkins和gitlab

    阅读本文, 需要有基础的Git, Linux, Docker, Java, Maven, shell知识, 并最少有一台内存16G以上并已经安装好了Docker的机器. 1. 概述 2. 容器互联 3 ...

  9. C语言:使用malloc申请一个二级指针,外层为3个元素,内层为5个元素。使用并释放。

    //使用malloc申请一个二级指针,外层为3个元素,内层为5个元素.使用并释放. #include"head.h" int main() { int **p = (int **) ...

  10. angular---处于激活状态的路由加样式