成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

U8g2圖形庫(kù)使用技巧記錄(1)

李昌杰 / 4402人閱讀

摘要:支持顯示控制器,,,,,,,,,,,,,,,,,,,,,,等。和的功能包括包括所有圖形程序線框圓畫(huà)。支持很豐富的字體庫(kù)。僅文本輸出字符設(shè)備。僅允許使用每個(gè)字符固定大小像素的字體。直接寫(xiě)到顯示屏上,無(wú)需微控制器中的緩沖需要消耗較少的空間資源。

????????~~呆萌的瓦力平衡機(jī)器人~~的顯示UI我希望做得精致一些 所以尋覓了好久,最終尋來(lái)了U8g2這款精巧的圖形庫(kù),這款ui圖形庫(kù)可以算得上是圖形庫(kù)里面的瑞士小軍?,深得吾愛(ài),所以該系列的文章既是我篩選圖形庫(kù)過(guò)程的心路歷程,也是在選中U8g2這款圖形庫(kù)后的一些開(kāi)發(fā)記錄;

U8g2圖形庫(kù)簡(jiǎn)介:

1.U8g2 是用于嵌入式設(shè)備的單色圖形庫(kù)。

  • 支持顯示控制器:SSD1305、SSD1306、SSD1309、SSD1316、SSD1322、SSD1325、SSD1327、SSD1329、SSD1606、 SSD1607、 SH1106、SH1107、SH1108、SH1122、T6963、RA8835、LC7981、PCD8544、PCF8812、HX1230、UC1601、UC1604、UC1608、UC1610、 UC1611, UC1617, UC1701, ST7511, ST7528, ST7565, ST7567, ST7571, ST7586, ST7588, ST75256, ST75320, NT7 534, ST7920, IST3020, IST7920, LD7032, KS0108, KS0713, SED1520, SBN1661, IL3820, MAX7219 等。

2.U8g2 還包括 U8x8 庫(kù)。U8g2 和 U8x8 的功能包括:

  • U8g2
    • 包括所有圖形程序(線/框/圓畫(huà))。
    • 支持很豐富的字體庫(kù)。
    • 需要微控制器中的一些內(nèi)存來(lái)渲染顯示屏(需要消耗較多的ram空間資源)。
  • U8x8
    • 僅文本輸出(字符)設(shè)備。
    • 僅允許使用每個(gè)字符固定大小(8x8 像素)的字體。
    • 直接寫(xiě)到顯示屏上,無(wú)需微控制器中的緩沖(需要消耗較少的ram空間資源)。

U8g2圖形庫(kù)使用技巧(硬件驅(qū)動(dòng)接口部分的分析和選擇):

? ? ? ? U8g2圖形庫(kù)的驅(qū)動(dòng)接口主要取決于所選用的lcd屏幕的驅(qū)動(dòng)芯片方案,目前常用的驅(qū)動(dòng)接口多為spi和i2c兩種串行總線,如果需要較高的刷新幀率,spi的驅(qū)動(dòng)方式是比較好的選擇,spi的驅(qū)動(dòng)時(shí)鐘頻率一般可以達(dá)到8Mbit,而i2c的方式一般只能達(dá)到400Kbit,但是使用spi方式驅(qū)動(dòng)的時(shí)候,需要比較多的io管腳資源,一般最少需要3個(gè)io(三線spi方式),而i2c方式一般只需要2個(gè)io就可以滿(mǎn)足,考慮到~~呆萌的瓦力平衡機(jī)器人~~包含了兩路對(duì)時(shí)序要求很高的foc電機(jī)控制,所以果斷選擇了比較高效的spi方式(選用的oled模組的驅(qū)動(dòng)方案采用的是SSD1306,該方案既支持i2c方式,也支持spi的方式);

?U8g2圖形庫(kù)使用技巧(軟件驅(qū)動(dòng)程序分析和記錄):

? ? ? ? U8g2圖形庫(kù)的代碼框架寫(xiě)得非常的完善,只需要實(shí)現(xiàn)底層幾個(gè)讀寫(xiě)接口函數(shù),就可以把整個(gè)圖形庫(kù)驅(qū)動(dòng)起來(lái),它的幾乎所有的初始化函數(shù)接口都定義在u8g2_d_setup.c源文件中,該源文件實(shí)現(xiàn)了u8g2圖形庫(kù)所有支持lcd驅(qū)動(dòng)方案的初始化方法,通過(guò)函數(shù)名來(lái)區(qū)分,初始化函數(shù)的名字包含了很多硬件相關(guān)的信息,就拿我在使用的oled模組的初始化函數(shù)來(lái)作為例子,模組驅(qū)動(dòng)方案為SSD1306,分辨率為128x64,驅(qū)動(dòng)接口為三線spi方式,所以可選的初始化方法如下:

u8g2_Setup_ssd1306_128x64_noname_1 /*芯片SSD1306,分辨率128x64,128字節(jié)頁(yè)大小*/u8g2_Setup_ssd1306_128x64_noname_2 /*芯片SSD1306,分辨率128x64,256字節(jié)頁(yè)大小*/u8g2_Setup_ssd1306_128x64_noname_f /*芯片SSD1306,分辨率128x64,1024字節(jié)頁(yè)大小*/

?考慮到esp32的ram資源比較充足的,果斷選擇了u8g2_Setup_ssd1306_128x64_noname_f方法,到這里了就結(jié)束了!spi的驅(qū)動(dòng)方式體現(xiàn)在哪里呢?

接著往里扒--->

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_delay_cb)

該函數(shù)需要傳入四個(gè)參數(shù)--->

u8g2_t *u8g2;                  /*u8g2圖形庫(kù)結(jié)構(gòu)體指針*/const u8g2_cb_t *rotation;     /*u8g2圖形庫(kù)ui旋轉(zhuǎn):U8G2_R0(無(wú)旋轉(zhuǎn)),U8G2_R1(順時(shí)針90°),U8G2_R2(順時(shí)針180°)......*/u8x8_msg_cb byte_cb;           /*u8g2圖形庫(kù)字節(jié)交互回調(diào)函數(shù)*/u8x8_msg_cb gpio_and_delay_cb; /*u8g2圖形庫(kù)gpio和延時(shí)回調(diào)函數(shù)*/

所以和spi部分相關(guān)的就是--->

u8x8_msg_cb byte_cb;           /*u8g2圖形庫(kù)字節(jié)交互回調(diào)函數(shù)*/

這個(gè)callback函數(shù)需要我們自己實(shí)現(xiàn)如下的方法--->

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(TAG, "U8X8_MSG_BYTE_SEND:%d,%d", arg_int ,spi_device_max_transfer_sz(u8g2_spi));		max_transfer_sz = spi_device_max_transfer_sz(u8g2_spi);		if (arg_int <= max_transfer_sz) {			u8g2_tran.length 	 = arg_int*8,			u8g2_tran.tx_buffer	 = (const void *)arg_ptr,			u8g2_tran.rxlength	 = 0,			u8g2_tran.rx_buffer	 = NULL,				spi_device_polling_transmit(u8g2_spi, &u8g2_tran);			} else {			int packet_num = arg_int/max_transfer_sz;			int packet_remain = arg_int%max_transfer_sz;			uint8_t *data_prt = (uint8_t *)arg_ptr;						if (packet_num > 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);			}		}      	break;          case U8X8_MSG_BYTE_SET_DC:		u8g2_ssd1306_set_dc(arg_int);      	break;          default:      return 0;  }  return 1;}

?而剩下的u8x8_msg_cb gpio_and_delay_cb這個(gè)callback主要是用來(lái)做輸入相關(guān)功能的回調(diào)接口(瓦力ui配合rc遙控器實(shí)現(xiàn)的輸入交互就是通過(guò)該接口實(shí)現(xiàn)的),u8g2庫(kù)可以通過(guò)該接口來(lái)讀取硬件按鍵輸入的狀態(tài)信息然后進(jìn)行處理--->

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, U8X8_UNUSED void *arg_ptr){	case U8X8_MSG_GPIO_MENU_SELECT:	  u8x8->gpio_result = u8g2_gpio_menu_select();	  vTaskDelay(3);      break;	case U8X8_MSG_GPIO_MENU_NEXT:	  u8x8->gpio_result = u8g2_gpio_menu_next();	  vTaskDelay(3);      break;	case U8X8_MSG_GPIO_MENU_PREV:	  u8x8->gpio_result = u8g2_gpio_menu_prev();	  vTaskDelay(3);      break;	case U8X8_MSG_GPIO_MENU_HOME:	  u8x8->gpio_result = u8g2_gpio_menu_home();	  vTaskDelay(3);      break;	case U8X8_MSG_GPIO_MENU_UP:	  u8x8->gpio_result = u8g2_gpio_menu_up();	  vTaskDelay(3);      break;	case U8X8_MSG_GPIO_MENU_DOWN:	  u8x8->gpio_result = u8g2_gpio_menu_down();	  vTaskDelay(3);      break;	case U8X8_MSG_GPIO_RESET:	  u8g2_ssd1306_set_rst(arg_int);	  break;    default:	  break;  }  return 1;}

到此底層相關(guān)的工作基本做完,接下來(lái)就是一些基于上層API接口的花活了--->

void u8g2_ssd1306_init(spi_device_handle_t handle){	u8g2_spi = handle;    //Initialize non-SPI GPIOs    gpio_set_direction(PIN_NUM_DC,  GPIO_MODE_OUTPUT);    gpio_set_direction(PIN_NUM_RST, GPIO_MODE_OUTPUT);    //Reset the display    gpio_set_level(PIN_NUM_RST, 0);    vTaskDelay(100 / portTICK_RATE_MS);    gpio_set_level(PIN_NUM_RST, 1);    vTaskDelay(100 / portTICK_RATE_MS);		u8g2_Setup_ssd1306_128x64_noname_f(		&u8g2,		U8G2_R0,		u8x8_byte_hw_spi,		u8x8_gpio_and_delay);  // init u8g2 structure	ESP_LOGI(TAG, "u8g2_InitDisplay");	u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,	ESP_LOGI(TAG, "u8g2_SetPowerSave");	u8g2_SetPowerSave(&u8g2, 0); // wake up display		ESP_LOGI(TAG, "u8g2_ClearBuffer");	u8g2_ClearBuffer(&u8g2);	ESP_LOGI(TAG, "u8g2_SetFont");	u8g2_SetFont(&u8g2, u8g2_font_6x10_mf);		ESP_LOGI(TAG, "u8g2_DrawStr");	u8g2_DrawStr(&u8g2, 20, 14, "esp32 foc +-x%/");	ESP_LOGI(TAG, "u8g2 init all done!");}

雖然是花活,其中也有一些需要注意的地方,例如在設(shè)置字庫(kù)的時(shí)候,如果選擇了一些精簡(jiǎn)字庫(kù),會(huì)導(dǎo)致字符刷新出現(xiàn)字符像素殘留的現(xiàn)象,特別是在動(dòng)態(tài)刷新一些數(shù)字的情景下,效果很差,十分影響顯示效果;

小結(jié):

?????????這次主要記錄了為~~呆萌的瓦力平衡機(jī)器人~~選擇ui圖像庫(kù)的心路歷程以及在開(kāi)始使用該圖形庫(kù)時(shí)所需要做的一些前期分析和實(shí)操過(guò)程中需要注意的技術(shù)要點(diǎn);

以下是一些和本文相關(guān)的文章鏈接和U8g2的wiki鏈接:

一、~~呆萌的瓦力平衡機(jī)器人~~鏈接:

? ? ? ? 1.基于ESP32雙無(wú)刷FOC電機(jī)的瓦力平衡機(jī)器人(1);

????????2.基于ESP32雙無(wú)刷FOC電機(jī)的瓦力平衡機(jī)器人(2);

二、U8g2 wiki鏈接:

? ? ? ? 1.U8g2_wiki;

后續(xù)的計(jì)劃:

? ? ? ?下一期準(zhǔn)備記錄在做U8g2界面刷新和兩路foc電機(jī)驅(qū)動(dòng)遇到的沖突問(wèn)題,以及我的解決思路;

???????????????? ? ??大家如果也感興趣,可以加qun交流學(xué)習(xí)(群里提供了豐富的esp32資料):

????????????????????????????????????????????????????????燥起來(lái)吧,sao年?。。。。?!?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119239.html

相關(guān)文章

  • 螞蟻金服新一代數(shù)據(jù)可視化引擎 G2

    摘要:新公司已經(jīng)呆了一個(gè)多月,目前著手一個(gè)數(shù)據(jù)可視化的項(xiàng)目,數(shù)據(jù)可視化肯定要用到圖形庫(kù)如等,經(jīng)決定我的這個(gè)項(xiàng)目用阿里旗下螞蟻金服所開(kāi)發(fā)的圖表庫(kù)。數(shù)據(jù)提示框內(nèi)提示的信息還可以通過(guò)格式化函數(shù)動(dòng)態(tài)指定。 新公司已經(jīng)呆了一個(gè)多月,目前著手一個(gè)數(shù)據(jù)可視化的項(xiàng)目,數(shù)據(jù)可視化肯定要用到圖形庫(kù)如D3、Highcharts、ECharts、Chart等,經(jīng)決定我的這個(gè)項(xiàng)目用阿里旗下螞蟻金服所開(kāi)發(fā)的G2圖表庫(kù)。...

    animabear 評(píng)論0 收藏0
  • 機(jī)器視覺(jué)、模式識(shí)別庫(kù)匯總

    摘要:十開(kāi)放模式識(shí)別項(xiàng)目開(kāi)放模式識(shí)別項(xiàng)目,致力于開(kāi)發(fā)出一套包含圖像處理計(jì)算機(jī)視覺(jué)自然語(yǔ)言處理模式識(shí)別機(jī)器學(xué)習(xí)和相關(guān)領(lǐng)域算法的函數(shù)庫(kù)。 一、開(kāi)源生物特征識(shí)別庫(kù) OpenBROpenBR 是一個(gè)用來(lái)從照片中識(shí)別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計(jì)算機(jī)視覺(jué)庫(kù) OpenCVOpenC...

    habren 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.35 - WebGL:打開(kāi)網(wǎng)頁(yè)看大片

    摘要:在文末,我會(huì)附上一個(gè)可加載的模型方便學(xué)習(xí)中文藝術(shù)字渲染用原生可以很容易地繪制文字,但是原生提供的文字效果美化功能十分有限。 showImg(https://segmentfault.com/img/bVWYnb?w=900&h=385); WebGL 可以說(shuō)是 HTML5 技術(shù)生態(tài)鏈中最為令人振奮的標(biāo)準(zhǔn)之一,它把 Web 帶入了 3D 的時(shí)代。 初識(shí) WebGL 先通過(guò)幾個(gè)使用 Web...

    objc94 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<