esp32控制舵机+tft彩屏

前言

esp32的学习笔记

环境

  • windows11
  • vscode+platformIO
  • esp32开发板
  • sg90舵机
  • st7735的1.44寸tft彩屏
  • TFT_eSpi库【tft屏】
  • ESP32Servo库【舵机】
  • 好多好多杜邦线

库安装方法

  1. 点击platformIo的libraries
    截图
  2. Registry搜索所需库/instaled查看已安装库 注意有些库并不兼容设备,注意查看其标签
  3. 为项目安装

舵机部分

舵机控制原理

  1. 普通舵机是由普通电机+减速齿轮组+电位器+芯片组成的,使用pwm信号进行控制。控制芯片根据pwm信号的占空比来确定旋转角度
  2. 360度舵机是由普通电机+减速齿轮组+芯片组成,使用pwm信号控制。控制芯片根据pwm信号的占空比确定旋转速度与方向

舵机连线

舵机 主机
黑色 GND
红色 VCC【本机3-7v】
彩色 pwm(gpio4)

servo库安装与基本使用方法

本次无法使用arduino标准servo库,因为esp系列的计时器与其他设备不同,转而采用
SP32Servo库
例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <Arduino.h>
#include <ESP32Servo.h>
Servo servo; //创建servo对象
int angle=0,angle_now = 0;
void setup()
{
serial.begin(115200); //serial init
servo.attach(4,500,2500);//绑定到gpio4
//由于库默认占空比映射比例不对,这里修改为最小500 最大2500 让舵机能够按照准确的角度旋转

} //初始化函数


void loop()
{
angle = Serial.parseInt();//从串口接受数字
if (angle>0&&angle<=180)
{

for (;angle_now <= angle; angle_now += 1)
{
servo.write(angle_now);
// delay(1);//等待1毫秒使之到位
}

for (; angle_now >= angle; angle_now -= 1)
{
servo.write(angle_now);
// delay(1);
}
}
} //主循环

tft部分

tft彩屏控制原理

使用spi协议进行信号传输 spi协议介绍

理解为一个带时钟线的串行通信协议

1
2
3
4
MISO:Master input slave output //主机输入,从机输出(数据来自从机)
MOSI:Master output slave input //主机输出,从机输入(数据来自主机)
SCLK :Serial Clock //串行时钟信号,由主机产生发送给从机
SS:Slave Select //片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

st7735驱动接线

st77345[屏幕] 主机 解释
GND GND
VCC 3.3v 【本机选用3.3v】
SCL gpio18 SCLK【SPI·时钟】
SDA gpio19 MOSI【SPI·主机输出】
RES gpio17 复位(可与esp32rst接在一起)【低电平使能】
DC gpio16 芯片控制【RS=0 数据总线传输的是指令;RS=1 数据总线传输的是像素】
CS gpio15 片选信号【SPI·片选】【低电平使能】
BLK 未定义 背光【高电平开启 低电平关闭】【默认高电平】(LCD屏 关闭背光无法显示)

TFT_eSpi库安装与基本使用方法

这个库能驱动各种spi屏幕,功能强大,故未采用商家提供库

选择芯片与开发板

  1. 打开项目.pio/libdeps/TFT_eSPI/User_Setup.h【本次不采用user_setup_select初始化 不要对其他文件进行修改】
  2. Ctrl+f找到所有的st7735 根据文件说明进行选择

补充说明 本次购买屏幕的错位修正选用 #define ST7735_GREENTAB3 找到后将其去注释

例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <Arduino.h>
#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI(); // Create object "tft"
int angle=0,angle_now = 0;

void print_angle(int angle_now,int target);

void setup()
{
//tft init
tft.init();//初始化
tft.setRotation(0);//屏幕旋转设置为0度 1为90度 2为180度 3为270度 4需要自己补充库,建议设置为镜像
tft.fillScreen(TFT_BLACK);//设置屏幕底色(刷新整块屏幕为x色)
tft.setTextColor(TFT_WHITE);//设置字体颜色
tft.setTextFont(4);//选用4号字体,具体可以f12看 但是都不支持中文
tft.setCursor(0,0);//光标移动到00(从0 0 开始写)

print_angle(angle_now,angle);
}

void print_angle(int angle_now,int target)
{
tft.fillScreen(TFT_BLACK);
tft.setCursor(0,0);
tft.printf("Target:%d\r\nNow:%d",target,angle_now);//本次采用printf 还有print printin 具体看c++
//本次未采用画字体方式,待补充

}
void loop()
{
//write a loop program here ...
}

综合功能实现展示

实现串口输入角度,舵机旋转到指定角度并且屏幕实时显示





源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <Arduino.h>
#include <TFT_eSPI.h>
#include <ESP32Servo.h>
#include <string.h>

TFT_eSPI tft = TFT_eSPI(); // Create object "tft"
Servo servo; //创建servo对象
int angle=0,angle_now = 0;

void print_angle(int angle_now,int target)
{
tft.fillScreen(TFT_BLACK);
tft.setCursor(0,0);
tft.printf("Target:%d\r\nNow:%d",target,angle_now);

}
void setup(void) {
//serial init
Serial.begin(115200);
//tft init
tft.init();
tft.setRotation(0);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE);
tft.setTextFont(4);
tft.setCursor(0,0);

print_angle(angle_now,angle);

//servo init
servo.attach(4,500,2500);



}

void loop()
{
angle = Serial.parseInt();
if (angle>0&&angle<=180)
{
for (;angle_now <= angle; angle_now += 1)
{
servo.write(angle_now);
// delay(1);
print_angle(angle_now,angle);
}
for (; angle_now >= angle; angle_now -= 1)
{
servo.write(angle_now);
// delay(1);
print_angle(angle_now,angle);
}
}


}

#参考教程&附资料

  1. <a href=”./esp32%E9%A9%B1%E5%8A%A8%E8%88%B5%E6%9C%BA%2Btft%E5%BD%A9%E5%B1%8F/3-彩屏资料.zip >tft彩屏资料包括原理图|芯片手册等:
  2. Arduino - 串口操作函数与示例代码大全
  3. Arduino开发-TFT_eSPI库学习
  4. ESP32开发板连接TFT屏幕
  5. ESP32彩屏显示入门(一):我要五彩斑斓的黑,还有五光十色的白 | ESP32轻松学(Arduino版)
  6. 【Arduino百问】舵机?你懂舵机吗?三分钟深入了解舵机 更精准的控制
  7. 库示例代码