概述
在arduino的IDE上已经搭建好了ESP32环境的话,写写小应用的话还是很简单的,毕竟有这么多优秀的库。 之前用自己买的TFT屏试了一下TFT-eSPI库的驱动效果,显示效果挺好的,但是触摸一直没用上。最近有空了弄了一下。 我的屏幕是2.2寸/2.4/2.8/3.2/3.5/4.0寸TFT触摸彩色SPI串口液晶屏显示模块,这个3.5寸的。 接口长这样:
显示流程
- 下载TFT-eSPI库。直接到arduino的库管理器里下:
或者去github上把源代码下载下来,然后解压到上一篇中说的sketchbook目录下的libraries文件夹下即可。 重启arduino就可以在示例里找到这个库提供的例子了。这里直接打开这个触摸校准的例子。 直接编译上传的话肯定是没用的,还需要对底层的驱动代码做一定的修改。 - 找到刚才下载的TFT-eSPI库的源文件夹,直接打开User_Setup_Select.h。这里就以我的显示屏驱动为例。
刚下载来是默认开启第22行的头文件的。也就是上图中的User_Setup.h。这是一个用户自定义的头文件,里面包含的是对硬件引脚分配、SPI速率、相关宏定义等的一些自定义选项,用户可以根据自己的情况自行分配选择。 而下面的头文件就是作者已经写好的对某些特定的常用的驱动芯片的一些基本的参数配置,这里我们直接用这个写好的。我的芯片是ILI9488,板子是ESP32。这里直接将22行注释掉,取消注释第47行的头文件包含。 然后这里就不需要任何修改了。 接下来直接找到上图里的头文件位置。可以看到这个驱动芯片的显示部分的SPI引脚定义在这里已经定义好了。当然这也不是随便定义的。
这是我的板子的引脚资源分配图。可以看到ESP32的硬件SPI中的VSPI的各个引脚就是上图中头文件里分配的SPI引脚。 那么如果按照这个文件中所标识的引脚,将显示屏上的引脚对应的接上,其实显示部分就可以正常运作了。所以如果仅仅需要显示,需要做的工作只有两步:
但是买个触摸屏只用来显示多少有点亏。TFT-eSPI也编写了对于触摸模块的驱动代码,只不过需要进行一些额外的操作,当然这也并不难。
触摸流程
在上图中的头文件里可以看到有一个TOUCH_CS的宏定义。我们要使用触摸驱动就必须把这个的注释取消掉。但是这也只有一个CS,其他的引脚似乎并没有在任何地方定义,可是显示屏的引脚上对触摸驱动也是有SPI引脚引出的。那么如果你直接把这CS引脚接上ESP32的26引脚,会发现这并没有任何用处。 其实这跟SPI这个协议有关。了解SPI这个协议的通信方式之后,其实就很容易解决了。 先来看看SPI协议中主机与从机的通信连接方式: 太具体的就不说了,网上好多。对我们这里有用的就是: 如果只存在一个SPI从设备,例如我们这里的显示模块,那么主机(ESP32)的SPI接口就可以直接通过杜邦线将两个设备的SPI接口相互连接即可正常通信。此时CS引脚直接拉低或接地即可。 但是如果存在多个SPI从设备,例如我们这里的显示模块加上触摸模块,那么根据这张图,可以发现,其实一个主设备和多个从设备的SCK、MISO、MOSI,是共享线路的,而CS引脚在这里就起到了重要的作用。它能够让主设备选择某一时刻与哪一个从设备进行通信。那么说到这里,结合上面的头文件中只定义了一个TOUCH_CS引脚,怎么驱动显示和触摸设备就很显而易见了:
我们只需要将主设备的SCK、MISO、MOSI引脚引出,然后将多个从设备的SCK、MISO、MOSI引脚分别接在引出的三条对应的线路上,最后通过程序设置CS引脚来分时的选通从设备,就可以在这里实现对触摸显示屏的正常驱动。
至于这个引出的线路怎么实现,用面包板就行了。 它的底部其实就是一条金属条。 原理就是这样,具体怎么接都行。比如我是这么接的。最上面一排的三根接ESP32的SCK、MISO、MOSI引脚,把这三条线路引到面包板上,这就对应了前文中的SPI连接图上的那三根引出的线。接下来就把从设备的SCK、MISO、MOSI引脚接在对应的线路上就行了。比如我这个面包板上下两层不连通,我用一根跳线把上面下面连通了,然后把显示屏的显示模块和触摸模块的SCK、MISO、MOSI接口分别接在了下面部分的两排上。 只有这三根线需要通过面包板来连接,其他的线直接接入ESP32原生的引脚即可。
踩坑
那么如果你就这样把ESP32的SCK、MISO、MOSI引脚接入了面包板,并把显示和触摸的SCK、MISO、MOSI分别接到了对应的线路上,然后把代码那么一上传,会发现这个校准的触摸程序,依旧不能实现触摸🙃。不过原因其实也很简单(虽然我找了很久🙃)。 回到上面的这个头文件,这里其实有一句注释:
leave TFT SDO disconnected if other SPI devices share MISO
意思就是:
如果有其他的SPI设备共享了MISO这条线路,那么就让TFT显示屏的SDO接口别连接这条线路。
意思很简单,就是如果你是单个的SPI设备,直接对着连接。但是如果存在多个SPI设备(比如我们这里有显示模块和触摸模块两个),那么就让显示模块对应的MISO接口不要接入这条线路。也就是只让其他的设备的MISO接入这条线路。 那么根据这条注释,我们把原来的接线改动一下。ESP32所引出的SCK、MISO、MOSI不需要改动。触摸模块的SCK、MISO、MOSI也不需要改动。把显示模块的MISO引脚和面包板上的ESP32的MISO线路的接线直接断开,不接了。如下图: 面包板上的具体接线如下图:
LED引脚的小技巧
LED引脚是用来控制背光的,但是其实这个头文件中是没有定义的。所以你需要自己手动的定义一个引脚让它输出高电平,或是接在3.3V的引脚上,抑或是输出PWM信号调节亮度,否则显示屏是不会亮的。但是如果你并不需要调节亮度这种功能,插拔杜邦线比较方便,又懒得自定义一个引脚的话,可以试试用这个办法: 在下载代码之前,把LED引脚空接。代码下载完毕后,将LED引脚接在ESP32的EN引脚上。 如下图: 这样的话,不需要你重新定义一个LED引脚,也不需要额外找一个3.3V的接口,显示屏也能够在上电后正常运作。不过记得在下载代码时要断开,否则下不进去。
效果
图片: GIF:
|