花10几元买ESP32-C3,体验一下MicroPython (和CircuitPython)
ESP32是近年很火的国产低成本MCU系列。
买了芯片ESP32-C3
的模组安信可 ESP-C3-32S
的开发板安信可 NodeMCU ESP-C3-32S-Kit
。开发板很小,没有任何多余的东西,还不如叫它「最小系统+最小连接板」。
烧录只需要以上加一条microUSB线就可以,不用买任何的232 TTL、烧录器之类的,开发板上有USB转串口的芯片。
另外,看文档说,改变接线后,可以启用USB JTAG(无需任何额外芯片),然后可以单步调试、看寄存器之类的(有对应的开源跨平台软件openocd)。这一开发板也引出了USB数据的两个pin
便宜是便宜,但买得不够好。不好的原因及造成的限制:
ESP32-C3
这个芯片型号是RISC-V架构。若使用MicroPython,那么MicroPython的native code或viper(这两个东西能让python写的东西运行更快)都尚未支持。ESP32-Cx属于ESP32系列中的便宜精简系列。要求高的建议买ESP32系列的其他架构的型号。这个模组配的Flash只有2M。MicroPython官方提供的bin文件(1.4M左右)虽然足够烧进去,但功能有问题。建议至少选4M Flash的。
不过还好
- 这里有个老外编译了2M Flash版本的ESP32C3的MicroPython的bin。版本号
1.16.0 210824 v1.16-236-gb51e7e9d0
,python 3.4.0。其中也包括他修改自己的安信可开发板,焊上缺失的两个开关管的说明。 - (建议)我自己编译了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- 这里有个老外编译了2M Flash版本的ESP32C3的MicroPython的bin。版本号
这个开发板买回来缺少两开关管,和几个0402的电阻电容。可能就是这个原因,导致ampy(一个PC上的与MicroPython通信的工具,非必须)无法使用。不过我也试出了补救方法。你可以像上面那个老外那样自己焊上去,也可以用我这里将要介绍的经验,在不用ampy的情况下使用
以下描述都是在Linux下进行。Windows用户请将串口
/dev/ttyUSB0
自行替换为Windows的COM
烧录MicroPython/CircuitPython到ESP32C3 (2M Flash)
使用
esptool.py
清除整个Flash(必须)。其中的esptool.py
来自ESP官方IDF烧录:
esptool.py --chip esp32c3 --port /dev/ttyUSB0 write_flash -z 0x0 firmware_gereric_c3_2mb_210824.bin
(下载上面链接的老外提供的MicroPython
.bin
文件。(你若愿意自己编译更好).bin
或选择CircuitPython
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这个串口工具
picocom -b 115200 --lower-dtr --lower-rts /dev/ttyUSB0
启动后自动连wifi
连路由器的wifi也可以。若是想在Linux电脑上设个专门的wifi也行:
sudo lnxrouter --ap wlan0 ssid -p 密码 -g 192.168.5.1
我们想要在Flash上创建wifi.py
、main.py
(在boot.py
之后固件会自动调用main.py
),实现启动后自动连接wifi。由于目前ampy不可用,所以,在python shell中利用文件读写函数来创建文件
fileContent = """
import network
nic = network.WLAN(network.STA_IF)
nic.active(True)
nic.ifconfig( [ "192.168.5.20", "255.255.255.0", "192.168.5.1", "192.168.5.1" ])
nic.connect("ssid", "密码")
"""
wfile = open('wifi.py','w')
wfile.write(fileContent)
wfile.flush()
wfile.close()
fileContent = """
import wifi
"""
wfile = open('main.py','w')
wfile.write(fileContent)
wfile.flush()
wfile.close()
以上是MicroPython的。CircuitPython的wifi函数都不一样,略
webREPL
webREPL是MicroPython带的东西,可以在电脑和ESP的Flash之间传文件上传、下载文件,也可以提供无线python shell。有了这个就能够快速更新.py
代码,相当于可以OTA。(它是通过websocket协议通信的。)
用python shell时还是串口线好用,无线webREPL的输入和回显有延时
CircuitPython那边,似乎还没有这样完整的一套无线shell和无线传文件的东西。有相关讨论、有一些文档,略看了一下,还不完整不易用。
让webREPL自动启动
在MicroPython的python shell中:
>>> import webrepl_setup
WebREPL daemon auto-start status: enabled
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更快:
./webrepl_cli.py -p 密码 /电脑上的路径/test.py 192.168.5.20:test.py
上传了test.py
后,平时就可以在python shell里使用
exec(open('test.py').read())
(用
import test
也会执行,但与exec
不一样)
来直接执行该文件
GPIO点个灯
import machine
pin5 = machine.Pin(5, machine.Pin.OUT)
pin5.value(0)
pin5.value(1)
ADC采个样
from machine import Pin
from machine import ADC
pin0 = Pin(0, Pin.IN)
ad0 = ADC(pin0)
ad0.read_u16()
偶尔用UDP代替串口接收输出
串口的默认115200的baud很慢。在有大量文字输出时,不如电脑用wifi UDP接收。经测试,电脑显示最快达到过1MB/s接收速度。
在电脑上:
nc -k -u -l 0.0.0.0 9995
在MicroPython那边:
import socket
u = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def log(s) :
u.sendto(str(s)+'\n' , ('192.168.5.1', 9995) )
log("xxxxxx")
但要注意:
- 测试
while
连续地使用UDP的sendto()
函数,有时会出现ENOMEM
错误(有时换个wifi ap可以避免)。要try
处理一下gc.collect()
、time.sleep_ms()
、重发。 - 而且,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
模块里有一些可以用于记录时间的函数:
import time
time.ticks_cpu() # 据说最精确
time.ticks_us() # 微秒
time.ticks_ms() # 毫秒
经试验,每通过python语句执行一个与硬件有关的操作,至少需要30us。
而CircuitPython则是用
import time
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里。
官方文档:
- Implementing a Module — MicroPython latest documentation
- MicroPython external C modules — MicroPython latest documentation
或者参考上面我自己编译的例子
乐鑫ESP的初步体验总结
官方芯片手册文档写得不够完整,不如ESP-IDF完整。手册中会出现某部分篇章未完成(已是极少量了)之类的提示。
试过自己配置寄存器,结果出现过这样的状况:1. 发现过手册中的错误。 2. 按照手册里的软件流程做,失败。利用ESP-IDF里的examples才成功。
花10几元买ESP32-C3,体验一下MicroPython (和CircuitPython)的更多相关文章
- 【MySQL】花10分钟阅读下MySQL数据库优化总结
1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...
- Java开发中经典的小实例-( 鸡蛋0.1元一个,鸭蛋3元一个,鹅蛋6元一个。求一百元买一百个蛋。)
public class Test24 { public static void main(String[] args) { // 鸡蛋0.1元一个,鸭蛋3元一个,鹅蛋6元一个.求 ...
- Java实现 基础算法 百元买百鸡
public class 百元买百鸡 { public static void main(String[] args) { //母鸡 for (int i = 1; i < 33; i++) { ...
- 10元买啤酒问题Java解法
10元去买啤酒,2元一瓶.每两个瓶可以换一瓶啤酒,每四个瓶盖可以换一瓶啤酒.最多买几瓶? public class Java { public static void main(String[] ar ...
- 通向高可扩展性之路(WhatsApp篇)---- 脸书花了190亿买来的WhatsApp的架构
原文链接:http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-bill ...
- EZchip花1.3亿美元买Tilera然后以8亿美元把自己与Tilera一起卖掉
2014年7月EZchip花1.3亿美元收购的Tilera2015年10 Mellanox 8亿美元收购EZchip,2016年1月完成.EZchip转手卖掉Tilera与自己? http://www ...
- Python3求解字符串滤值与百元买百鸡算法
[本文出自天外归云的博客园] 第一题:给你一个字符串,打印出来前后没有空格,单词之间只有一个空格的字符串. 第二题:公鸡3元/只,母鸡4元/只,小鸡1元3只,给你money元一共多少种买法. 普通版解 ...
- Win10《芒果TV》更新v3.4.10春光版:优化弹窗体验,修复热键和推送
春来触地故乡情,忽见风光忆两京,金谷踏花香骑入,曲江碾草钿车行,Win10版<芒果TV>更新v3.4.10,进一步优化弹窗体验,修复热键和推送异常. Win10版<芒果TV>V ...
- 10享元模式Flyweight
一.什么是享元模式 Flyweight模式也叫享元模式,是构造型模式之 一,它通过与其他类似对象共享数据来减小内存 占用. 二.享元模式的结构 三.享元模式的角色和职责 抽象享元角色: 所有具体享元类 ...
- 设计模式(C#)——10享元模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 前言 在软件开发中,当我们需要对某些对象重复创建,且最终只需要得到单一结果.如果使用一般思维,那我们将浪费很多内存空 ...
随机推荐
- Hexo+Gitee免费搭建静态博客
前言 这是一篇利用 Gitte Pages + hexo 搭建属于自己博客的教程,也是自己这个博客搭建好以后的第一篇文章,搭建的过程中也参考了各路大佬的文章,期间遇到了一些问题,所以写这一篇文章即是记 ...
- 现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式!
在上一篇文章中 -- 现代 CSS 之高阶图片渐隐消失术,我们借助了 CSS @Property 及 CSS Mask 属性,成功的实现了这样一种图片渐变消失的效果: CodePen Demo -- ...
- Docker容器入门到精通
Docker 容器 快速入门 第一章:Docker容器 第二章:Dockerfile指令与Docker-compose容器编排-搭建docker私有仓库 h1 { color: rgba(0, 60, ...
- RocketMQ Connect 构建流式数据处理平台
本文作者:孙晓健,Apache RocketMQ Committer 01 RocketMQ Connect RocketMQ Connect 是一款可扩展的在 RocketMQ 与其他系统之间做流式 ...
- Pytorch框架详解之一
Pytorch基础操作 numpy基础操作 定义数组(一维与多维) 寻找最大值 维度上升与维度下降 数组计算 矩阵reshape 矩阵维度转换 代码实现 import numpy as np a = ...
- md5-有道翻译
网站 aHR0cHMlM0EvL2ZhbnlpLnlvdWRhby5jb20v 测试发现三个值是变化的 一.第一种方法 initiator一步一步找,在t.translate中找到以下内容 这里可以看 ...
- TortoiseGit (小乌龟安装配置及使用)
TortoiseGit 使用教程 (图文详解) 第一步 下载Git:下载地址:https://gitforwindows.org 第二步 下载TortoiseGit 以及 汉化包 (安装教程这里就不详 ...
- C++进阶(哈希)
vector容器补充(下面会用到) 我们都知道vector容器不同于数组,能够进行动态扩容,其底层原理:所谓动态扩容,并不是在原空间之后接续新空间,因为无法保证原空间之后尚有可配置的空间.而是以原大小 ...
- 10、RestTemplate方式实现远程调用Client
一.JSONObject类详解: JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进行了封装,添加了很多 ...
- org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive
昨天23点给一个老项目改完打包发布到云服务器后报错,Tomcat9 启动不了,白折腾了我几个小时. 这错误以前遇到过,由于太过久远已经忘记,特此记录 错误日志 22-Dec-2021 23:52:18 ...