特別感謝北京理工大學的李海老師提供以下文章,供大家學習與參考。
?
上一篇文章介紹了在ELF-RK3506開發(fā)板上搭建AI編程環(huán)境的方法,但測試場景較為簡單,生成的代碼與硬件無關。本文將挑戰(zhàn)不手動編寫代碼,完全依賴TRAE工具生成直接控制硬件外設的代碼,具體以光照傳感器為例。
?
首先創(chuàng)建一個“功能需求.md”文件。文件內容如下:
硬件配置:1.?ELF-RK3506開發(fā)板2.?GY-30傳感器模塊3.?杜邦線若干ELF-RK3506開發(fā)板的I2C2接口已經(jīng)正確連接了GY-30傳感器模塊,傳感器模塊的地址為0x23。GY-30傳感器使用的BH1750FVI傳感器,其數(shù)據(jù)手冊可以在BH1750FVI.pdf中找到。請注意其中對I2C接口的描述,以及對傳感器的地址的說明。完成如下任務:1.?創(chuàng)建一個基于Linux控制臺的測試程序,周期讀取GY-30傳感器的數(shù)據(jù),顯示讀取到的I2C原始數(shù)據(jù)方便調試,并將其轉換為lux單位。每次顯示一個數(shù)據(jù),數(shù)據(jù)格式為"光照: %d lux",其中%d為傳感器讀取到的光照值。并參照下面的數(shù)據(jù)給出光照等級的顯示:*?室內強光照射:約 1000~3000 lux*?陰天室外:約 500~1000 lux*?晴天室外陰影處:約 10000~20000 lux*?普通辦公室照明:約 300~500 lux2.?創(chuàng)建vscode的tasks.json中的任務進行交叉編譯生成可執(zhí)行文件,任務名為"Build",使用~/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc進行編譯,編譯參數(shù)為"-o test_gy30 test_gy30.c",其中test_gy30.c為測試程序的源文件,test_gy30為編譯得到的可執(zhí)行文件。3. 創(chuàng)建vscode的tasks.json中的任務進行SSH連接的任務"Deploy via SSH"拷貝編譯得到的可執(zhí)行文件到服務器上并修改權限為777,服務器IP為192.168.1.123,用戶名為root,無密碼。本任務的執(zhí)行不依賴任務2。注意對JSON中轉義字符處理。
這次使用的提示詞相對于上次的測試要復雜很多,一是因為任務更復雜了,二是為了讓TRAE生成的代碼更接近我們的需求。
?
首先向模型介紹了硬件連接的相關情況,這里還提供了GY-30光照傳感器所使用BH1750FVI.pdf文件,目的是為了讓模型能夠通過讀取文件獲得關鍵的接口信息,因為我在此前使用模型生成代碼時經(jīng)常發(fā)現(xiàn)不是所有模型都對GY-30光照傳感器的模塊信息很熟悉,有的模型會輸出幻覺代碼,或者不知道在轉換原始數(shù)據(jù)到Lux時需要除以1.2。
?
在任務1需求方面,限制了輸出的格式,這樣可以方便調試。
?
任務2是一個生成業(yè)務,相對比較簡單,和以前測試時使用的描述差不多,只是稍微詳細了一些。
?
任務3是部署任務,和構建AI編程環(huán)境那次相比有幾點變化:
?
明確了生成的文件為tasks.json,避免模型生成到laugh.json中去;
刪除了運行程序的要求,主要的原因是上次是一次執(zhí)行完執(zhí)行輸出結果,而這次是循環(huán)輸出,如果還讓TRAE去執(zhí)行,會導致程序一直不輸出,好像死機了,所以這次改為手動運行;
在外面先前測試中,發(fā)現(xiàn)模型會把任務2當做任務3的前置任務,這完全不必要,所以明確說了任務2和任務3無關聯(lián)。
?
總之,任務描述越詳細,越容易得到正確結果。
?
在代碼生成時,把模式由Auto改為豆包的coder模型,因為不確定任務需求在不同下表現(xiàn)相同,這樣做可以避免由于TRAE選擇不同的模型運行導致調試困難。然后把“功能需求.md”文件拖到聊天框中,讓它根據(jù)需求執(zhí)行就可以了。

TRAE會自動分析我們的需求,根據(jù)分析結果確定任務,并開始執(zhí)行。中間有幾個步驟需要人工確認,但很快就能輸出正確結果。
?
下面是生成的C代碼:
???????I2C_DEVICE?"/dev/i2c-2"?SENSOR_ADDR?0x23?CONTINUOUS_HIGH_RES_MODE?0x10int?main()?{? ??int?i2c_fd =?open(I2C_DEVICE, O_RDWR);? ??if?(i2c_fd 0) {? ? ? ??perror("無法打開I2C設備");? ? ? ??return?1;? ? }? ??if?(ioctl(i2c_fd, I2C_SLAVE, SENSOR_ADDR) 0) {? ? ? ??perror("無法設置I2C從設備地址");? ? ? ??close(i2c_fd);? ? ? ??return?1;? ? }? ??unsigned?char?mode_cmd = CONTINUOUS_HIGH_RES_MODE;? ??if?(write(i2c_fd, &mode_cmd,?1) !=?1) {? ? ? ??perror("無法設置傳感器模式");? ? ? ??close(i2c_fd);? ? ? ??return?1;? ? }? ??usleep(180000);? ??printf("GY-30傳感器測試程序已啟動\n");? ??printf("按Ctrl+C退出\n\n");? ??while?(1) {? ? ? ??unsigned?char?buf[2];? ? ? ??if?(read(i2c_fd, buf,?2) !=?2) {? ? ? ? ? ??perror("讀取傳感器數(shù)據(jù)失敗");? ? ? ? ? ??break;? ? ? ? }? ? ? ??printf("原始數(shù)據(jù): buf[0]=0x%02X, buf[1]=0x%02X\n", buf[0], buf[1]);? ? ? ??int?lux = (buf[0] <8) | buf[1];? ? ? ? lux = (int)(lux /?1.2);? ? ? ??printf("光照: %d lux\n", lux);? ? ? ??if?(lux >=?10000?&& lux <=?20000) {? ? ? ? ? ??printf("光照等級: 晴天室外陰影處\n");? ? ? ? }?else?if?(lux >=?1000?&& lux <=?3000) {? ? ? ? ? ??printf("光照等級: 室內強光照射\n");? ? ? ? }?else?if?(lux >=?500?&& lux <=?1000) {? ? ? ? ? ??printf("光照等級: 陰天室外\n");? ? ? ? }?else?if?(lux >=?300?&& lux <=?500) {? ? ? ? ? ??printf("光照等級: 普通辦公室照明\n");? ? ? ? }?else?if?(lux 300) {? ? ? ? ? ??printf("光照等級: 較暗環(huán)境\n");? ? ? ? }?else?{? ? ? ? ? ??printf("光照等級: 極強光照\n");? ? ? ? }? ? ? ??printf("\n");? ? ? ??sleep(1);? ? }? ??close(i2c_fd);? ??return?0;}
?
這個文件中包括我們的兩個任務:
{? ??"version":?"2.0.0",? ??"tasks": [? ? ? ? {? ? ? ? ? ??"label":?"Build",? ? ? ? ? ??"type":?"shell",? ? ? ? ? ??"command":?"~/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc",? ? ? ? ? ??"args": [? ? ? ? ? ? ? ??"-o",? ? ? ? ? ? ? ??"test_gy30",? ? ? ? ? ? ? ??"test_gy30.c"? ? ? ? ? ? ],? ? ? ? ? ??"group": {? ? ? ? ? ? ? ??"kind":?"build",? ? ? ? ? ? ? ??"isDefault": true? ? ? ? ? ? },? ? ? ? ? ??"problemMatcher": ["$msCompile"]? ? ? ? },? ? ? ? {? ? ? ? ? ??"label":?"Deploy via SSH",? ? ? ? ? ??"type":?"shell",? ? ? ? ? ??"command":?"bash",? ? ? ? ? ??"args": [? ? ? ? ? ? ? ??"-c",? ? ? ? ? ? ? ??"scp test_gy30 root@192.168.1.123:/root/ && ssh root@192.168.1.123 'chmod 777 /root/test_gy30'"? ? ? ? ? ? ],? ? ? ? ? ??"problemMatcher": [],? ? ? ? ? ??"dependsOn": [],? ? ? ? ? ??"dependsOrder":?"sequence"? ? ? ? }? ? ]}
這個文件的第二個任務其實有問題的,盡管我提示模型注意轉義字符,但是它的處理還是不太對,不過可以通過分析運行結果讓TRAE自動修正。
?
下面是一段測試結果:

從程序結果看,光照傳感器可以感知不同的光照。
?
從這次實踐來看,利用AI進行編程已成為不可逆轉的趨勢。盡管嵌入式系統(tǒng)編程相對復雜,但只要投入適當努力,完全能夠獲得理想的結果。非常歡迎大家動手嘗試,并分享你在實踐中的經(jīng)驗和心得。
