0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何制作數(shù)字指南針

454398 ? 來(lái)源:wv ? 2019-10-12 14:19 ? 次閱讀

第1步:所需零件

對(duì)于此項(xiàng)目,您將只需要一個(gè)Arduino開(kāi)發(fā)板和一個(gè)MEMS磁力計(jì)即可測(cè)量地磁場(chǎng)。我將使用包含MC5883L 3軸磁力計(jì)的GY – 80分支板。

在繼續(xù)執(zhí)行該項(xiàng)目的源代碼之前,如果您需要更多詳細(xì)信息,請(qǐng)參見(jiàn)MEMS磁力計(jì)如何工作以及如何通過(guò)I2C通信連接和使用GY-80接線板,

第2步:Arduino源代碼

我們首先需要做的是將草圖上傳到Arduino板,該板將讀取來(lái)自磁力計(jì)的數(shù)據(jù),并將其發(fā)送到Processing IDE。這是Arduino源代碼:

/* Arduino Compass

*

* by Dejan Nedelkovski,

* www.HowToMechatronics.com

*

*/

#include //I2C Arduino Library

#define Magnetometer_mX0 0x03

#define Magnetometer_mX1 0x04

#define Magnetometer_mZ0 0x05

#define Magnetometer_mZ1 0x06

#define Magnetometer_mY0 0x07

#define Magnetometer_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out;

int mZ0, mZ1, mZ_out;

float heading, headingDegrees, headingFiltered, declination;

float Xm,Ym,Zm;

#define Magnetometer 0x1E //I2C 7bit address of HMC5883

void setup(){

//Initialize Serial and I2C communications

Serial.begin(115200);

Wire.begin();

delay(100);

Wire.beginTransmission(Magnetometer);

Wire.write(0x02); // Select mode register

Wire.write(0x00); // Continuous measurement mode

Wire.endTransmission();

}

void loop(){

//---- X-Axis

Wire.beginTransmission(Magnetometer); // transmit to device

Wire.write(Magnetometer_mX1);

Wire.endTransmission();

Wire.requestFrom(Magnetometer,1);

if(Wire.available()《=1)

{

mX0 = Wire.read();

}

Wire.beginTransmission(Magnetometer); // transmit to device

Wire.write(Magnetometer_mX0);

Wire.endTransmission();

Wire.requestFrom(Magnetometer,1);

if(Wire.available()《=1)

{

mX1 = Wire.read();

}

//---- Y-Axis

Wire.beginTransmission(Magnetometer); // transmit to device

Wire.write(Magnetometer_mY1);

Wire.endTransmission();

Wire.requestFrom(Magnetometer,1);

if(Wire.available()《=1)

{

mY0 = Wire.read();

}

Wire.beginTransmission(Magnetometer); // transmit to device

Wire.write(Magnetometer_mY0);

Wire.endTransmission();

Wire.requestFrom(Magnetometer,1);

if(Wire.available()《=1)

{

mY1 = Wire.read();

}

//---- Z-Axis

Wire.beginTransmission(Magnetometer); // transmit to device

Wire.write(Magnetometer_mZ1);

Wire.endTransmission();

Wire.requestFrom(Magnetometer,1);

if(Wire.available()《=1)

{

mZ0 = Wire.read();

}

Wire.beginTransmission(Magnetometer); // transmit to device

Wire.write(Magnetometer_mZ0);

Wire.endTransmission();

Wire.requestFrom(Magnetometer,1);

if(Wire.available()《=1)

{

mZ1 = Wire.read();

}

//---- X-Axis

mX1=mX1《《8;

mX_out =mX0+mX1; // Raw data

// From the datasheet: 0.92 mG/digit

Xm = mX_out*0.00092; // Gauss unit

//* Earth magnetic field ranges from 0.25 to 0.65 Gauss, so these are the values that we need to get approximately.

//---- Y-Axis

mY1=mY1《《8;

mY_out =mY0+mY1;

Ym = mY_out*0.00092;

//---- Z-Axis

mZ1=mZ1《《8;

mZ_out =mZ0+mZ1;

Zm = mZ_out*0.00092;

// ==============================

//Calculating Heading

heading = atan2(Ym, Xm);

// Correcting the heading with the declination angle depending on your location

// You can find your declination angle at: http://www.ngdc.noaa.gov/geomag-web/

// At my location it‘s 4.2 degrees =》 0.073 rad

declination = 0.073;

heading += declination;

// Correcting when signs are reveresed

if(heading 《0) heading += 2*PI;

// Correcting due to the addition of the declination angle

if(heading 》 2*PI)heading -= 2*PI;

headingDegrees = heading * 180/PI; // The heading in Degrees unit

// Smoothing the output angle / Low pass filter

headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;

//Sending the heading value through the Serial Port to Processing IDE

Serial.println(headingFiltered);

delay(50);

}

步驟3:處理IDE源代碼

在我們上傳了之前的Arduino草圖之后,我們需要將數(shù)據(jù)接收到Processing IDE中并繪制Digital Compass。指南針由背景圖像,箭頭的固定圖像和指南針主體的旋轉(zhuǎn)圖像組成。因此,使用Arduino計(jì)算出的耳磁場(chǎng)的值將用來(lái)旋轉(zhuǎn)羅盤(pán)。

以下是Processing IDE的源代碼:

/* Arduino Compass

*

* by Dejan Nedelkovski,

* www.HowToMechatronics.com

*

*/

import processing.serial.*;

import java.awt.event.KeyEvent;

import java.io.IOException;

Serial myPort;

PImage imgCompass;

PImage imgCompassArrow;

PImage background;

String data=“”;

float heading;

void setup() {

size (1920, 1080, P3D);

smooth();

imgCompass = loadImage(“Compass.png”);

imgCompassArrow = loadImage(“CompassArrow.png”);

background = loadImage(“Background.png”);

myPort = new Serial(this, “COM4”, 115200); // starts the serial communication

myPort.bufferUntil(’ ‘);

}

void draw() {

image(background,0, 0); // Loads the Background image

pushMatrix();

translate(width/2, height/2, 0); // Translates the coordinate system into the center of the screen, so that the rotation happen right in the center

rotateZ(radians(-heading)); // Rotates the Compass around Z - Axis

image(imgCompass, -960, -540); // Loads the Compass image and as the coordinate system is relocated we need need to set the image at -960x, -540y (half the screen size)

popMatrix(); // Brings coordinate system is back to the original position 0,0,0

image(imgCompassArrow,0, 0); // Loads the CompassArrow image which is not affected by the rotateZ() function because of the popMatrix() function

textSize(30);

text(“Heading: ” + heading,40,40); // Prints the value of the heading on the screen

delay(40);

}

// starts reading data from the Serial Port

void serialEvent (Serial myPort) {

data = myPort.readStringUntil(’ ‘);// reads the data from the Serial Port and puts it into the String variable “data”。

heading = float(data); // Convering the the String value into Float value

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 指南針
    +關(guān)注

    關(guān)注

    2

    文章

    17

    瀏覽量

    10836
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)字隔離器的設(shè)計(jì)指南

    電子發(fā)燒友網(wǎng)站提供《數(shù)字隔離器的設(shè)計(jì)指南.pdf》資料免費(fèi)下載
    發(fā)表于 08-31 09:43 ?0次下載
    <b class='flag-5'>數(shù)字</b>隔離器的設(shè)計(jì)<b class='flag-5'>指南</b>

    數(shù)字隔離器設(shè)計(jì)指南

    電子發(fā)燒友網(wǎng)站提供《數(shù)字隔離器設(shè)計(jì)指南.pdf》資料免費(fèi)下載
    發(fā)表于 08-30 11:36 ?0次下載
    <b class='flag-5'>數(shù)字</b>隔離器設(shè)計(jì)<b class='flag-5'>指南</b>

    醫(yī)療機(jī)器人的“指南針”:MT6701磁編碼IC實(shí)現(xiàn)精確導(dǎo)航

    ,MT6701 磁編碼 IC 憑借其卓越的性能,成為了實(shí)現(xiàn)精密導(dǎo)航的核心力量。 MT6701 磁編碼 IC 究竟有何獨(dú)特之處?它就像是醫(yī)療機(jī)器人的“指南針”,能夠在復(fù)雜的醫(yī)療環(huán)境中為機(jī)器人提供精確無(wú)誤的位置和方向信息。想象一下,在一臺(tái)精密的
    的頭像 發(fā)表于 08-23 17:23 ?192次閱讀

    關(guān)鍵指南針-NXP USB CDC_VCOM虛擬串口例程

    最近有小伙伴反應(yīng)USB中的 usb_examples/usb_device_cdc_vcom 例程(USB虛擬串口VCOM)中的一些使用問(wèn)題,今天集中來(lái)說(shuō)說(shuō)使用example的必知要點(diǎn)~ 實(shí)驗(yàn)平臺(tái)和軟件版本說(shuō)明 本篇文章的實(shí)驗(yàn)平臺(tái)為:SDK_2_5_0_LPC54605J512oardslpcxpresso54608usb_examplesusb_device_cdc_vcom?但實(shí)際上本篇文章適用于NXP大部分的硬件平臺(tái),因?yàn)閡sb_device_cdc_vcom(以下簡(jiǎn)稱(chēng)vcom)這部分例程代碼和硬件關(guān)系并不大,屬于USB Stack之上的應(yīng)用部分,另外這部分代碼在SDK的各個(gè)版本上變化也不是很大,所以如果您使用的新
    的頭像 發(fā)表于 07-25 09:17 ?1205次閱讀
    關(guān)鍵<b class='flag-5'>指南針</b>-NXP USB CDC_VCOM虛擬串口例程

    深度揭秘!觀測(cè)云產(chǎn)品核心理念

    一個(gè)產(chǎn)品的強(qiáng)大生命力和競(jìng)爭(zhēng)力,源自于其內(nèi)在的哲學(xué)和理念。作為團(tuán)隊(duì)的領(lǐng)航者,我?guī)ьI(lǐng)著每一位成員,堅(jiān)守著這些核心理念。它們是我們?cè)O(shè)計(jì)和實(shí)現(xiàn)產(chǎn)品的基石,是我們?cè)诩夹g(shù)發(fā)展道路上的指南針。
    的頭像 發(fā)表于 07-23 10:15 ?137次閱讀

    科學(xué)指南針&amp;華東理工大學(xué)XPS表面分析技術(shù)課程圓滿落幕

    在科學(xué)探索的道路上,不斷學(xué)習(xí)和掌握先進(jìn)的科研技術(shù)對(duì)于推動(dòng)學(xué)術(shù)創(chuàng)新至關(guān)重要。近日,科學(xué)指南針與華東理工大學(xué)聯(lián)合舉辦的XPS表面分析技術(shù)課程在華東理工大學(xué)奉賢校區(qū)圓滿結(jié)束。本次課程吸引了眾多
    的頭像 發(fā)表于 05-18 15:01 ?399次閱讀

    傳感器的應(yīng)用前景分析

    時(shí)期,因人們對(duì)于物體磁性的不斷探索,進(jìn)而發(fā)明能夠感受磁場(chǎng)的最早傳感器——指南針。 三、傳感器的前景 ? ? ? 傳感器作為一種能夠監(jiān)測(cè)、測(cè)量和定位物理量,并將其轉(zhuǎn)化為可讀的電信號(hào)或數(shù)字信號(hào)的技術(shù)術(shù)語(yǔ),是實(shí)現(xiàn)智能化和自動(dòng)化的
    的頭像 發(fā)表于 03-11 16:34 ?717次閱讀

    目標(biāo)主力能源:華為智能光伏的時(shí)代指南針

    真正讓光伏能源走向舞臺(tái)中央,還需要一枚技術(shù)與產(chǎn)業(yè)中的指南針
    的頭像 發(fā)表于 01-25 09:57 ?2912次閱讀
    目標(biāo)主力能源:華為智能光伏的時(shí)代<b class='flag-5'>指南針</b>

    地磁定位技術(shù)簡(jiǎn)介和基本原理

    人類(lèi)使用地磁信息進(jìn)行導(dǎo)航具有悠久的歷史。遠(yuǎn)有我國(guó)古代發(fā)明的指南針、航海羅盤(pán)等,近有十四、十五世紀(jì)歐洲人使用羅盤(pán)進(jìn)行遠(yuǎn)洋航行,發(fā)現(xiàn)新大陸等壯舉,這都與地磁導(dǎo)航是分不開(kāi)的。
    的頭像 發(fā)表于 01-20 10:45 ?2385次閱讀
    地磁定位技術(shù)簡(jiǎn)介和基本原理

    電學(xué)基礎(chǔ)之磁場(chǎng)與電磁的概念介紹

    說(shuō)起磁,我們都很熟悉,通常將能吸引鐵、鎳、鈷的物體稱(chēng)為磁鐵或磁體,如常見(jiàn)的磁鐵、指南針等。
    的頭像 發(fā)表于 01-11 13:37 ?1062次閱讀

    磁力計(jì)LIS2MDL開(kāi)發(fā)(2)----電子羅盤(pán)

    本文將介紹如何使用 LIS2MDL 傳感器來(lái)讀取數(shù)據(jù)來(lái)轉(zhuǎn)化為指南針。
    的頭像 發(fā)表于 12-18 11:01 ?1151次閱讀
    磁力計(jì)LIS2MDL開(kāi)發(fā)(2)----電子羅盤(pán)

    2023WNEVC | 華為數(shù)字能源參會(huì)指南

    “閱讀原文” ,了解更多華為數(shù)字能源資訊! ? ? ? ? ? 原文標(biāo)題:2023WNEVC | 華為數(shù)字能源參會(huì)指南 文章出處:【微信公眾號(hào):華為數(shù)字能源】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)
    的頭像 發(fā)表于 12-05 18:35 ?706次閱讀
    2023WNEVC | 華為<b class='flag-5'>數(shù)字</b>能源參會(huì)<b class='flag-5'>指南</b>

    數(shù)字隔離器應(yīng)用指南

    電子發(fā)燒友網(wǎng)站提供《數(shù)字隔離器應(yīng)用指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-28 10:33 ?1次下載
    <b class='flag-5'>數(shù)字</b>隔離器應(yīng)用<b class='flag-5'>指南</b>

    FPGA與ADC數(shù)字數(shù)據(jù)輸出的接口指南

    電子發(fā)燒友網(wǎng)站提供《FPGA與ADC數(shù)字數(shù)據(jù)輸出的接口指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-28 09:40 ?0次下載
    FPGA與ADC<b class='flag-5'>數(shù)字</b>數(shù)據(jù)輸出的接口<b class='flag-5'>指南</b>

    基于高度感知的鳥(niǎo)瞰圖分割和神經(jīng)地圖的重定位

    本方案的完整算法是在SD地圖中定位一組環(huán)視圖像。它從環(huán)視圖像生成本地BEV表示,并從給定粗略3D位置先驗(yàn)的SD地圖tile中生成神經(jīng)地圖編碼(例如來(lái)自航海設(shè)備的嘈雜GPS信號(hào)和指南針)。
    的頭像 發(fā)表于 11-08 15:59 ?460次閱讀
    基于高度感知的鳥(niǎo)瞰圖分割和神經(jīng)地圖的重定位