Play ESP32-C3 with MicroPython
今年受疫情影响,几乎所有芯片都涨价了。但是合宙ESP32C3-CORE却奇迹地以9.9RMB包邮,其搭配的Air101-LCD屏幕扩展板(0.96寸)也是9.9RMB包邮。甚是吸引,于是入手了一套,主板+屏幕。
注:以下操作,以基于Debian的Linux发行版为例。
一 概述
合宙ESP32C3-CORE简单总结如下:
- 采用乐鑫科技的ESP32-C3芯片,搭载RISC-V 32位单核处理器,支持2.4 GHz Wi-Fi 和Bluetooth 5 (LE)。
- 板载4MB闪存。
- USB Type-C接口,集成CH343(带TTL串口转USB)。新版好像改为USB直连了。
相关资料:
- 乐鑫科技,ESP32-C3 系列芯片,技术规格书
https://www.espressif.com.cn/sites/default/files/documentation/esp32-c3_datasheet_cn.pdf - 合宙官方文档,ESP32C3-CORE开发板(内含针脚定义)
https://wiki.luatos.com/chips/esp32c3/board.html - 合宙官方文档,Air10x系列屏幕扩展板(购买链接内含针脚定义)
https://wiki.luatos.com/peripherals/lcd_air10x/index.html
二 MicroPython
由于合宙的Lua OS采用Lua语言,虽然官方在努力,但本人不熟悉,就选择了更好玩的MicroPython。
相关资料:
- MicroPython官网
https://www.micropython.org/ - Python官方文档,Python语言参考手册(MicroPython的基本语法可参考Python)
https://docs.python.org/zh-cn/3/reference/index.html - MicroPython基本语法教程
https://mc.dfrobot.com.cn/thread-37143-1-1.html
三 刷机
MicroPython关于ESP32-C3的固件及刷机教程,参考官方文档:
MicroPython - ESP32-C3
对应合宙ESP32C3经典版,即自带CH340芯片,提供实体串口。
https://micropython.org/download/esp32c3/MicroPython - ESP32-C3 with USB
对应合宙ESP32C3精简版(简约版),即没有串口芯片,提供虚拟串口。
https://micropython.org/download/esp32c3-usb/
1. 安装USB串口驱动
Windows,需要安装CH343的驱动。我使用Lubuntu 20.04,自动识别。另外,新版的合宙ESP32C3-CORE应该也不用装。
2. 刷机工具
安装Python 3.8或3.7后,再装刷机工具esptool
。使用sudo
安装,是方便所有用户都可以用。使用pip3
是指定安装Python3的版本。
sudo pip3 install esptool
3. 下载固件
在MicroPython官方网站 https://micropython.org/download/esp32c3/ 底部的Firmware -> Releases,下载最新版本的固件。
4. 清除原固件
--port
为端口,要根据实际填写,我电脑上的是/dev/ttyACM0
。
sudo esptool.py --chip esp32-c3 --port /dev/ttyACM0 erase_flash
5. 刷入固件
--port
为端口,/opt/download/esp32c3-20220618-v1.19.1.bin
为MicroPython固件文件。另外,如果刷入不成功,可以多刷几次。
sudo esptool.py --chip esp32-c3 --port /dev/ttyACM0 --baud 460800 write_flash -z 0x0 /opt/download/esp32c3-20220618-v1.19.1.bin
四 开发
推荐使用Thonny
作为开发IDE。可以先不上传代码而直接运行,也可以看到开发板上的文件。
相关资料:
- 官方网站,Thonny - Python IDE for beginners
https://thonny.org/ - 官方安装教程
https://github.com/thonny/thonny/wiki/SeparateInstall - ESP32-C3 快速参考手册,内含MicroPython的示例代码
https://docs.01studio.cc/esp32-c3/quickref.html
先安装python3-tk
sudo apt install python3-tk
再安装thonny
sudo pip3 install thonny
运行
thonny
插上开发板,在Thonny进入 工具 -> 设置 -> 解释器 -> 选择解释器为“MicroPython (ESP32)”,然后就可以开发了。
五 点亮屏幕
Air101-LCD屏幕的使用有几点需要注意的:
- 不能使用HSPI(硬件SPI),只能使用软SPI,即
SoftSPI
。 - 该屏颜色不对,因此需要定义函数来生成正确的颜色。
- 横屏时,即
tft.rotation(1)
,x轴不偏移,y轴偏移24像素。相反,竖屏时,即不写tft.rotation(1)
,x轴偏移24像素,y轴不偏移。 - 屏幕的RKey应该接到ESP32C3-CORE的GPIO13,但不知道为什么不能读取点击事件,于是该为接在GPIO19。
相关资料:
- esp32c3+air101Lcd用micropython点亮
https://juejin.cn/post/7058147083781406734 - ST7735驱动
https://github.com/boochow/MicroPython-ST7735/blob/master/ST7735.py - 英文字体
https://github.com/GuyCarver/MicroPython/blob/master/lib/terminalfont.py
写了个示例代码显示一些信息(如下),保存为main.py
,连同ST7735驱动文件ST7735.py
、英文字体文件terminalfont.py
一起上传上去。
from machine import Pin, SoftSPI, SPI
from ST7735 import TFT
import time
from terminalfont import terminalfont
import network
import ubinascii
# 由于TFT屏的颜色有问题,因此需要重写一个函数修复一下
def TFTColor(r,g,b) :
return ((b & 0xF8) << 8) | ((g & 0xFC) << 3) | (r >> 3)
spi = SoftSPI(baudrate=1000000, polarity=1, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(10))
tft=TFT(spi,6,10,7) #DC, Reset, CS
tft.initr()
tft.rgb(True)
tft.rotation(1) # 横屏显示
# 绘制背景色
tft.fill(TFTColor(0,0,0))
# 绘制方块
#tft.fillrect((0,24),(20,20),TFTColor(0,0,255))
# 显示文字
tft.text((0,24),'mac',tft.WHITE,terminalfont,2)
# 显示MAC
mac = ubinascii.hexlify(network.WLAN().config('mac')).decode()
tft.text((0,40),mac,tft.WHITE,terminalfont,2)
# 显示运行秒数
from machine import Timer
sec = 0
def showTime(t) :
global sec
sec += 1
tft.fillrect((0,56),(160,20),TFTColor(255,255,255))
tft.text((0,60),f'Run {sec} sec',tft.BLACK,terminalfont,2)
# 运行定时器
tim0 = Timer(0)
tim0.init(period=1000, mode=Timer.PERIODIC, callback=showTime)
# 把按键信息显示在屏幕的函数
def showDirect(t) :
global tft
tft.fillrect((0,76),(160,16),TFTColor(0,0,0))
tft.text((0,78),str(t),tft.WHITE,terminalfont,2)
# 设置按键的接口
from machine import Pin
keyL = Pin(9, Pin.IN, Pin.PULL_UP)
keyU = Pin(8, Pin.IN, Pin.PULL_UP)
keyC = Pin(4, Pin.IN, Pin.PULL_UP)
keyD = Pin(5, Pin.IN, Pin.PULL_UP)
keyR = Pin(19, Pin.IN, Pin.PULL_DOWN)
keyL.irq(trigger=Pin.IRQ_FALLING, handler=showDirect)
keyU.irq(trigger=Pin.IRQ_FALLING, handler=showDirect)
keyC.irq(trigger=Pin.IRQ_FALLING, handler=showDirect)
keyD.irq(trigger=Pin.IRQ_FALLING, handler=showDirect)
keyR.irq(trigger=Pin.IRQ_RISING, handler=showDirect)
这是另一个程序,显示一个走动的方块:
from machine import Pin, SoftSPI, SPI
from ST7735 import TFT
import time
# 由于ftf屏的颜色有问题,因此需要重写一个函数修复一下
def TFTColor(r,g,b) :
return ((b & 0xF8) << 8) | ((g & 0xFC) << 3) | (r >> 3)
spi = SoftSPI(baudrate=1000000, polarity=1, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(10))
tft=TFT(spi,6,10,7) #DC, Reset, CS
tft.initr()
tft.rgb(True)
tft.rotation(1) #方向调整
# 绘制背景色
tft.fill(TFTColor(0,0,0))
w = 20
h = 20
max = 160
for i in range(0,max*4-1):
x = i * 5 % max
y = i * 5 // max * h + 24
tft.fillrect((x,y),(w,h),TFTColor(255,255,255))
++i
time.sleep(0.04)
tft.fillrect((x,y),(w,h),TFTColor(0,0,0))
六 后续
显示优化的问题,仍未解决(如下)。后面应该会试试Arduino for ESP32-C3。
- 有个项目解决中文的显示的,但刷固件失败,放弃了。
支持中文显示的MicroPython固件 https://github.com/wangshujun-tj/mpy-Framebuf-boost - 想使用LVGL显示更好的UI,但是编译失败,也放弃了。
Micropython + lvgl https://github.com/lvgl/lv_micropython