企业号介绍

全部
  • 全部
  • 产品
  • 方案
  • 文章
  • 资料
  • 企业

电子发烧友论坛

百万电子工程师社区平台

262 内容数 1.8w 浏览量 46 粉丝

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

07-18 21浏览量

电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分。为什么电子指南针能指示方向?本 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 来接收设备端发出的检测信息。

 

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

   

 

一、基本原理

 

地球是一个大磁体,地球的两个极分别在接近地理南极和地理北极的地方,一般情况下地球的磁场强度在 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 轴)。

 

数据流程

 

 

 

智能指南针整体方案如上图所示,主要由 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 组件画图完成,包含方位角度、指南针针盘和指示线,显示整体效果如下图所示。

 

 

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

 

● 刻度盘

 

 

 

● 角度数字

 

 

 

● 方位文字

 

 

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》视频课程。

 

 

最近浏览过的用户(0查看全部

为你推荐

  • 【福利专场】爆款元器件全场打折降价,都是现货!遇到赶紧囤!2022-09-27 14:54

    好物不嫌多爆款元器件福利专场来了!低价!现货!不可错过!爆款元器件全场99折华秋爆款专区全场99折,100多款型号等你来抢!这些爆款价格美丽,均来自TI、美信、Vishay、Winbond、ADI等大牌原厂,时常霸榜市场热搜,用户心水型号!华秋部分爆款型号>>点击查看全部爆款型号
    10浏览量
  • 【电路设计】PCB反复评审难题,终极解决密码出现了?(文末有资料)2022-09-27 14:52

    “随着电子产品的高速发展,PCB生产中大量使用BGA、QFP、PGA和CSP等高集成度器件,PCB的复杂程度也大大增加,随之而来的PCB的设计和制造难、测试困难、焊接不良、器件不匹配和维修困难等生产问题,导致整个产品工期延误,产品返修率高。”01青铜操作始终在不同问题之间来回穿梭你是否经常在研发产品中,碰到以下这些问题:元器件选型不当、PCB设计缺陷,导致方
    13浏览量
  • 【技术干货】PCB板漏孔、漏槽在设计端如何避坑2022-09-27 14:50

    电子产品的设计是从画原理图到PCB布局布线,经常会由于工作经验这方面知识缺乏,而出现各种错误,阻碍我们后续工作的进行,严重时导致做出来的电路板根本不能用。所以我们要尽量提高这方面的知识,避免各种错误的出现。本文为大家介绍PCB画板时常见的钻孔问题,避免后续踩同样的坑。钻孔分为三类,通孔、盲孔、埋孔。通孔有插件孔(PTH)、螺丝定位孔(NPTH),盲、埋孔和通
    9浏览量
  • 【有奖问答】参与技术大咖活动答题,赢取年度社区之星!2022-09-27 14:48

    你是否遇到过一些让人绞尽脑汁的技术难题?又或者积累了很多知识碎片想要分享。电子发烧友“技术大咖”活动邀请你大展身手提出你的问题,留下你的专业答案,和小伙伴们一起共同成长吧!本次出题不限板块技术,成功参与,就有机会可以获得丰富的奖品礼包!01活动时间长期有效(每月一期,最后一个工作日开奖)02参与方式准备好技术问题&社区问答帖子的答案,即可在相应的技术板块中进
    6浏览量
  • 【开源社区】OpenHarmony开源开发者成长计划—解决方案学生挑战赛Demo Day2022-09-27 14:47

    -赛制说明-DemoDay是配套解决方案学生挑战赛的活动,向全国各地的开发者展示参赛作品并评选一等奖的线上直播活动。本次大赛技术评审团已评选出十支参赛队伍,来参加成长计划学生挑战赛DemoDay演示日,晋级学生队伍从问题场景、技术方案和社会价值三个方面讲解自己的作品创意想法,由产品专家现场打分和直播问观众在线投票,综合得分最高的前三支队伍获得成长计划学生挑战
    4浏览量
  • 【资料合集】各类智能小车开源设计资料汇总(程序+原理图+代码)2022-09-27 14:45

    本期为各种智能小车参考资料,多数为参赛作品,均包含原理图、代码、手册等资料。同时,电子发烧友与Altium联合举办Altium实训班——声源跟踪小车设计挑战赛,欢迎各位发烧友参赛,赢取丰厚礼品。戳如下链接,立即参与智能小车设计挑战赛!Altium实训班——声源跟踪小车设计挑战赛智能小车资料汇总(程序文件+原理图+项目代码)一、电子设计大赛作品—多功能循迹小车
    8浏览量
  • 【火热报名中】Altium实训班——声源跟踪小车设计挑战赛2022-09-27 14:43

    活动介绍本活动是一个为期1.5个月的声源跟踪小车实战项目教程,旨在帮助用户从单纯的“视频学习”拓展为“直播学习+实践挑战”。活动时间10.25-11.05线上直播学习(6节)11.06-12.07PCB审核&打板&编程12.08-12.22评审&投票&颁奖活动流程1、学习6节直播课程——从硬件电路的功能讲解,PCB布线及设计,到实物小车的调试与问题分析,我们
    6浏览量
  • 业界首款!支持富设备开发,OpenHarmony开发者都选它!2022-09-27 14:41

    智能硬件开放生态已经进入富设备产业化的时代,作为OpenHarmony标准系统的先驱者,润和软件推出了首款支持OpenHarmony富设备的开发板DAYU200。DAYU200开发套件是基于瑞芯微RK3568设计的一款AI智能开发板,集成了双核心GPU和高性能NPU,支持蓝牙、Wi-Fi、音频和摄像头等功能,拥有非常丰富的扩展接口,可满足NVR、工业网关、信
    13浏览量
  • 【在招岗位】中科亿海微2022火热招聘中!29个岗位总有一个适合你2022-09-20 19:54

    这里有一批业界翘楚、博士、资深专家传帮带教还有一群和你一样逐梦人与你同行有广阔的平台任你施展拳脚快来中科亿海微开启人生新篇章吧公司简介中科亿海微电子科技(苏州)有限公司,是中国科学院“可编程芯片与系统”研究领域的科研与产业化团队,按照国家创新驱动发展战略,发起成立的以“可编程逻辑芯片与可重构系统”为技术特色的高新技术企业,公司于2017年1月在苏州注册成立。
    8浏览量
  • 【知识干货】最关心的制造成本来了!怎么使用DFM降低成本?2022-09-20 19:52

    关于PCBA制造的成本有很多方面。核心的部分主要有pcb光板的材料,smt加工的费用,元器件的成本。除了核心部分外,还有一系列的环节会直接影响PCBA的成本。其中有很多不被关注的环节容易被忽略,这些被忽略的环节包括除板材的其他物料、测试、人工、装配、设计和PCB流程优化、smt贴片流程优化等。01.影响裸板(PCB)部分的成本:1、板材费用(不同的板材费用是
    DFM
    22浏览量