基于ESP32-S2开发板的姿态控制彩灯
本项目是参加2023寒假在家一起练项目,完成了一个基于ESP32-S2开发板的姿态控制彩灯项目。
标签
嵌入式系统
ESP32
2023寒假在家练
George
更新2023-03-27
448

基于ESP32-S2开发板的姿态控制彩灯

1 项目介绍:

我选择的这个项目,是使用ESP32-S2开发版和底板来完成的。项目完成了一个姿态控制的彩灯。视频中可以看到实际的姿态控制反馈,和彩灯的演示效果。这里放一副最终成品图片吧!

Fn9Mned3ZShXaSDDcdkZakB3Vjj3

图1,最终成品

之前我用过一些别的开发版,也用过microPython编过一些别的项目,觉得microPython对于我们年龄小一些的爱好者是比较容易上手的。那么首先说一下我的这个项目的思路吧:

2,设计思路

2.1 首先,我跟着直播课程详细学习了分析了这款开发板的软件编辑环境,我目前接触过Scratch 和microPython, 但是对于乐鑫的IDF开发环境从来没有用过。在视频最后老师提到可以使用CircutPython 进行开发,我觉得这个我应该还可以试试看。

2.2 题目要求使用姿态传感器感知位置,并且显示在 LCD屏幕上。并且在静止一段时间后,彩灯显示一个固定顺序的彩色。这里对项目要求进行分析后可知,需要对姿态传感器读取到的数值进行判断,将数值写入 LCD显示,并在彩灯上面显示不同的色彩。

2.3 接下来就是从网站上的图纸资料内,找到需要驱动各个设备的GPIO管脚,以方便在程序内使用对应的驱动去操作他们。

2.4 然后就是编制程序,完成姿态传感器、 LCD显示屏的驱动,完善姿态读取程序,完善判断程序,并且根据判断结果点亮彩灯。编制程序的时候,我使用了模块的思路,先逐步验证每个模块的单独的功能。再将他们合并为一个整合的程序。

 

3,硬件介绍

有了上面的思路,我们首先介绍下本次使用到的硬件吧!

3.1 核心板部分

核心板模块使用了乐鑫ESP32-S2-MINI-1模组。它内置 ESP32­S2 系列芯片,单核 32 位 LX7 微处理器,内置叠封4MBFlash,集成了USB TYPE -C接口,两个按键,一个电源指示灯,一个用户LED灯,2排10pin的排针,将重要IO引出。使用USB供电或通过排针3.3V供电。更新固件之后支持使用CircuitPython、microPython 进行编程。功能很多,性能很强!

3.2 扩展板部分

硬禾团队也设计了很强大的外设扩展版。我需要用到的有:1.44寸128*128 LCD,ST7735芯片,使用SPI总线访问;MMA7660三轴姿态传感器,使用I2C总线访问;板载的彩色LED连接在三个GPIO端口上。但是在实验的过程中我发现,在写入了microPython固件之后,彩色LED与串口有冲突,所以项目需要使用的彩灯,我使用了一颗外接的WS2812彩灯,来完成项目需求。

3.3 本次用到的硬件连接关系以及管脚定义。

Fsz8PVUU5bYoZbYnY5H3hqFqMzc8FoNEnvGOjUGq2qMuQwLHm-3QAtlm

上面两张图片,展示了LCD屏、MMA7660姿态传感器,对应到ESP32模块的对应关系。其中红色框内5根IO为LCD屏的连接线,绿色框内为I2C总线。另外,我多链接了一根蓝色框内的信号线,连接到一个我之前用过的WS2812彩色指示灯。使用板子上没有用到的一个J6连接器进行引出。将GPIO对应连接关系记录下来之后,即可以进行编程测试了。

 

4,编程环境的选取

因为我不熟悉IDF环境,所以我在MicroPython网站上找到了适用于ESP32-S2的通用固件。并且在刷入板子后,可以搭配Thonny 正常进行编程。

下载链接如下:http://www.micropython.org/download/GENERIC_S2/

下载后,在Thonny 中选择配置解释器,选microPython (ESP32)然后端口可以选择自动,即可。需要注意的是,板卡使用USB连接到电脑后,需要按一下复位,才可以运行Thonny进行连接。连接时候,端口可以选择自动,也可以手动选择端口号较大的哪个进行连接。

4.1 各程序模块介绍

整个项目因为涉及到LCD屏,MMA7660姿态传感器两个比较复杂的外设。我参考了我之前学习的开发板内的程序,从网上查找一番,找到了使用microPython写的ST7735和MMA7660驱动。并且还有一份字体文件。以上三个程序在测试后,都可以将设备正常进行驱动。三个驱动程序我压缩后按照附件内的DEVICE.zip

4.2 程序流程图介绍

首先需要根据设计需要,画一个程序流程图.根据程序的流程图,可以帮助我们更好的捋清楚程序需要执行的功能,把对应的功能模块更好的实现出来.

FvtoTJvrtXW7PMpOT2j51exHTfem

4.3 主程序书写思路介绍

然后根据流程图,逐一书写主程序段.下面我来详细介绍一下主程序吧:

from ST7735 import TFT
from FONT import terminalfont
from machine import I2C,SPI,Pin
import time
import math
import MMA7660
import neopixel

np = neopixel.NeoPixel(Pin(10), 1)
i2c1 = I2C(1, scl=Pin(3), sda=Pin(4), freq=400000)
i2c1.scan()
accel = MMA7660.Accelerometer(i2c1)

spi = SPI(2, baudrate=20000000, polarity=0, phase=0, sck=Pin(41), mosi=Pin(21), miso=Pin(9))
tft=TFT(spi,17,18,13)
tft.initr()
tft.rgb(False)
sysfont = terminalfont
tft.fill(TFT.BLACK)

HisX = 0
HisY = 0
HisZ = 0
cnt  = 0

while 1:


    NumX = accel.get_x()
    NumY = accel.get_y()
    NumZ = accel.get_z()

    if HisX != int(NumX/10) or HisY != int(NumY/10) or HisZ != int(NumZ/10) :
        HisX = int(NumX/10)
        HisY = int(NumY/10)
        HisZ = int(NumZ/10)
        cnt = 0
        
    if cnt < 5:
        cnt = cnt + 1
        np[0] = (NumX, NumY, NumZ)
        np.write()
        tft.fill(TFT.BLACK)
        tft.text((15, 20), "X:"+str(NumX), TFT.WHITE, sysfont, 2, nowrap=True)
        tft.text((15, 50), "Y:"+str(NumY), TFT.WHITE, sysfont, 2, nowrap=True)    
        tft.text((15, 80), "Z:"+str(NumZ), TFT.WHITE, sysfont, 2, nowrap=True)
        tft.text((15, 110), "C:"+str(cnt), TFT.WHITE, sysfont, 1, nowrap=True)
    else:
        np[0] = (40,0,0)
        np.write()
        time.sleep(1)
        np[0] = (0,40,0)
        np.write()
        time.sleep(1)         
        np[0] = (0,0,40)
        np.write()
        time.sleep(1)
        
    time.sleep_ms(500)

首先,引入必要的驱动模块。ST7735 是显示驱动,FONT是字体文件,MMA7660是姿态传感器驱动。除此之外,还引入了 I2C\SPI\Pin作为基本库。引入time定时库,引入了neopixel作为彩色LED显示的驱动。

9行,声明了一个WS2812彩灯

10-12行,按照之前分析电路图获得的管脚定义,声明了一个I2C总线i2c并将其传入MMA7660驱动,让他可以获取到正确的三轴加速度数值

14-19行,按照之前分析电路图获得的管脚定义,声明了一个SPI总线spi, 将其传入ST7735驱动,这里需要注意,SPI和TFT声明时候,需要正确指定对应的各个信号,包括复位、指令、片选管脚。最后需要指定字库,并且填充整个屏幕为黑色。

21-24行,声明四个变量,cnt用来作为静止状态定时计数器。His开头的三个,用来存储三个方向加速度历史数值,

26-59行是一个大while 循环。在这个循环内,首先将三个轴的加速度读入Num开头的变量。并且在33-37行根据历史数值进行对比。如果变化量大于1/10. 就更新数值,并且cnt计数值清零,代表姿态有变化。如果姿态没有变化,就执行39行下面的判断。如果计数值小于5,代表姿态还在变化。此时将WS2812彩灯按照红绿蓝三个颜色更新为姿态传感器读取到的三个数值。所以姿态变更的时候,也会有对应的不同颜色显示出来。同时,调用LCD函数,将XYZ数值更新在LCD显示屏上面。49行开始,是一个周期三秒的彩灯显示,他会规律的显示红-绿-蓝 每个颜色延迟1秒。

5 项目问题与总结

因为我学习MicroPython只有半年多的时间,很多函数的使用,还有各个模块的使用还不是很熟悉。程序写的也比较简略,没有那么高的深度。可能和很多高级的项目没办法比较。但是我觉得,兴趣就是最好的老师,在以后的道路上我会继续学习嵌入式,学习更多的知识。以后会做更多的好玩的项目!也希望下次还可以继续参与暑假一起练项目!

 

附件下载
20230305-3.py
项目主程序
DEVICE.zip
设备驱动程序
团队介绍
山西省太原市太白街小学-George-梓乔
团队成员
George
野生技术学会会员
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号