基于OpenHarmony的智能指南针

本文详细介绍了基于OpenHarmony的电子指南针实现,包括数据采集端使用Geek_Lite_Board上的AK8963三轴磁力计获取磁场数据,通过滤波计算角度,以及应用端利用JSUI、Canvas组件和NAPI展示指南针效果。设备间通过TCP通信传递数据,润和RK3568开发板接收并显示角度信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分。为什么电子指南针能指示方向?本 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
<think>嗯,用户想了解如何在OpenHarmony上开发智能家居解决方案,需要教程、示例和项目。首先,我需要回忆一下OpenHarmony的相关知识,尤其是关于智能家居的部分。 根据提供的引用资料,引用[1]提到了三方库组件,这可能涉及到设备连接和控制的库。引用[3]提到了MQTT和分布式子系统,这些在智能家居中很常用,比如设备间的通信和任务调度。智能家居通常需要设备互联、远程控制、自动化场景,所以可能需要用到分布式通信和任务调度子系统。 接下来,我需要整理开发步骤。通常开发流程包括环境搭建、系统架构理解、功能实现。根据引用[3],环境搭建有Windows和Ubuntu的指南,应该先指导用户配置开发环境。然后,系统架构中的分布式任务调度和通信子系统是关键,需要重点说明。 示例部分,可能需要一个简单的智能灯控制项目,使用MQTT进行通信,这样可以结合引用[3]中的MQTT讲解。代码示例需要确保语法正确,并且符合OpenHarmony的开发规范,比如使用ArkTS或JS,但用户提供的示例是Python的快速排序,不过OpenHarmony主要用JS/eTS,可能需要调整。 另外,引用[2]提到商用案例集,特别是智慧医疗和油气物联网,可能智能家居也有类似的结构,可以建议用户参考这些案例来设计解决方案。同时,要提到三方库,比如引用[1]中的地址,推荐使用现有的组件来加速开发。 可能用户的问题还包括如何测试、如何部署,以及实际项目中的注意事项,比如安全性和稳定性。所以相关问题部分可以包括开发环境配置、设备通信方法、分布式调度、安全措施和商用案例参考。 需要确保回答结构清晰,分步骤说明,并且引用相关的资料。同时,检查LaTeX格式是否正确,比如数学公式用$...$,但这里可能涉及较少,主要是在示例代码和架构描述上。最后,生成的相关问题要覆盖用户可能进一步询问的方向,帮助他们深入开发。</think>### 基于OpenHarmony智能家居开发解决方案 #### 1. 开发环境搭建 - **Windows/Ubuntu环境配置**:参考OpenHarmony官方文档,安装DevEco Studio、Node.js和hpm包管理器,配置SDK和工具链[^3]。 - **分布式能力支持**:确保系统支持分布式通信子系统(如设备发现、数据传输)和分布式任务调度子系统[^3]。 #### 2. 核心功能实现 - **设备互联**:通过MQTT协议实现设备间通信,示例代码: ```javascript // 设备状态订阅(以智能灯为例) import mqtt from '@ohos/mqtt'; const client = mqtt.connect('tcp://smart-home-broker:1883'); client.subscribe('home/light/status'); client.on('message', (topic, message) => { console.log(`接收到灯光状态:${message}`); }); ``` - **自动化场景**:利用分布式任务调度子系统实现联动控制(如温湿度传感器触发空调调节)。 #### 3. 示例项目参考 - **智能家居基础框架**: ```text project-root/ ├── entry/src/main/ets/ │ ├── SmartHome/ # 主模块 │ │ ├── pages/ # UI页面 │ │ ├── service/ # 设备服务层 │ │ └── utils/ # MQTT工具类 └── ohos_config/ # 分布式能力声明 ``` - **三方库集成**:使用OpenHarmony-TPC中的物联网组件(如设备控制库、协议解析库)加速开发[^1]。 #### 4. 商用级优化 - **安全加固**:通过HiChain实现设备身份认证,数据加密传输 - **稳定性方案**:参考《商用案例集》中油气物联网项目的断网重连机制[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值