<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么電子指南針能指示方向

電子發燒友論壇 ? 來源:電子發燒友論壇 ? 作者:電子發燒友論壇 ? 2022-07-25 14:06 ? 次閱讀

電子指南針是現代的一種重要導航工具,大到飛機船舶的導航,小到個人手機導航,電子指南針可以說和咱們生活息息相關,密不可分。為什么電子指南針能指示方向?本 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 來接收設備端發出的檢測信息。

當設備應用啟動之后,運行效果如下動圖所示:

af3f29f4-049b-11ed-ba43-dac502259ad0.gif

一、基本原理

地球是一個大磁體,地球的兩個極分別在接近地理南極和地理北極的地方,一般情況下地球的磁場強度在 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 軸)。

數據流程

af6779cc-049b-11ed-ba43-dac502259ad0.png

智能指南針整體方案如上圖所示,主要由 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 組件畫圖完成,包含方位角度、指南針針盤和指示線,顯示整體效果如下圖所示。

af70f0b0-049b-11ed-ba43-dac502259ad0.png

指南針針盤由一個 Canvas 組件構成,包含了三個部分,分別為刻度盤、角度數字、方位文字,他們的效果圖分別如下:

● 刻度盤

afb99fa4-049b-11ed-ba43-dac502259ad0.png

● 角度數字

afccd196-049b-11ed-ba43-dac502259ad0.png

● 方位文字

afe2e5d0-049b-11ed-ba43-dac502259ad0.png

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》視頻課程。


審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 導航
    +關注

    關注

    7

    文章

    502

    瀏覽量

    41680
  • 開發板
    +關注

    關注

    25

    文章

    4560

    瀏覽量

    94890
  • 電子指南針
    +關注

    關注

    0

    文章

    5

    瀏覽量

    6090

原文標題:【技術分享】電子指南針項目分享 含設備端+應用端講解

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于OpenHarmony的智能指南針 Canvas組件+RK3568開發板設計

    ? ? 劉麗紅 OpenHarmony 知識體系工作組 電子指南針是現代的一種重要導航工具,大到飛機船舶的導航,小到個人手機導航,電子指南針可以說和咱們生活息息相關,密不可分。為什么
    發表于 06-30 15:25 ?1227次閱讀

    電子指南針解決方案

    電子指南針解決方案指南針是一個重要的導航工具甚至在GPS 中也會用到電子指南針將替代舊的針式指南針
    發表于 07-20 17:40

    電子指南針

    各位大俠 你們好!我正在準備用51單片機做電子指南針的畢業設計,現在還沒頭緒,希望各位大俠多指點指點!謝謝!
    發表于 02-09 23:14

    labview電子指南針制作求助

    `各位大大,大家好!我想用labview做一個電子指南針,自定義控件做不出有完整的圓盤式的表盤,請問大大我應該怎么辦?或者用某種語言可以實現,我現在完全木有頭緒。。。感謝捧場,附送GIF圖兩枚。`
    發表于 03-20 08:46

    電子指南針

    電子指南針來控制三個電路的閉合能實現嗎?120度一個電路。
    發表于 02-23 14:21

    指南針?。?!

    stm32.i2c通信,怎么才能實現指南針???求指導,求代碼參考
    發表于 04-12 01:16

    基于單片機電子指南針系統的設計資料分享

    )的電子指南針能有效解決這些問題。系統采用了磁阻(GMR)傳感器采集某一方向磁場強度后通過MCU控制器對其進行處理并顯示上傳,通過對電子指南針
    發表于 11-11 08:23

    基于OpenHarmony的智能指南針

    電子指南針是現代的一種重要導航工具,大到飛機船舶的導航,小到個人手機導航,電子指南針可以說和咱們生活息息相關,密不可分。為什么電子
    發表于 07-08 11:04

    電子指南針

    電子指南針模組的資料,包括:使用說明書、電路原理圖、演示實例代碼
    發表于 01-01 12:14 ?114次下載

    電子指南針原理

    電子指南針原理:指南針是一個重要的導航工具甚至在GPS 中也會用到電子指南針將替代舊的針式指南針
    發表于 07-20 17:49 ?9343次閱讀
    <b class='flag-5'>電子</b><b class='flag-5'>指南針</b>原理

    指南針巧作磁化檢驗器

    指南針巧作磁化檢驗器 把商店出售的微型指南針,用環氧樹脂粘貼在塑料
    發表于 09-05 12:17 ?698次閱讀
    用<b class='flag-5'>指南針</b>巧作磁化檢驗器

    iPhone自帶的指南針的妙用

    大家在日常使用中應該用過iPhone的指南針功能吧,當你在野外或者是工作生活有需求時,指南針除了能夠指示方向,其實還有其他的妙用,今天我們就要教大家如何解鎖
    的頭像 發表于 05-22 08:56 ?7417次閱讀

    DIY 尋星指南針,Satellite searcher

    指南針真南指針指向量角器上所需衛星的方位上,量角器上0。箭頭所指方向就是該衛星的方位.非常方便快捷,參見附圖。 ◇???? 江蘇? 柏偉平
    的頭像 發表于 09-20 19:17 ?742次閱讀

    微雪電子三軸電子羅盤指南針介紹

    LSM303DLHC 三軸加速度磁場模塊 三軸電子羅盤指南針 平衡儀器 個人導航設備 體感游戲和應用 型號 LSM303DLHC Board
    的頭像 發表于 12-30 10:44 ?1943次閱讀
    微雪<b class='flag-5'>電子</b>三軸<b class='flag-5'>電子</b>羅盤<b class='flag-5'>指南針</b>介紹

    【技術分享】電子指南針項目分享 含設備端+應用端講解

    電子指南針是現代的一種重要導航工具,大到飛機船舶的導航,小到個人手機導航,電子指南針可以說和咱們生活息息相關,密不可分。為什么電子
    的頭像 發表于 07-18 10:07 ?775次閱讀
    【技術分享】<b class='flag-5'>電子</b><b class='flag-5'>指南針</b>項目分享 含設備端+應用端講解
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>