锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于OpenHarmony的智能指南针

时间:2022-09-11 11:00:00 1720fa集成电路

电子指南针是现代重要的导航工具,从飞船导航到个人手机导航。电子指南针可以说与我们的生活息息相关。为什么电子指南针能指出方向? Demo 它将向您展示,包含人类智慧和自然的奥秘。本项目分为数据采集端(设备端)和效果显示端(应用端):

1.指南针数据采集端:使用 Geek_Lite_Board 开发板内置三轴磁力计 AK8963操作系统版本通过分析磁力计数据获取指南针数据信息 OpenAtom OpenHarmony 3.(以下简称0OpenHarmony”);

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 轴数据接近 认为现在的 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地图导航,实现行人导航等功能。

●AK读取8963测量数据

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;  hile (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/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 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章