0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ElfBoard技术贴|借助AI编程,轻松搞定ELF-RK3506开发板上光照传感器的数据读取

ElfBoard 2026-01-29 16:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

特别感谢北京理工大学的李海老师提供以下文章,供大家学习与参考。

上一篇文章介绍了在ELF-RK3506开发板上搭建AI编程环境的方法,但测试场景较为简单,生成的代码与硬件无关。本文将挑战不手动编写代码,完全依赖TRAE工具生成直接控制硬件外设的代码,具体以光照传感器为例。

书写任务需求

首先创建一个“功能需求.md”文件。文件内容如下:

硬件配置:
1. ELF-RK3506开发板
2. GY-30传感器模块
3. 杜邦线若干
ELF-RK3506开发板的I2C2接口已经正确连接了GY-30传感器模块,传感器模块的地址为0x23。
GY-30传感器使用的BH1750FVI传感器,其数据手册可以在BH1750FVI.pdf中找到。请注意其中对I2C接口的描述,以及对传感器的地址的说明。
完成如下任务:
1. 创建一个基于Linux控制台的测试程序,周期读取GY-30传感器的数据,显示读取到的I2C原始数据方便调试,并将其转换为lux单位。每次显示一个数据,数据格式为"光照: %d lux",其中%d为传感器读取到的光照值。并参照下面的数据给出光照等级的显示:
* 室内强光照射:约 1000~3000 lux
* 阴天室外:约 500~1000 lux
* 晴天室外阴影处:约 10000~20000 lux
* 普通办公室照明:约 300~500 lux
2. 创建vscode的tasks.json中的任务进行交叉编译生成可执行文件,任务名为"Build",使用~/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc进行编译,编译参数为"-o test_gy30 test_gy30.c",其中test_gy30.c为测试程序的源文件,test_gy30为编译得到的可执行文件。
3. 创建vscode的tasks.json中的任务进行SSH连接的任务"Deploy via SSH"拷贝编译得到的可执行文件到服务器上并修改权限为777,服务器IP为192.168.1.123,用户名为root,无密码。本任务的执行不依赖任务2。注意对JSON中转义字符处理。

这次使用的提示词相对于上次的测试要复杂很多,一是因为任务更复杂了,二是为了让TRAE生成的代码更接近我们的需求。

首先向模型介绍了硬件连接的相关情况,这里还提供了GY-30光照传感器所使用BH1750FVI.pdf文件,目的是为了让模型能够通过读取文件获得关键的接口信息,因为我在此前使用模型生成代码时经常发现不是所有模型都对GY-30光照传感器的模块信息很熟悉,有的模型会输出幻觉代码,或者不知道在转换原始数据到Lux时需要除以1.2。

在任务1需求方面,限制了输出的格式,这样可以方便调试。

任务2是一个生成业务,相对比较简单,和以前测试时使用的描述差不多,只是稍微详细了一些。

任务3是部署任务,和构建AI编程环境那次相比有几点变化:

  1. 1、明确了生成的文件为tasks.json,避免模型生成到laugh.json中去;
  2. 2、在外面先前测试中,发现模型会把任务2当做任务3的前置任务,这完全不必要,所以明确说了任务2和任务3无关联。
  3. 3、删除了运行程序的要求,主要的原因是上次是一次执行完执行输出结果,而这次是循环输出,如果还让TRAE去执行,会导致程序一直不输出,好像死机了,所以这次改为手动运行;

总之,任务描述越详细,越容易得到正确结果。

代码生成

在代码生成时,把模式由Auto改为豆包的coder模型,因为不确定任务需求在不同下表现相同,这样做可以避免由于TRAE选择不同的模型运行导致调试困难。然后把“功能需求.md”文件拖到聊天框中,让它根据需求执行就可以了。

wKgZO2l7H6yAHfWNAAMkziXuXmc978.png

TRAE会自动分析我们的需求,根据分析结果确定任务,并开始执行。中间有几个步骤需要人工确认,但很快就能输出正确结果。

test_gy30.c代码

下面是生成的C代码:

在外面先前测试中,发现模型会把任务2当做任务3的前置任务,这完全不必要,所以明确说了任务2和任务3无关联。

删除了运行程序的要求,主要的原因是上次是一次执行完执行输出结果,而这次是循环输出,如果还让TRAE去执行,会导致程序一直不输出,好像死机了,所以这次改为手动运行;

#include
 
#include
 
#include
 
#include
 
#include
 
#include
 
#define
 I2C_DEVICE "/dev/i2c-2"
#define
 SENSOR_ADDR 0x23
#define
 CONTINUOUS_HIGH_RES_MODE 0x10
int 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("读取传感器数据失败");
            break;
        }
        printf("原始数据: 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("光照等级: 较暗环境\n");
        } else {
            printf("光照等级: 极强光照\n");
        }
        printf("\n");
        sleep(1);
    }
    close(i2c_fd);
    return 0;
}

tasks.json文件

这个文件中包括我们的两个任务:

{
    "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自动修正。

测试结果

下面是一段测试结果:

wKgZO2l7H5WABEmEAAZQWNChs_k731.png

从程序结果看,光照传感器可以感知不同的光照。

结束语

从这次实践来看,利用AI进行编程已成为不可逆转的趋势。尽管嵌入式系统编程相对复杂,但只要投入适当努力,完全能够获得理想的结果。非常欢迎大家动手尝试,并分享你在实践中的经验和心得。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5212

    文章

    20763

    浏览量

    338777
  • 嵌入式板卡
    +关注

    关注

    0

    文章

    20

    浏览量

    10717
  • 开发板
    +关注

    关注

    26

    文章

    6507

    浏览量

    121361
  • Linux开发
    +关注

    关注

    0

    文章

    47

    浏览量

    7788
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ElfBoard技术|ELF 1开发板适配摄像头详解

    ELF1及ELF1S开发板适配的OV5640摄像头,集成了CMOS图像传感器,作为一款500万像素级别的摄像头,不仅能够支持最高达2592x1944分辨率的QSXGA图像输出,帧率可达
    的头像 发表于 12-27 10:16 2393次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|<b class='flag-5'>ELF</b> 1<b class='flag-5'>开发板</b>适配摄像头详解

    ElfBoard技术|如何在【RK3588】ELF 2开发板上进行UART引脚复用配置

    IOMUX(引脚功能复用)是芯片厂商为高效利用有限硬件引脚资源而设计的关键技术,它允许单个物理引脚通过软件配置为多种不同的功能(如GPIO、UART、I2C等)。不同SoC芯片的配置方式各异,本文将以【RK3588】ELF 2
    的头像 发表于 11-18 16:54 5834次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在【<b class='flag-5'>RK</b>3588】<b class='flag-5'>ELF</b> 2<b class='flag-5'>开发板</b>上进行UART引脚复用配置

    ElfBoard技术|如何在【RK3588】ELF 2开发板实现I2C功能复用

    等。由于此项配置的具体实现因SoC平台而异,本文特以【RK3588】ELF 2开发板上的I2C6引脚为例,系统说明从硬件规格查询到软件驱动配置的完整步骤。
    的头像 发表于 12-04 10:10 8570次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在【<b class='flag-5'>RK</b>3588】<b class='flag-5'>ELF</b> 2<b class='flag-5'>开发板</b>实现I2C功能复用

    ElfBoard技术|如何在ELF - RK3506开发板上构建AI编程环境

    特别感谢北京理工大学的李海老师提供以下文章,供大家学习与参考。RK-3506开发板开箱ELF-RK3506开发板的核心与底板通过邮票孔方式
    的头像 发表于 01-23 11:12 7793次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在<b class='flag-5'>ELF</b> - <b class='flag-5'>RK3506</b><b class='flag-5'>开发板</b>上构建<b class='flag-5'>AI</b><b class='flag-5'>编程</b>环境

    飞凌精灵(ElfBoard技术|如何在ELF-RK3506开发板上实现GPIO复用

    2026年全国大学生嵌入式芯片与系统设计竞赛报名已正式启动。本次瑞芯微&飞凌嵌入式赛题共设置了三个参赛平台(ELF2开发板ELF-RV1126B开发板
    的头像 发表于 03-16 14:55 6582次阅读
    飞凌精灵(<b class='flag-5'>ElfBoard</b>)<b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在<b class='flag-5'>ELF-RK3506</b><b class='flag-5'>开发板</b>上实现GPIO复用

    技术|如何在【RK3588】ELF 2开发板上部署小龙虾OpenClaw

    ELF-RK3506开发板作为参赛平台。所有的选题都是采用开放和半开放的方式设定,核心宗旨绝非简单的技术验证,而是重点考察同学们对特定行业的洞察力与实际问题解决能力。我们鼓励参赛团队立足真实行业场景,深挖场景痛点,把所
    的头像 发表于 04-02 09:30 1.3w次阅读
    <b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在【<b class='flag-5'>RK</b>3588】<b class='flag-5'>ELF</b> 2<b class='flag-5'>开发板</b>上部署小龙虾OpenClaw

    飞凌精灵(ElfBoard技术|如何在RK3506开发板上实现UART功能复用

    差异,本文将以ELF-RK3506开发板上UART2的引脚复用为例,详细介绍从硬件查询到软件配置的完整实现流程。1.引脚确认在开始配置之前,首先需要了解ELF-R
    的头像 发表于 04-28 11:12 1.1w次阅读
    飞凌精灵(<b class='flag-5'>ElfBoard</b>)<b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在<b class='flag-5'>RK3506</b><b class='flag-5'>开发板</b>上实现UART功能复用

    米尔基于RK3562与RK3506开发板有什么区别?

    的 Cortex-A53+Cortex-M0,同时还集成Mali-G52 GPU以及1 TOPS算力的NPU,所以相比RK3506J的开发板来说性能更强,适合中高负载任务(如AI推理&
    发表于 07-11 09:32

    ELF 1开发板试用】+传感器检测

    ELF 1开发板通过几种传感器的测试,如温湿度、六轴传感器等,而在配备功能扩展板的情况下,还能进行光照强度的检测。 温湿度检测
    发表于 11-29 11:59

    ElfBoard技术|如何在ELF 1开发板上搭建流媒体服务

    流媒体服务是一种专门用于传输实时数据流的服务软件,广泛用于视频直播、视频会议、音频播放等应用场景。在嵌入式开发领域,将流媒体服务部署到
    的头像 发表于 08-20 14:48 1675次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在<b class='flag-5'>ELF</b> 1<b class='flag-5'>开发板</b>上搭建流媒体服务<b class='flag-5'>器</b>

    ElfBoard技术|【RK3588】ELF 2开发板开机自启动详解

    在嵌入式系统开发中,合理管理开机自启动项目能够优化系统启动流程,确保关键服务和应用按时加载运行。本文将详细介绍在ELF2开发板Linux5.10.209系统下基于SystemVinit服务管理机制
    的头像 发表于 06-27 16:20 2298次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|【<b class='flag-5'>RK</b>3588】<b class='flag-5'>ELF</b> 2<b class='flag-5'>开发板</b>开机自启动详解

    有奖丨米尔 瑞芯微RK3506开发板免费试用来啦!

    米尔与瑞芯微合作发布的新品基于瑞芯微RK3506应用处理的MYD-YR3506开发板免费试用名额增加啦
    的头像 发表于 07-10 08:03 1303次阅读
    有奖丨米尔 瑞芯微<b class='flag-5'>RK3506</b><b class='flag-5'>开发板</b>免费试用来啦!

    RK3506开发板Linux开发板极致性价比之选

    RK3506开发板Linux开发板极致性价比之选瑞芯微RK3506开发板,3核Cortex-A7@1.5GHz+Cortex-M0,Linu
    的头像 发表于 09-11 16:26 4073次阅读
    <b class='flag-5'>RK3506</b><b class='flag-5'>开发板</b>Linux<b class='flag-5'>开发板</b>极致性价比之选

    ElfBoard技术|如何在【RK3588】ELF 2开发板实现GPIO功能复用

    RK3588】ELF2开发板的GPIO引脚为例,详细阐述从硬件查找到软件配置的完整流程。1.引脚确认在开始配置之前,首先需要了解【RK3588】E
    的头像 发表于 12-29 10:37 1663次阅读
    <b class='flag-5'>ElfBoard</b><b class='flag-5'>技术</b><b class='flag-5'>贴</b>|如何在【<b class='flag-5'>RK</b>3588】<b class='flag-5'>ELF</b> 2<b class='flag-5'>开发板</b>实现GPIO功能复用

    【超值首选!仅88元】ELF-RK3506开发板限时优惠震撼来袭

    ElfBoard特别推出了ELF-RK3506开发板,助力大家快速掌握实际应用场景下的嵌入式Linux开发技能。【性能卓越,技术领先】
    的头像 发表于 01-16 16:41 1440次阅读
    【超值首选!仅88元】<b class='flag-5'>ELF-RK3506</b><b class='flag-5'>开发板</b>限时优惠震撼来袭