0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何制作数字指南针

454398 来源:wv 2019-10-12 14:19 次阅读

第1步:所需零件

对于此项目,您将只需要一个Arduino开发板和一个MEMS磁力计即可测量地磁场。我将使用包含MC5883L 3轴磁力计的GY – 80分支板。

在继续执行该项目的源代码之前,如果您需要更多详细信息,请参见MEMS磁力计如何工作以及如何通过I2C通信连接和使用GY-80接线板,

第2步:Arduino源代码

我们首先需要做的是将草图上传到Arduino板,该板将读取来自磁力计的数据,并将其发送到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草图之后,我们需要将数据接收到Processing IDE中并绘制Digital Compass。指南针由背景图像,箭头的固定图像和指南针主体的旋转图像组成。因此,使用Arduino计算出的耳磁场的值将用来旋转罗盘。

以下是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

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指南针
    +关注

    关注

    2

    文章

    17

    浏览量

    10855
收藏 人收藏

    评论

    相关推荐

    用AIC3254来作数字拾音器,遇到的几个疑问求解

    我是用AIC3254来作数字拾音器,当中遇到了一点问题 1,ADC DAC不能使用预置处理模式,也就是说我在p0_r60,p_r61只能设置为0(minidsp used for signal
    发表于 10-31 07:53

    使用PCM5242连接到TMS320C5517上作数字量与模拟量的转换,如何配置寄存器参数?

    现在使用PCM5242连接到TMS320C5517上作数字量与模拟量的转换,控制线是I2C,数据线是I2S3,应该如何配置寄存器参数
    发表于 10-16 06:32

    现代海上的电子指南针——舰艇惯导系统

    舰艇惯导系统通过惯性测量装置获取舰艇运动参数,实现自主、连续、隐蔽的导航,提供航向、速度等关键信息。未来趋势包括高精度化、多传感器融合和自主导航能力提升,为船舶航行带来更多便利和安全。
    的头像 发表于 09-30 15:46 217次阅读

    索尼DMX-R100数字音频混音器使用手册

    DMX-R100是一款紧凑型数字音频混音器,适用于制作数字媒体或数字广播的制作公司。
    发表于 09-29 11:49 1次下载

    数字隔离器的设计指南

    电子发烧友网站提供《数字隔离器的设计指南.pdf》资料免费下载
    发表于 08-31 09:43 1次下载
    <b class='flag-5'>数字</b>隔离器的设计<b class='flag-5'>指南</b>

    数字隔离器设计指南

    电子发烧友网站提供《数字隔离器设计指南.pdf》资料免费下载
    发表于 08-30 11:36 0次下载
    <b class='flag-5'>数字</b>隔离器设计<b class='flag-5'>指南</b>

    医疗机器人的“指南针”:MT6701磁编码IC实现精确导航

    ,MT6701 磁编码 IC 凭借其卓越的性能,成为了实现精密导航的核心力量。 MT6701 磁编码 IC 究竟有何独特之处?它就像是医疗机器人的“指南针”,能够在复杂的医疗环境中为机器人提供精确无误的位置和方向信息。想象一下,在一台精密的
    的头像 发表于 08-23 17:23 369次阅读

    关键指南针-NXP USB CDC_VCOM虚拟串口例程

    最近有小伙伴反应USB中的 usb_examples/usb_device_cdc_vcom 例程(USB虚拟串口VCOM)中的一些使用问题,今天集中来说说使用example的必知要点~ 实验平台和软件版本说明 本篇文章的实验平台为:SDK_2_5_0_LPC54605J512oardslpcxpresso54608usb_examplesusb_device_cdc_vcom 但实际上本篇文章适用于NXP大部分的硬件平台,因为usb_device_cdc_vcom(以下简称vcom)这部分例程代码和硬件关系并不大,属于USB Stack之上的应用部分,另外这部分代码在SDK的各个版本上变化也不是很大,所以如果您使用的新
    的头像 发表于 07-25 09:17 1787次阅读
    关键<b class='flag-5'>指南针</b>-NXP USB CDC_VCOM虚拟串口例程

    深度揭秘!观测云产品核心理念

    一个产品的强大生命力和竞争力,源自于其内在的哲学和理念。作为团队的领航者,我带领着每一位成员,坚守着这些核心理念。它们是我们设计和实现产品的基石,是我们在技术发展道路上的指南针
    的头像 发表于 07-23 10:15 200次阅读

    科学指南针&amp;华东理工大学XPS表面分析技术课程圆满落幕

    在科学探索的道路上,不断学习和掌握先进的科研技术对于推动学术创新至关重要。近日,科学指南针与华东理工大学联合举办的XPS表面分析技术课程在华东理工大学奉贤校区圆满结束。本次课程吸引了众多
    的头像 发表于 05-18 15:01 502次阅读

    目标主力能源:华为智能光伏的时代指南针

    真正让光伏能源走向舞台中央,还需要一枚技术与产业中的指南针
    的头像 发表于 01-25 09:57 2999次阅读
    目标主力能源:华为智能光伏的时代<b class='flag-5'>指南针</b>

    地磁定位技术简介和基本原理

    人类使用地磁信息进行导航具有悠久的历史。远有我国古代发明的指南针、航海罗盘等,近有十四、十五世纪欧洲人使用罗盘进行远洋航行,发现新大陆等壮举,这都与地磁导航是分不开的。
    的头像 发表于 01-20 10:45 2798次阅读
    地磁定位技术简介和基本原理

    电学基础之磁场与电磁的概念介绍

    说起磁,我们都很熟悉,通常将能吸引铁、镍、钴的物体称为磁铁或磁体,如常见的磁铁、指南针等。
    的头像 发表于 01-11 13:37 1388次阅读

    磁力计LIS2MDL开发(2)----电子罗盘

    本文将介绍如何使用 LIS2MDL 传感器来读取数据来转化为指南针
    的头像 发表于 12-18 11:01 1283次阅读
    磁力计LIS2MDL开发(2)----电子罗盘

    数字隔离器应用指南

    电子发烧友网站提供《数字隔离器应用指南.pdf》资料免费下载
    发表于 11-28 10:33 1次下载
    <b class='flag-5'>数字</b>隔离器应用<b class='flag-5'>指南</b>