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

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

3天内不再提示

【技术分享】电子指南针项目分享 含设备端+应用端讲解

电子发烧友论坛 2022-07-18 10:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分。为什么电子指南针能指示方向?本 Demo 将为你呈现,其中蕴含了人类智慧及大自然的奥妙。

本项目分为数据采集端(设备端)和效果展示端(应用端):

数据采集端(设备端):

1、指南针数据采集端:使用的是 Geek_Lite_Board 开发板,其内置了三轴磁力计 AK8963,通过解析磁力计数据获得指南针数据信息,操作系统版本为 OpenAtom OpenHarmony 3.0(以下简称“OpenHarmony”);

2、指南针效果展示端:使用的是润和 RK3568 开发板,操作系统版本为 OpenHarmony 3.1 release。

效果展示端则体现了 OpenHarmony JS UI、Canvas 组件和 NAPI 的能力:

效果展示端(应用端)

1、Canvas 组件是一个画布组件,获取到画布对象后,可以自定义绘制图形,比如圆形,线条等,本项目中应用端的指南针界面是基于 Canvas 组件开发;

2、NAPl (NativeAPI)是 OpenHarmony 标准系统的一种 JS API 实现机制,通过 NAPI 可以实现 JS 与 C/C++ 代码互相访问。本项目应用端通过 NAPI 来接收设备端发出的检测信息。

当设备应用启动之后,运行效果如下动图所示:

b08e4e62-0616-11ed-9ade-dac502259ad0.gif

一、基本原理

地球是一个大磁体,地球的两个极分别在接近地理南极和地理北极的地方,一般情况下地球的磁场强度在 0.5 高斯左右(高斯是磁场强度单位)。

Geek_Lite_Board 开发板带有 AK8963 三轴磁力计。三轴磁力计能够测出相互垂直的三个方向的磁力大小。通常我们把传感器平放,即让重力方向与传感器垂直,假设重力方向为 z 轴,其余两轴为 x 轴和 y 轴。在只受地球磁场的环境下(忽略其余弱小干扰),x 轴 y 轴检测到的磁力数据的矢量和就等于接收到的地球磁场。

我们利用 x 轴与 y 轴的比值,就能确定目前朝向正北边差多少角度。例如现测到 x 轴数据接近 0.5 高斯,y 轴数据接近 0,就认为目前的 x 轴方向就是正北方。那 x 轴方向是哪个方向?关于 x 轴方向,生产传感器芯片的厂商会预定义好传感器的 x 轴、y 轴及 z 轴方向(通常垂直芯片表面的为 z 轴)。

数据流程

b10a6cb8-0616-11ed-9ade-dac502259ad0.png

智能指南针整体方案如上图所示,主要由 Geek_Lite_Board 开发板和润和 RK3568 开发板构成,它们采用局域网(路由器)TCP 协议的通信方式。

1. Geek_Lite_Board 开发板通过板载的磁力计获取磁场数据,磁场数据经过处理后得到角度数据;

2. 角度信息通过 ESP8266 无线 Wi-Fi 模块发送到指南针应用端;

3. 指南针应用端通过 NAPI 接口获取底层网络数据,并在页面展示。

二、功能实现

指南针数据的获取

Geek_Lite_Board 开发板通过 IIC 接口与 AK8963 三轴磁力计通信,读取三轴方向的磁场数据,通过磁场数据计算后得到指南针的方位数据。

● AK8963介绍

AK8963是采用高灵敏度霍尔传感器技术,内部集成了检测x、y、z轴的磁传感器、传感器驱动电路信号放大器和用于处理每个传感器信号的算术电路。同时,还配备了自测功能。其紧凑的封装,还可适用于配备gps的手机的地图导航,实现行人导航等功能。

● AK8963测量数据的读取

AK8963 和单片机通过 IIC 接口连接,单片机操作 IIC 总线按照数据手册的操作时序操作即可读取 AK8963 的数据,AK8963 获取测量数据的函数实现如下:

uint8_t Mpu_Read_Bytes(uint8_t const regAddr, uint8_t *pData, uint8_t len){ int i = 0; MPU_ENABLE; while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI5, regAddr | 0x80); while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(SPI5); for(i=0; i while(SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI5, 0x00); while(SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_RXNE) == RESET); pData[i] = SPI_I2S_ReceiveData(SPI5); } MPU_DISABLE; return 0;}

● AK8963数据处理得到磁力数据

调用 Mpu_Read_Bytes 函数获取测量数据,其中 MPU_BUFF[15] 到 MPU_BUFF[20] 这六个字节的数据就是磁力计的数据。此时的磁力计数据还不稳定不能直接用来计算指南针的角度,还需要进行滤波处理,此处用到的滤波算法是滑动均值滤波。数据处理代码如下:

Mpu_Read_Bytes(MPUREG_ACCEL_XOUT_H, MPU_BUFF, 28);if(MPU_BUFF[14] == 1) { // 从 MPU_BUFF[]中提取磁力数据 Mpu_Data.mag_x = (MPU_BUFF[16] << 8) | MPU_BUFF[15];    Mpu_Data.mag_y = (MPU_BUFF[18] << 8) | MPU_BUFF[17];    Mpu_Data.mag_z = (MPU_BUFF[20] << 8) | MPU_BUFF[19];  // 对x轴方向磁力计数据进行滤波,取滑动平均  for(i=0;i<14;i++) {    mag_x_buff[i] = mag_x_buff[i+1]   //滑动  }      if(Mpu_Data.mag_x > -500 && Mpu_Data.mag_x < 500) {        mag_x_buff[14] = Mpu_Data.mag_x;    }    //取平均值    Mpu_Calc.mag_x = ( mag_x_buff[0] + mag_x_buff[1] + mag_x_buff[2] \    + mag_x_buff[3] + mag_x_buff[4] + mag_x_buff[5] + mag_x_buff[6] \    + mag_x_buff[7] + mag_x_buff[8] + mag_x_buff[9] + mag_x_buff[10] \    + mag_x_buff[11] + mag_x_buff[12] + mag_x_buff[13]    + mag_x_buff[14] )/15.0f;     // 对y轴方向磁力计数据进行滤波,取滑动平均    for(i=0;i<14;i++){      mag_y_buff[i] = mag_y_buff[i+1];  //滑动            }            if(Mpu_Data.mag_y > -500 && Mpu_Data.mag_y < 500){     mag_y_buff[14] = Mpu_Data.mag_y;    }    //取平均值    Mpu_Calc.mag_y = ( mag_y_buff[0] + mag_y_buff[1] + mag_y_buff[2] \    + mag_y_buff[3] + mag_y_buff[4] + mag_y_buff[5] + mag_y_buff[6] \    + mag_y_buff[7] + mag_y_buff[8] + mag_y_buff[9] + mag_y_buff[10] \    + mag_y_buff[11] + mag_y_buff[12] + mag_y_buff[13]    + mag_y_buff[14] )/15.0f;    // 对磁力计z轴方向进行滤波    mag_z_buff[0] = mag_z_buff[1];    mag_z_buff[1] = Mpu_Data.mag_z;    Mpu_Calc.mag_z = (int16_t)((mag_z_buff[0] + mag_z_buff[1])/ 2.0f);}

● 角度数据计算

磁力计数据通过滤波后得到 x y z 三个轴方向的磁力分量,计算出 x 和 y轴的 tan 值,再通过反正切计算出角度,角度经过滑动平均得到最终需要显示出来的指南针角度值,计算过程见如下代码。

angle_buff[0] = angle_buff[1]; angle_buff[1] = angle_buff[2]; angle_buff[2] = ((uint16_t)(atan2((Mpu_Calc.mag_y - Mag_y_OffSet),\ (Mpu_Calc.mag_x - Mag_x_OffSet)) *180 / PI + 180 )); angle = ((uint16_t)((angle_buff[0] + angle_buff[1] + angle_buff[2]) \ / 3.0 + 0.5));

指南针数据的传输

Geek_Lite_Board 开发板外挂 ESP8266 Wi-Fi 模组通过局域网 TCP 通信的方式将角度数据传输给润和 RK3568 开发板,润和 RK3568 开发板通过 NAPI 接口获取底层网络数据,从网络数据中解析出角度数据,并在显示屏上显示出来。

角度数据的显示

角度数据的显示由润和 RK3568 开发板实现,主要分为指南针显示页面的绘制和 NAPI 从局域网上获取角度数据并展示到界面上。

指南针显示页面

指南针的显示页面主要通过 Canvas 组件画图完成,包含方位角度、指南针针盘和指示线,显示整体效果如下图所示。

b133ae84-0616-11ed-9ade-dac502259ad0.png

指南针针盘由一个 Canvas 组件构成,包含了三个部分,分别为刻度盘、角度数字、方位文字,他们的效果图分别如下:

● 刻度盘

b17f1aa4-0616-11ed-9ade-dac502259ad0.png

● 角度数字

b194e26c-0616-11ed-9ade-dac502259ad0.png

● 方位文字

b1aaf804-0616-11ed-9ade-dac502259ad0.png

Canvas组件相关知识可以参考:https://gitee.com/openharmony/do ... ts-canvas-canvas.md

NAPI

NAPI(Native API)是 OpenHarmony 标准系统的一种 JS API 实现机制,适合封装 IO、CPU 密集型、OS 底层等能力并对外暴露 JS 接口,通过 NAPI 可以实现 JS 与 C/C++ 代码互相访问。润和 RK3568 应用端通过 NAPI 来接收设备端发出的检测信息。

底层 NAPI 模块封装

● 本应用封装的模块名为 tcpserverapi,先下载源码,源码路径为:


https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/dev/team_x/napi_tcpservermodule/tcpservermodule

● 下载完成后放到 OpenHarmony 3.1 Release 版本源码根目录,并配置编译脚本;第一次编译完成需要烧写整个镜像,请参考[开发板上新 | RK3568 开发板上丝滑体验 OpenHarmony 标准系统]:


https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start

● 后面修改模块源码,只需将库send到板子里面。命令如下:

先挂载,再sendhdc_std shell mount -o remount,rw /hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so应用端导入NAPI模块import tcpserverapi from '@ohos.tcpserverapi'应用端NAPI接口调用//调用initServer接口 初始化 TCP 服务器tcpserverapi.initServer()//调用recvMsg 获取并解析SMT32板子发送过来的角度tcpserverapi.recvMsg().then((result) => { var resultAngle = result.angle; })

更多 NAPI 相关知识请参考《标准设备应用开发 Native Api》视频课程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智驾模拟软件推荐——为什么选择Keymotek的aiSim?

    随着自动驾驶技术的快速发展,车企和科技公司对于模拟测试平台的需求越来越强。从L2/ADAS到L4/L5等级的自动驾驶,虚拟模拟已经成为其中的关键一环。特别是对于「」智驾(
    的头像 发表于 11-18 11:35 542次阅读

    电话光端机发射和接收怎么接

    在现代通信工程和安防监控系统中,广州邮科(YK)的电话光端机因其稳定可靠的性能而被广泛应用。对于许多初次接触该设备的工程师或用户而言,如何正确连接发射(TX)和接收(RX)是确保整个系统畅通无阻的关键第一步。本文将为您提供一
    的头像 发表于 11-08 11:21 785次阅读
    电话光端机发射<b class='flag-5'>端</b>和接收<b class='flag-5'>端</b>怎么接

    ‌TE Connectivity ES-Cap 0号端接技术解析与应用指南

    封,防止任何可能导致腐蚀问题的水分进入。 这种粘接层在温度范围很广的环境中表现良好。通常情况下,使用热气枪或红外线加热设备装置可轻松安装盖。TE的0号端接盖适用于汽车T2和多种商用环境。
    的头像 发表于 11-06 14:04 310次阅读

    高压单探头使用指南:安全精确测量的关键技术

    高压单探头使用需严格遵循安全规范、设备检查、接地原则及校准流程,确保测量准确与操作安全。
    的头像 发表于 11-06 11:45 126次阅读

    自动驾驶中常提的一段式(单段)是个啥?

    自动驾驶技术的发展,催生出技术的应用,一段式(end-to-end single-s
    的头像 发表于 10-18 10:16 1375次阅读

    光缆怎么分ab

    光缆分AB是通信工程中的关键步骤,主要用于确保光纤连接的极性正确,避免信号传输错误。以下是光缆分AB的详细说明: 一、AB的定义与作用 定义: A:光缆的起始
    的头像 发表于 09-28 09:38 944次阅读

    SOLIDWORKS PDM Professional安装部署指南:从服务器到客户的详细步骤

    一份详尽的SOLIDWORKS PDM Professional安装指南,面向IT管理员,涵盖从SQL Server配置、服务器安装到客户设置的全过程,确保您高效、正确地完成PDM系统部署
    的头像 发表于 09-11 17:37 999次阅读

    Nullmax自动驾驶最新研究成果入选ICCV 2025

    Nullmax 在一段式核心技术上的深厚积累与创新实力,尤其在自动驾驶系统设计领域的研究已处于行业领先水平。
    的头像 发表于 07-05 15:40 1553次阅读
    Nullmax<b class='flag-5'>端</b>到<b class='flag-5'>端</b>自动驾驶最新研究成果入选ICCV 2025

    华邦电子创新存储赋能侧智能

    人工智能技术的飞速发展,#侧AI 正在成为智能设备发展的重要趋势。华邦电子正凭借其卓越存储技术和丰富的产品,积极布局端侧 AI 市场,为智
    的头像 发表于 05-14 09:59 1084次阅读
    华邦<b class='flag-5'>电子</b>创新存储赋能<b class='flag-5'>端</b>侧智能<b class='flag-5'>端</b>侧

    一文带你厘清自动驾驶架构差异

    [首发于智驾最前沿微信公众号]随着自动驾驶技术飞速发展,智能驾驶系统的设计思路也经历了从传统模块化架构到大模型转变。传统模块化架构将感知、预测、规划和控制等子任务拆分开,分别由不同模块完成;而
    的头像 发表于 05-08 09:07 784次阅读
    一文带你厘清自动驾驶<b class='flag-5'>端</b>到<b class='flag-5'>端</b>架构差异

    从蓝牙音频模块中了解I2S的主和从功能应用

    在无线音频领域,蓝牙I2S(Inter-ICSound)技术正逐渐成为高保真音质的核心解决方案。不同于传统蓝牙音频的二次编解码损耗,蓝牙I2S通过主(Master)和从(Slave)的协同
    的头像 发表于 04-25 16:06 872次阅读
    从蓝牙音频模块中了解I2S的主<b class='flag-5'>端</b>和从<b class='flag-5'>端</b>功能应用

    小米汽车智驾技术介绍

    随着智能驾驶技术的发展,越来越多企业纷纷进入汽车行业,希望能分得独属于自己的一杯羹。但在市场的选择下,已有一部分品牌走入了历史的尘埃。但也有部分车企,却稳稳地站稳了脚跟,小米就是其中一个,作为
    的头像 发表于 03-31 18:17 4777次阅读
    小米汽车<b class='flag-5'>端</b>到<b class='flag-5'>端</b>智驾<b class='flag-5'>技术</b>介绍

    炬芯科技探索侧AI技术与应用

    随着人工智能技术的迅猛发展,AI应用正从云端向终端迅速扩张。侧AI的核心在于让智能设备在本地完成数据处理和推理决策,并且可以在较低能耗情况下的持续工作,从而减少对云端的依赖,提升交互效率和保障数据安全。
    的头像 发表于 03-27 14:58 911次阅读

    【一文看懂】什么是侧算力?

    随着物联网(IoT)、人工智能和5G技术的快速发展,侧算力正逐渐成为智能设备性能提升和智能化应用实现的关键技术。什么是侧算力,它的应用价
    的头像 发表于 02-24 12:02 2948次阅读
    【一文看懂】什么是<b class='flag-5'>端</b>侧算力?

    自动驾驶技术研究与分析

    编者语:「智驾最前沿」微信公众号后台回复:C-0450,获取本文参考报告:《自动驾驶行业研究报告》pdf下载方式。 自动驾驶进入2024年,无疑成为其最火热的一项
    的头像 发表于 12-19 13:07 1512次阅读