摘要:支持显示控制器等。 它还包括所有图形程序中包含的线框圆绘图等功能。 支持非常丰富的字体库。 仅用于文本的输出字符设备。 仅允许每个字符具有固定大小(以像素为单位)的字体。 直接写入显示器无需在微控制器上进行缓冲,并且消耗更少的空间资源。
瑞士陆军图形库是我的最爱。 所以这个系列文章不仅是我选择图形库的历程,也是选择U8G2图形库后的一些发展的记录。 U8g2图形库概述:
1.U8g2是一个用于嵌入式设备的单色图形库。
支持显示控制器:SSD1305、SSD1306、SSD1309、SSD1316、SSD1322、SSD1325、SSD1327、SSD1329、SSD1606、SSD1607、SH1106、SH1107、SH1108、SH1122、T6963、RA8835、LC7981、8 544、 12、HX1230、UC1601 、UC1604、UC1608、UC1610、UC1611、UC1617、UC1701、ST7511、ST7528、ST7565、ST7567、ST7571、ST7586、ST7588、ST75256、ST75320、NT7 534、ST7920、IST3020、 2 0、LD7032、KS0108、KS0713、SED1520、SBN1661 、IL3820、MAX7219等
2.U8g2还包括U8x8库。 U8g2 和 U8x8 功能包括:
U8g2 包括:所有图形程序(线条/框架/圆形绘图)。 支持非常丰富的字体库。 渲染显示需要微控制器的一些内存(消耗更多 RAM 空间资源)。 U8x8 纯文本输出(字符)设备。 仅允许使用每个字符固定大小(8x8 像素)的字体。 直接写入显示器,无需在微控制器上进行缓冲(消耗更少的 RAM 空间资源)。
U8g2图形库使用技巧(硬件驱动接口部分分析与选择):
U8g2图形库的驱动接口主要根据所选的液晶屏驱动芯片而定。解决方案。 目前最常用的驱动器接口是 SPI 和 I2C 串行总线。 如果您需要更高的刷新帧率,我们建议选择SPI驱动方式。 SPI的驱动时钟频率一般可以达到8Mbits,而I2C方式一般只能达到400Kbits。 然而,以 SPI 方式驱动时需要更多 IO 引脚资源。 一般来说,至少需要3个IOS(3线SPI方法),而I2C方法通常只需要2个IOS。 考虑漂亮的瓷砖。 力平衡机器人~~包含两个FOC电机控制,对时序要求较高,所以我们选择了效率更高的SPI方式(所选OLED模块的驱动方案是i2c方式,支持我用的是SSD1306,既支持spi method);
U8g2图形库使用技巧(软件驱动分析与录制):
U8g2图形库代码框架写得非常好。 要驱动整个图形库,只需要实现几个底层读写接口函数即可。 几乎所有的初始化函数接口都定义在u8g2_d_setup.c源文件中。 该源文件实现了支持LCD驱动方案的u8g2图形库的所有初始化方法。 它们通过函数名称来区分。 初始化函数名称包含很多与硬件相关的信息。 考虑我正在使用的 OLED 模块的初始化函数。 例如,模块驱动方案为SSD1306,分辨率为128x64,驱动接口为3线SPI,因此初始化是可选的。方法如下:
u8g2_Setup_ssd1306_128x64_noname_1 /*芯片SSD1306,分辨率128x64,128字节页面大小*/u8g2_Setup_ssd1306_128x64_noname_2 /*芯片SSD1306,分辨率128x64,256字节页面大小*/u8g2 _Setup _ssd1306_128x64_noname_f /*芯片SSD1306,分辨率128x64,页大小1024 bytes*/
考虑到esp32的RAM资源比较充足,我就一试了之,选择了u8g2_Setup_ssd1306_128x64_noname_f方法就这样了。 spi入口方法体现在哪里?
接下来深入研究 --->
void u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_lay _ cb)
这个功能你需要执行以下操作,输入四个参数 --->
u8g2_t *u8g2; /*u8g2 图形库结构体指针*/const u8g2_cb_t *rotation; / *u8g2 图形库 ui 旋转: U8G2_R0(不旋转)、U8G2_R1(顺时针90°)、U8G2_R2(顺时针180°)...*/u8x8_msg_cb byte_cb; /*u8g2图形库字节交互回调函数* /u8x8_msg_cb gpio_and_lay_cb; /*u8g2图形库的gpio和延迟时间回调函数*/
也就是说,与spi相关的部分是--->。
u8x8_msg_cb 通过/*U8g2 图形库字节交互回调函数*/
在这个回调函数中,必须自己实现以下方法 --->
uint8_t u8x8_byte_hw_spi(u8x8_t *u8x8, uint8_t msg , uint8_t arg_int, void *arg_ptr){ uint8_t max_transfer_sz = 0; switch(msg){ case u8x8_msg_byte_send: // esp_logi( :%d,d",arg_int,spi_device_max_transfer_sz( u8g2_spi)) 0) {for(int i =0;i 0) {u8g2_tran.length = packet_remain*8,u8g2_tran.tx_buffer = (const void *)data_prt,u8g2_tran.rxlength = 0,u8g2_tran.rx_buffer = NULL,spi_device_polling_transmit( u8g2_spi, &u8g2_tran);}} 中断; :u8g2_ssd1306_set_dc( arg_int); 默认值:返回 0。 } return 1;}
剩下的u8x8_msg_cb gpio_and_lay_cb回调主要用于输入相关功能的回调接口(Walli ui、RC遥控中实现的输入交互都是通过该接口实现的)。 u8g2 库可以使用此接口读取和处理硬件按键输入的状态信息 - -[ k4]>
uint8_t u8x8_gpio_and_lay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, U8X8_UNUSED void *arg_ptr){案例 U8X8_MSG_GPIO_MENU_SELECT: u8x8->gpio_result = u8g2_gpio_menu _select(); vTaskDelay(3); 案例 U8X8_MSG_GPIO_MENU_NEXT: u8x8[k4 ]>gpio_result = u8g2_gpio_menu_next(3 );中断;情况 U8X8_MSG_GPIO_MENU_PREV: u8x8- >gpio_result = u8g2_gpio_menu_prev(); vTaskDelay(3); 案例 U8X8_MSG_GPIO_ME NU_HOME: u8x8->gpio_result = u8g2_gpio_menu_home (); 案例 U8X8_MSG_GPIO_MENU_UP: u8x8->gp io_result = u8g2_gpio_menu_up(); vTaskDelay(3); 案例 U8X8_MSG_GPIO_MENU_DOWN: u8x8->gpio_result = u8g2_gpio_menu _down(3);到此基本工作就基本完成了,接下来就是创建上层API接口了这项工作是基于.
void u8g2_ssd1306_init(spi_device_handle_t handle){u8g2_spi = handle; //初始化非-SPI GPIO gpio_set_direction(PIN_NUM_DC, GPIO_MODE_OUTPUT); gpio_set_direction(PIN_NUM_RST, GPIO_MODE_OUTPUT); //重置显示 gpio_set _level(PIN_) NUM_RST, 0) ; vTaskDelay(100 / portTICK_RATE_MS); vTaskDelay(100 / portTICK_RATE_MS);u8g2_Setup_ssd1306_128x64_noname_f(&u8g2,U8G2_R0, u8x8_byte_hw_spi,u8x 8_ gpio_and_delay); // 初始化 u8g2 结构体 ESP_LOGI(TAG, "u8g2_InitDisplay" ) ;u8g2_InitDisplay( &u8g2); // 将初始化序列发送到显示器。 此后,显示器将进入睡眠模式,ESP_LOGI(TAG, "u8g2_SetPowerSave");u8g2_SetPowerSave(&u8g2, 0); // 开始显示 ESP_LOGI(TAG, "u8g2_ClearBuffer");u8g2_ClearBuffer(&u8g2);ESP_LOGI(TAG, "u8g2_SetFont");u8g2_SetFont(&u8g2, u 8g2_font_6x 10_mf ); ESP_LOGI(TAG, "u8g2_DrawStr");u8g2_DrawStr(&u8g2, 20, 14, "esp32 foc +-x%/");ESP_LOGI(TAG, "u8g2 init allned!");}
但是 Hana : 有一些事情需要注意。 例如,在设置字库时,如果选择某种简化字库,则字符刷新时会保留字符的像素。 尤其是在一些数字动态更新的情况下,效果非常低。 会极大的影响显示效果。
总结:
这次主要讲解~~可爱沃利平衡机器人~~选择UI图库的过程,以及开始使用图库的过程一些初步分析以及操作时应注意的技术要点。
以下是与本文相关的一些文章链接和 wiki 链接。 U8g2:
1.~~可爱的Wally平衡机器人~~链接:
1.基于ESP32双无刷FOC电机的Wally平衡机器人(1);
p>
2. 基于 ESP32 双无刷 FOC 电机和平衡机器人 (2)。
2. U8g2 wiki 链接:
1.U8g2_wiki;
后续计划:
下一期,当U8g2 界面已更新 我们计划记录发生的任何冲突问题。 双向焦点电机驱动器,以及我的解决方案想法;
如果有兴趣,可以加入QUN进行交流和学习(这个群提供了丰富的esp32信息)。
享受除夕夜! ! ! ! ! !
评论前必须登录!
注册