加入交流群  

扫一扫,添加管理员微信
备注:参考设计,即可被拉入群
和也在搞设计小伙伴们碰一碰

收藏 

评论 

Lhe20gH9Qf 发布

户外智能指南针

 
设计简介

首先感谢立创举办的这个夏日趣玩活动(我又可以白嫖券了哈哈)

在现代户外探险的浪潮中,一款先进的户外智能指南针无疑是探险者们的得力助手。这款智能指南针融合了尖端科技与人性化设计,为探险者提供准确、便捷的方向指引,让每一次户外之行都更加安全、高效。

这款户外智能指南针采用高精度陀螺仪和磁力传感器,能够实时感知地球磁场变化,即使在复杂的地理环境中也能提供精准的方向指示。帮助探险者快速规划路线,避免迷失方向。

智能指南针的外观设计简洁大气,采用轻量化材质,携带方便,可轻松挂在背包或腰带上。其显示屏采用高清触控技术,即使在强光下也能清晰可见。界面布局直观友好,探险者可以轻松操作各项功能。

除了基本的方向指引功能外,这款智能指南针还具备多种实用特性。

在续航能力方面,这款户外智能指南针表现出色。它采用大容量锂电池,支持长时间待机和连续使用。

1、硬件设计

主控采用都是ESP32S3R8,传感器QMC5883L,屏幕为浦洋的1.69寸触摸屏,使用tp4056对锂电池进行充电,电池自带保护板就没有使用保护电路

支持供电与usb自动切换、通过LDO转3.3v,目前发现问题是ldo发热有点厉害,等有时间了改成专门的电源管理芯片试试。用0.5mm 30p座子引出了GPIO可以方便扩展后续功能,

烧录完全采用ESP32S3的usb口没有额外焊接排针,布局有限。板子比较简单,设计的一般般但是能用,哈哈。

2、焊接

焊接过程中比较难的就是ESP32S3了,其他都还好我是用风枪吹的,可以先把板子预热一下然后涂焊锡膏、多一点也没事、然后吹焊锡会自己跑出来、最后上点助焊剂用烙铁拖一下就好了。

那个屏幕座子注意温度就好不然容易吹化了

3、软件开发

所有代码都在github上面了,用的是idf开发的,屏幕驱动是st7789v+cst816s很常见,页面是lvgl、ui是参考油管的一位大佬的(没有审美哈哈)

wx-dev/esp32s3-idf-watch (github.com)

磁传感器用的是QMC5883L

读取传感器

 

void qmc5883l_read_xyz(t_sQMC5883L *p) {
    uint8_t status, data_ready = 0;
    int16_t mag_reg[3];

 

    qmc5883L_register_read(QMC5883L_STATUS, &status, 1); // 读状态寄存器 

 

    if (status & 0x01) {
        data_ready = 1;
    }
    if (data_ready == 1) {
        data_ready = 0;
        qmc5883L_register_read(QMC5883L_XOUT_L, (uint8_t *) mag_reg, 6);

 

        p->mag_x = mag_reg[0];
        p->mag_y = mag_reg[1];
        p->mag_z = mag_reg[2];
        
    }
}

 

校准地磁传感器

void calibrateMag()
{
    int x,y,z; //三轴数据
    int xMax, xMin, yMax, yMin, zMax, zMin;
    //初始化
    t_sQMC5883L p;
    qmc5883l_read_xyz(&p);
    xMax=xMin=x=p.mag_x;
    yMax=yMin=y=p.mag_y;
    zMax=zMin=z=p.mag_z;
    offsetX = offsetY = offsetZ = 0;
    for(int i=0;i<200;i++)
    {
        qmc5883l_read_xyz(&p);
        x=p.mag_x;
        y=p.mag_y;
        z=p.mag_z;
        // 计算最大值与最小值
        // 计算传感器绕X,Y,Z轴旋转时的磁场强度最大值和最小值
        if (x > xMax)
            xMax = x;
        if (x < xMin )
            xMin = x;
        if(y > yMax )
            yMax = y;
        if(y < yMin )
            yMin = y;
        if(z > zMax )
            zMax = z;
        if(z < zMin )
            zMin = z;
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
    //计算修正量
    if (abs(xMax - xMin) > CalThreshold)
        offsetX = (xMax + xMin) / 2;
    if (abs(yMax - yMin) > CalThreshold)
        offsetY = (yMax + yMin) / 2;
    if (abs(zMax - zMin) > CalThreshold)
        offsetZ = (zMax + zMin) / 2;
    ESP_LOGI(TAG, "offsetX = %d  offsetY = %d offsetZ = %d ", offsetX, offsetY, offsetZ);
    vTaskDelay(5000 / portTICK_PERIOD_MS);
}

计算角度值

void qmc5883l_fetch_azimuth(t_sQMC5883L *p) {
    qmc5883l_read_xyz(p);
    float headingRadians = atan2((double)((p->mag_y)-offsetY),(double)((p->mag_x)-offsetX));
    // 保证数据在0-2*PI之间
    if (headingRadians < 0) {
        headingRadians += 2 * M_PI;
    }
    int headingDegrees = headingRadians * 180 / M_PI;
    headingDegrees += -5; //磁偏角
    //保证数据在0-360之间
    if (headingDegrees > 360) {
        headingDegrees -= 360;
    }
    p->azimuth = (float) headingDegrees;
}

目前加了校准但是精度感觉还是不太行,特别是xy轴换成xz轴好一点,不知道是传感器的问题还是代码问题

页面设计

4、测试

目前测试地磁数据都能正常读取到没有啥大问题唯一就是精度有点差,等后续优化,硬件方面没有采用专门的电源管理芯片、板子有点热。

等后续板姿态传感器与温湿度传感器加上变成更高端的设备还能当开发板用了哈哈

5、成品展示

 

 

 

 

 

参考设计图片
×

!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。

 
猜您喜欢
群聊设计,与管理员及时沟通

欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。

 
查找数据手册?

EEWorld Datasheet 技术支持

论坛推荐 更多
更新时间2026-03-25 16:42:47

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

EEWORLD参考设计中心

站点相关: TI培训 德州仪器(TI)官方视频课程培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved