电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分。为什么电子指南针能指示方向?本 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<len; 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/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-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到板子里面。命令如下:

先挂载,再send
hdc_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》视频课程。

https://www.bilibili.com/video/BV1L44y1p7KE/

应用端代码地址

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/FA/electronic_compass

设备侧代码地址

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

https://gitee.com/geekros/OpenHarmony_For_STM32F427/tree/master/dev-code

参考文档

【电子指南针】

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/electronic_compass_FA

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/electronic_compass_Dev

【RK3568指导】

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld

【Geek_Lite_Board相关网址】

www.geekros.com

丰富多样的 OpenHarmony 开发样例离不开广大合作伙伴和开发者的贡献,如果你也想把自己开发的样例分享出来,欢迎把样例提交到 OpenHarmony 知识体系 SIG 仓来。

如何共建开发样例:

https://gitee.com/openharmony-sig/knowledge/blob/master/docs/co-construct_demos/README_zh.md

基于OpenHarmony的智能指南针的更多相关文章

  1. 基于OpenHarmony的智能喝水提醒器

    一.硬件说明 Neptune OpenHarmony物联网IOT模组Wi-Fi&蓝牙双模开发板.超声波模块.蜂鸣器模块.杜邦线若干 开发板相关资料:https://gitee.com/hiho ...

  2. 基于Linux的智能家居的设计(3)

    2  硬件设计 本课题的硬件设计包含主控制器.传输数据设计.数据採集设计.控制驱动设计.显示设计.门禁设计. 2.1  主控制器 依据方案三选择S3C6410主控芯片,S3C6410是由Samsung ...

  3. 基于Linux的智能家居的设计(4)

    3  开发环境的搭建 本次课题使用的开发环境比較特殊.没有一个现成的集成开发环境,需要自己一步一步的搭建开发环境,开发环境的搭建的过程十分复杂,并且假设没有这个开发环境本次课题就无法进行. 因此.在进 ...

  4. 基于Linux的智能家居的设计(2)

    1  系统整体设计方案 智能家居系统的是一个实时查询家庭的温湿度.照明控制.自己主动控制的设定.集家庭娱乐.智能安防为一体,大量数据快处理.可靠的系统,因此在硬件和软件上都有非常大的要求,因此在这里进 ...

  5. 毕业论文系列之基于WiFi的智能农业大棚管控系统设计代码

    #include <dht11.h>//dht11库 #include <MsTimer2.h>               //定时器库的 头文件 #include < ...

  6. 毕业设计——基于ZigBee的智能窗户控制系统的设计与实现

    题目:基于物联网的智能窗户控制系统的设计与实现 应用场景:突降大雨,家里没有关窗而进水:家中燃气泄漏,不能及时通风,威胁人身安全,存在火灾的隐患:家中窗户没关,让坏人有机可乘.长时间呆在人多.封闭的空 ...

  7. 基于ESP32的智能家居管理系统的设计与实现

    基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...

  8. 基于ROBO-MAS多智能体自主协同 高频投影定位系统

  9. 基于AI边缘智能网关的工业质检应用

    成品质量检验是工业生产最后必不可少的环节,随着我国工业化的蓬勃发展,工业产品日益迈向高端化.精密化,对于工业产品的质量检验要求和投入成本也在不断提高,产品质检涉及到比以往更多维度.更多零部件.更高精度 ...

  10. 基于5G/4G智能网关的大货车安全监测方案

    大货车是我们身边最常见的货运车辆,从各种原材料到货物成品,都需要大大小小的货车承担过程中的运输工作.而由于货车通常载重多.体积大.行车盲区多,因此也产生较多的交通安全风险. 针对大货车的交通安全保障, ...

随机推荐

  1. 对find命令结果进行操作

    # find匹配到一些文件后,可能希望对其进行一些操作,这时就可以使用-exec选项,exec选项后面跟着所要执行的命令,然后是一对{},一个空格和一个\,最后是一个分号; find . -type ...

  2. 【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性

    问题描述 App Service For Linux 中安装paping的操作步骤 解决步骤 1) 登录App Service的Kudu站点,点击Bash 2)使用命令下载paping压缩文件:#wg ...

  3. Lazada电商api接口 获取商品详情 数据采集

    iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Lazada电商数据采集API,供用户按需调用. 接口使用详情请参考Lazada接口文档 接 ...

  4. GB 2312字符集:中文编码的基石

    一.GB 2312字符集的背景 GB 2312字符集是中国国家标准委员会于1980年发布的一种中文字符集,是中国大陆最早的中文字符集之一.GB 2312字符集的发布填补了中国大陆中文编码的空白,为中文 ...

  5. 排查 dotNET Core 程序内存暴涨的问题

    0. 问题 新版本上线之后,发现内存猛涨,入站流量猛增,不清楚具体原因,部分接口提示 OOM 异常,随后 Pod 直接崩溃无限重启. 1. 准备 Pod 已经接入了 NewRelic 和 Graylo ...

  6. Python基础之程序与用户交互

    [一]Python基础之程序与用户交互 [一]程序如何与用户交互 用户通过input命令在窗口内与输入就可以让用户和窗口进行交流 input接受的所有数据类型都是 str 类型 username = ...

  7. 单词本z custom cu = com 一起 都, st=suet 自己, om 尾缀, 都是自己身上的 = 习惯,习俗

    单词本z custom cu = com 一起 都, st=suet 自己, om 尾缀, 都是自己身上的 = 习惯,习俗 custom 来自拉丁语 consuetus cu = com st = s ...

  8. TI工程师总结的判断ADS129x是否工作正常的方法步骤

    当大多数 ADC 出现无响应时,可以通过一些基本的调试技术帮助验证器件是否仍然正常工作.以下是 ADS129x 器件出现无响应时需要采取的一些基本步骤: 为器件通电.然后探测器件电源引脚或最近的去耦电 ...

  9. c语言中的指针,数组和结构体结合的一个经典案例

    一 你真正懂了C语言了吗? 很多人刚把c语言用了两年,就以为很懂,等遇到稍微深层次一点的问题,就卡住了.这里,有一个问题,可以考察你对这三者理解如何. 二 一个例子: #include <std ...

  10. idea的安装和无限期试用

    十年前在笔者开发的时候一直使用的是eclipse软件,但后来所有的发现公司基本用的是idea,还得重新学习idea用法,所以准备在去新公司前,来学习使用idea吧 第一步:安装idea https:/ ...