1 Star 0 Fork 146

MaDiXin / knowledge_demo_temp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
readme.md 8.98 KB
一键复制 编辑 原始数据 按行查看 历史
赵康博 提交于 2022-09-19 08:04 . update docs/metal_detection/readme.md.

OpenHarmony金属探测器

一、简介

金属探测器demo是基于OpenHarmony 3.1 release版本,通过磁场强度判断是否检测到金属。当检测到金属物体后,设备端会发出报警并发送信号到应用端。

1.OpenHarmony技术特性

  • eTS UI
  • UI管理状态@state
  • NAPI
  • 音频播放

2.效果展示

  • demo效果(HH-SCDAYU200)

show

二、应用端开发

应用是使用润和大禹系列HH-SCDAYU200开发板套件,采用方舟开发框架(ArkUI)基于eTS扩展的声明式开发范式编写页面;通过NAPI接口接送设备的消息;页面进行发现中,发现到金属,未发现金属的页面展示。

1.快速上手

1.1 标准设备环境准备

以润和大禹系列HH-SCDAYU200开发板套件为例

1.2 应用编译环境准备

1.3 项目下载和导入

1)git下载

git clone https://gitee.com/openharmony-sig/knowledge_demo_temp.git --depth=1

2)项目导入

打开DevEco Studio,点击File->Open->下载路径/FA/metal_detection

1.4 安装应用

  • 配置应用签名信息,点击File > Project Structure > Project > Signing Configs界面勾选“Automatically generate signing”,等待自动签名完成即可,点击“OK”。如下图所示:

  • 运行

  • 安装应用 识别到设备后点击img,或使用默认快捷键Shift+F10(macOS为Control+R)运行应用。

    运行

  • 如果IDE没有识别到设备就需要通过命令安装,如下

    打开OpenHarmony SDK路径 \toolchains 文件夹下,执行如下hdc_std命令,其中path为hap包所在绝对路径。

    hdc_std install -r path\entry-debug-standard-ark-signed.hap//安装的hap包需为xxx-signed.hap,即安装携带签名信息的hap包。

    应用安装到3568开发板后,需要SMT32开发板发送角度数据,才能看到效果;两个板子连接同一个wifi或使用网线连接并配置同一网段IP地址

    hdc_std shell ifconfig eth0 192.168.1.111 netmask 255.255.255.0

2.关键代码解读

2.1目录结构

entry
│  └─src
│      └─main
│          │  config.json                       //  应用配置文件
│          │  
│          ├─ets
│          │  └─MainAbility
│          │      │  app.ets                    // 应用程序主入口
│          │      │
│          │      ├─common                      // 动画源图片目录
│          │      │      img_1.png
│          │      │      img_2.png
│          │      │  
│          │      ├─model   
│          │      │      CommonLog.ets          // 日志打印模块
│          │      │      PlayerManager.ets      // 音频播放模块      
│          │      └─pages
│          │              index.ets             // 金属探测器首页
│          │              
│          └─resources
│              ├─base
│              │  ├─element
│              │  │      string.json
│              │  │      
│              │  ├─graphic
│              │  ├─layout
│              │  ├─media                       // 存放媒体资源
│              │  │      icon.png
│              │  │      img_background.png
│              │  └─profile
│              └─rawfile

2.2日志查看方法

hdc_std shell
hilog | grep "metalDetected" (metalDetected表示你添加的日志标记)

2.3关键代码

  • 金属探测器UI界面:index.ets
  • NAPI: 导入 tcpserverapi模块,该模块是要在3568系统代码中编译

3.从零开发金属探测器应用

从零开发金属探测器应用

4.参考链接

三、设备侧开发

金属检测demo设备端基于Geek_Lite_Board开发板,上位机使用RK3568。通过AK8963电子罗盘芯片,对磁场数据对比后来判断附近有无金属物体。当检测到金属物体后,设备端会发出报警并发送信号到应用端。

1.工作流程

设备上电后,首先进行硬件初始化,初始化完成红色指示灯亮起;设备端通过ESP8266与应用端建立连接,连接成功后绿色指示灯亮起;初始化与连接成功后,设备根据周围磁场强度进行自校准,校准完成后蓝色指示灯亮起。三个指示灯都常量表示设备已经正常工作,可以进入工作状态。

当有金属物体靠近设备时,设备会检测到磁场强度发生波动。磁场强度波动0.03高斯时,此时认为附近检测到金属物体,蜂鸣器开启并向应用端发送信号。

2.工作原理

AK8963电子罗盘芯片可以在x、y、z轴检测当前位置的位置的磁场强度,当检测到金属物体后,磁场会生较大波动,当我们平行于电子罗盘芯片放置金属物体时,z轴磁场波动尤为明显,所以我们以z轴磁场强度的波动程度来进行判断。

3.功能实现

3.1 磁场数据采集

AK8963电子IC内置于mpu9250模块中,通过对mpu9250数据寄存器的读取就能获得ak8963的磁场数据。

(1)通过Mpu_Read_Bytes()函数得到mpu9250数据寄存器的值。

uint8_t Mpu_Read_Bytes(uint8_t const regAddr, uint8_t *pData, uint8_t len)

(2)通过mpu9250的寄存器手册获取ak8963的磁场原始数据。

Mpu_Data.mag_x = (MPU_BUFF[16] << 8) | MPU_BUFF[15]; // x轴磁场数据

Mpu_Data.mag_y = (MPU_BUFF[18] << 8) | MPU_BUFF[17]; // y轴磁场数据

Mpu_Data.mag_z = (MPU_BUFF[20] << 8) | MPU_BUFF[19]; // z轴磁场数据

(3)对原始数据进行转化,得到磁场强度,单位高斯。

Gauss_Mag_z = Mpu_Calc.mag_z * 0.15f * 0.01f;

3.2 磁场数据调零

首先采集100组z轴磁场强度基准数据,然后对这些数据做平均处理,由此得到z轴磁场强度的零点数据。

 if(i<1000){
 	i++;
    if(i%5 == 0){
		Mag_z_buff[j++] = Gauss_Mag_z;
        if(j>=100){
            i = 1000;
            Mag_z_Flag = true;
            for(k=0;k<100;k++){
            	origin_mag_z += Mag_z_buff[k];
            }
            origin_mag_z = origin_mag_z / 100.0f;
            
            // 校准完成,蓝灯亮,发送给应用端 "CalibrateOK"
            BLUE_LED_ON();
            memset(buff,0x00,sizeof(buff));
            sprintf(buff,"angle:%s","CalibrateOK");
            ESP8266_send_data(buff,strlen(buff));
        }
	}
}

3.3 检测信息发送

当标志位Mag_z_Flag置1,表示已经完成校准。

设置磁场强度波动范围大于0.03Gauss,当超过这个范围,就可以认定为有金属靠近对磁场产生影响。蜂鸣器发出报警信息,然后把检测信息"Detected"发送给应用端。金属离开磁场范围时,设备发送"UnDetected"到应用端。

if(Mag_z_Flag){
	if(fabs(Gauss_Mag_z - origin_mag_z) > 0.03f)
	{
		// 检测到金属,开启蜂鸣器, 发送给应用端 
        TIM_SetCompare1(TIM12, 50);
        memset(buff,0x00,sizeof(buff));
        sprintf(buff,"angle:%s","Detected");
        ESP8266_send_data(buff,strlen(buff));
    }
    else
    {
        // 未检测到金属,关闭蜂鸣器, 发送给应用端
        TIM_SetCompare1(TIM12, 300); 
        memset(buff,0x00,sizeof(buff));
        sprintf(buff,"angle:%s","UnDetected");
        ESP8266_send_data(buff,strlen(buff));
    }
}
1
https://gitee.com/42690727/knowledge_demo_temp.git
git@gitee.com:42690727/knowledge_demo_temp.git
42690727
knowledge_demo_temp
knowledge_demo_temp
master

搜索帮助