机器人设计与应用综合实训——ESP32开发技术分享
本文为机器人设计与应用综合实训中,基于ESP32的开发技术分享帖,主要记录实训过程中的ESP32开发要点、问题排查及实践总结,表格部分留空供同学们根据自身实训情况填写,适配实训报告补充、技术复盘及同学间交流使用。I2C 为两线式串行通信,用于低速触控 / IO 扩展芯片;1. 掌握了 ESP-IDF 开发框架的使用,熟悉了 ESP32 的 SPI、I2C、PWM 等外设的底层驱动开发;2. 学会了
机器人设计与应用综合实训——ESP32开发技术分享
姓名: 九鼎 学号: 101101101 班级: 火箭班 学院: 理工 日期:3月12日
本文为机器人设计与应用综合实训中,基于ESP32的开发技术分享帖,主要记录实训过程中的ESP32开发要点、问题排查及实践总结,表格部分留空供同学们根据自身实训情况填写,适配实训报告补充、技术复盘及同学间交流使用。
核心方向:ESP32芯片基础应用、机器人控制模块开发、传感器数据交互、代码调试与优化,贴合实训核心需求,兼顾技术细节与实操记录。
|
实训项目名称 |
实训时间 |
ESP32开发板型号 |
开发环境 |
实训小组人数 |
|
ESP32 开发板型号 |
3月9日至3月18日 |
通用 ESP32-WROOM-32 |
VS Code+ESP-IDF 5.0 及以上 |
1人 |
二、ESP32开发核心知识点梳理
本部分记录实训中涉及的ESP32核心技术点,包括引脚配置、外设驱动、通信协议等,结合机器人设计场景补充细节。
|
知识点类别 |
具体知识点 |
核心原理简述 |
实训应用场景 (机器人相关) |
备注 (易错点/重点) |
|
引脚配置 |
GPIO 复用配置、引脚上下拉设置 |
ESP32 引脚支持多外设复用,通过寄存器配置引脚功能,上下拉电阻用于稳定电平 |
机器人液晶屏、触摸屏、IO 扩展芯片的引脚分配与初始化 |
避免复用冲突,触摸屏 / 液晶屏引脚需配置为对应功能模式 |
|
外设驱动 |
SPI 总线驱动、I2C 总线驱动、PWM 驱动 |
SPI 为同步串行通信,用于高速液晶屏数据传输;I2C 为两线式串行通信,用于低速触控 / IO 扩展芯片;PWM 通过占空比调节液晶屏背光 |
机器人显示模块的 SPI 液晶屏驱动、I2C 触控 / PCA9557 IO 扩展芯片驱动、背光 PWM 调节 |
SPI 时钟频率需匹配液晶屏规格,I2C 需配置正确从机地址 |
|
通信协议 |
LVGL 图形库接口协议、FT5x06 触控通信协议 |
LVGL 通过帧缓存实现图形界面渲染与刷新,FT5x06 通过 I2C 上报触控坐标数据 |
机器人触控交互终端的登录界面开发、触控指令识别 |
LVGL 缓存大小需匹配液晶屏分辨率,触控坐标需做校准映射 |
|
代码开发 |
FreeRTOS 任务调度、ESP-IDF 外设接口、LVGL 控件开发 |
FreeRTOS 实现多任务并发,ESP-IDF 提供底层外设 API,LVGL 提供标准化图形控件 |
机器人显示任务与触控识别任务的调度、登录界面控件创建与事件绑定 |
避免 LVGL 刷新任务阻塞,需使用延时而非死循环 |
|
其他(自定义) |
三、ESP32机器人开发实操步骤
按实训流程,记录从环境搭建到机器人功能实现的完整步骤,重点填写ESP32相关操作,明确每一步的核心操作与目的。
|
步骤序号 |
实操内容 (ESP32 相关) |
操作步骤细节 |
使用工具 / 代码片段 |
操作结果 (成功 / 失败及原因) |
|
1 |
开发环境搭建 |
1. 安装 VS Code 并配置 ESP-IDF 插件; 2. 配置 ESP32 开发板编译、下载环境; 3. 导入 LVGL 库并配置编译选项; 4. 配置串口监视器波特率为 115200 |
VS Code、ESP-IDF 5.0、LVGL 8.3 |
成功,可正常编译 ESP32 工程并烧录 |
|
2 |
ESP32 开发板调试 |
1. 连接 ESP32 与电脑,检测串口是否识别; 2. 烧录测试代码,验证 GPIO、SPI、I2C 外设功能; 3. 初始化串口,打印开发板信息 |
串口调试助手、ESP32 测试代码 |
成功,外设功能正常,串口可打印日志 |
|
3 |
外设与 ESP32 连接 |
1. 硬件连接:液晶屏 SPI 接 GPIO40/41/39,触摸屏 / I2C 扩展接 GPIO1/2,背光接 GPIO42; 2. 软件初始化:调用bsp_i2c_init、pca9557_init初始化 I2C 及扩展芯片; 3. 初始化 SPI 总线与液晶屏驱动 |
杜邦线、面包板、bsp_i2c_init/pca9557_init代码 |
成功,外设与 ESP32 通信正常 |
|
4 |
代码编写与烧录 |
1. 编写液晶屏驱动代码,实现清屏、字符 / 汉字显示; 2. 集成 LVGL 库,实现bsp_lvgl_start初始化图形界面; 3. 编写lv_example_demo实现登录界面控件创建; 4. 编译工程并通过串口烧录至 ESP32 |
ESP-IDF 编译工具、本文核心驱动 / 应用代码 |
成功,代码无编译错误,可正常烧录至 ESP32 |
|
5 |
机器人功能调试 |
1. 上电运行,验证液晶屏背光、整屏清屏功能; 2. 测试 LVGL 登录界面显示效果,检查控件位置与样式; 3. 触摸触摸屏,验证触控响应与控件交互; 4. 调试字符 / 汉字显示,确保无乱码、错位 |
ESP32 开发板、液晶屏 + 触摸屏模块 |
成功,登录界面正常显示,触控功能有效 |
|
6 |
功能优化与完善 |
1. 优化 LVGL 缓存配置,解决界面刷新卡顿; 2. 调整控件坐标与尺寸,适配 240*320 液晶屏; 3. 增加内存释放逻辑,避免内存泄漏; 4. 优化背光 PWM 占空比,提升显示观感 |
LVGL 配置文件、代码优化片段 |
成功,界面刷新流畅,无内存泄漏,显示效果良好 |
四、ESP32开发常见问题及解决方案
记录实训过程中遇到的ESP32开发相关问题(如烧录失败、外设通信异常、代码报错等),填写解决方案与总结,便于后续复盘和同学参考。
|
问题序号 |
问题描述(ESP32 相关) |
排查过程 |
解决方案 |
问题总结(避免方法) |
|
1 |
ESP32 烧录失败,提示 “串口未连接” |
1. 检查电脑串口驱动是否安装; 2. 检查 ESP32 与电脑的 USB 连接是否松动; 3. 检查 ESP32 烧录模式是否正确(BOOT 键按住上电) |
1. 重新安装 CH340/CP2102 串口驱动; 2. 更换 USB 线并重新插拔; 3. 按住 BOOT 键同时按 RESET 键,进入烧录模式后再烧录 |
烧录前确认串口识别、连接正常,严格按照烧录模式操作 |
|
2 |
液晶屏无显示,背光正常 |
1. 检查 SPI 引脚连接是否正确; 2. 检查液晶屏驱动芯片 ST7789 初始化代码; 3. 验证 SPI 时钟频率是否匹配 80MHz; 4. 检查pca9557的 LCD_CS 引脚电平 |
1. 重新核对 SPI 引脚(MOSI40、CLK41、DC39); 2. 确保bsp_display_new中完成液晶屏复位与初始化; 3. 配置 SPI 时钟为 80MHz,匹配 ST7789 规格; 4. 调用PCA9557_SET_GPIO(LCD_CS_GPIO,0)拉低 CS 引脚 |
硬件连接做好标记,软件初始化严格按外设手册执行 |
|
3 |
LVGL 界面显示错位、花屏 |
1. 检查 LVGL 的分辨率与液晶屏实际分辨率是否一致; 2. 验证 LVGL 的swap_xy、mirror_x/y与液晶屏配置是否匹配; 3. 检查 LVGL 缓存大小是否足够 |
1. 配置 LVGL 分辨率为 320*240,与 ST7789 一致; 2. 将 LVGL 旋转配置与液晶屏保持一致(swap_xy=true、mirror_x=true); 3. 增大 LVGL 缓存,设置BSP_LCD_DRAW_BUF_HEIGHT=20 |
LVGL 图形配置需与液晶屏底层驱动完全匹配 |
|
4 |
触摸屏无触控响应 |
1. 检查 I2C 引脚(SDA1、SCL2)连接是否正确; 2. 验证 FT5x06 从机地址是否配置正确; 3. 检查触控坐标映射是否与液晶屏匹配 |
1. 重新核对 I2C 引脚,确保上下拉电阻使能; 2. 配置 FT5x06 从机地址为 0x38,匹配 I2C 通信; 3. 触控初始化时设置swap_xy=1、mirror_x=1,完成坐标映射 |
I2C 外设需确认从机地址,触控坐标需做校准映射 |
|
5 |
汉字显示乱码、无显示 |
1. 检查字模数组是否为 GB2312 编码; 2. 验证汉字解析函数lcd_draw_hz的字模读取逻辑; 3. 检查内存分配是否成功,是否有内存泄漏 |
1. 使用 GB2312 编码的点阵字模,确保字模与解析函数匹配; 2. 核对lcd_draw_hz中字模索引与汉字的对应关系; 3. 增加内存分配判空逻辑,分配后及时调用heap_caps_free释放 |
字模编码与解析函数需匹配,动态内存必须做好判空与释放 |
五、实训总结与ESP32开发心得
|
项目完成情况 |
本次实训成功完成基于 ESP32 的机器人触控显示终端开发,实现了 I2C/SPI 外设驱动、LVGL 图形界面开发、触摸屏交互等核心功能,完成了登录界面的设计与实现,所有功能模块调试正常,达到实训预期目标 |
|
ESP32 开发重点收获 |
1. 掌握了 ESP-IDF 开发框架的使用,熟悉了 ESP32 的 SPI、I2C、PWM 等外设的底层驱动开发; 2. 学会了 LVGL 图形库的集成与开发,掌握了常用控件(标签、输入框、复选框、按钮)的创建与配置; 3. 理解了 FreeRTOS 实时操作系统的任务调度原理,学会了在 ESP32 上进行多任务开发; 4. 掌握了外设驱动与图形库的联合调试方法,学会了排查烧录、通信、显示等常见问题; 5. 理解了点阵字模的解析原理,实现了液晶屏的中文字符、数字放大显示,掌握了动态内存管理的技巧 |
|
存在的不足 |
1. 对 LVGL 的事件处理机制理解不够深入,仅实现了空的事件回调函数,未完成登录、注册的业务逻辑; 2. 触摸屏的校准精度有待提升,部分边缘区域触控响应不够灵敏; 3. 代码的模块化设计不够完善,部分驱动代码与应用代码耦合度较高; 4. 未实现低功耗优化,ESP32 运行过程中功耗较高,不适用于电池供电的机器人场景; 5. 对 ESP32 的片外 SPIRAM 使用优化不足,内存分配效率有待提升 |
|
后续改进计划 |
1. 深入学习 LVGL 事件处理机制,完善登录、注册的业务逻辑,实现账号密码的验证与存储; 2. 增加触摸屏校准程序,通过采集多个触控点实现坐标精准校准,提升触控响应精度; 3. 对代码进行模块化重构,将外设驱动、LVGL 封装、应用逻辑分离,提高代码的可复用性; 4. 基于 ESP32 的低功耗模式,实现液晶屏、触摸屏的休眠与唤醒,降低机器人终端的功耗; 5. 优化 SPIRAM 的内存分配策略,使用内存池代替动态分配,提升内存使用效率; 6. 增加机器人功能联动,将触控显示终端与机器人的运动、传感模块结合,实现触控控制机器人运动 |
六、代码附录
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "lcd.h"
#include "dly.c"
#include "Timer.h"
#include "demos/lv_demos.h"
static void event_handler(lv_event_t * e)
{
// 后续可完善事件处理逻辑,如登录按钮点击、复选框选择
}
void lv_example_demo(void)
{
lv_obj_t * label;
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "login interface");
lv_obj_set_width(label, 240);
lv_obj_set_height(label, 30);
lv_obj_set_x(label, 40);
lv_obj_set_y(label, 10);
// 账号输入框
lv_obj_t *textarea = lv_textarea_create(lv_scr_act());
lv_textarea_set_placeholder_text(textarea, "Please enter your account number.");
lv_textarea_set_one_line(textarea, true); // 单行模式
lv_obj_set_size(textarea, 200, 40);
lv_obj_set_x(textarea, 40);
lv_obj_set_y(textarea, 50);
lv_obj_t * cb;
cb = lv_checkbox_create(lv_screen_active());
lv_checkbox_set_text(cb, "save");
lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
lv_obj_update_layout(cb);
lv_obj_set_x(cb, 80);
lv_obj_set_y(cb, 145);
lv_obj_t * cb1 = lv_checkbox_create(lv_screen_active());
lv_checkbox_set_text(cb1, "auto");
lv_obj_add_event_cb(cb1, event_handler, LV_EVENT_ALL, NULL);
lv_obj_update_layout(cb1);
lv_obj_set_x(cb1, 160);
lv_obj_set_y(cb1, 145);
lv_obj_t * btn1 = lv_button_create(lv_screen_active());
lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);
lv_obj_remove_flag(btn1, LV_OBJ_FLAG_PRESS_LOCK);
lv_obj_set_width(btn1, 140);
lv_obj_set_height(btn1, 24);
lv_obj_set_x(btn1, 40);
lv_obj_set_y(btn1, 170);
label = lv_label_create(btn1);
lv_label_set_text(label, "login");
lv_obj_center(label);
lv_obj_t * btn2 = lv_button_create(lv_screen_active());
lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);
lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
lv_obj_set_height(btn2, LV_SIZE_CONTENT);
lv_obj_set_width(btn2, 140);
lv_obj_set_height(btn2, 24);
lv_obj_set_x(btn2, 40);
lv_obj_set_y(btn2, 200);
label = lv_label_create(btn2);
lv_label_set_text(label, "register");
lv_obj_center(label);
// 密码输入框
lv_obj_t *textarea1 = lv_textarea_create(lv_scr_act());
lv_textarea_set_placeholder_text(textarea1, "Please enter your password.");
lv_textarea_set_one_line(textarea1, true); // 单行模式
lv_obj_set_size(textarea1, 200, 40);
lv_obj_set_x(textarea1, 40);
lv_obj_set_y(textarea1, 100);
}
void app_main(void)
{
bsp_i2c_init();
pca9557_init();
bsp_lvgl_start();
lv_example_demo();
while(1){
vTaskDelay(10);
}
}

更多推荐
所有评论(0)