สารบัญ:

โครงการ Arduino Digital Compass: 3 ขั้นตอน
โครงการ Arduino Digital Compass: 3 ขั้นตอน

วีดีโอ: โครงการ Arduino Digital Compass: 3 ขั้นตอน

วีดีโอ: โครงการ Arduino Digital Compass: 3 ขั้นตอน
วีดีโอ: hmc5883l Arduino compass, magnetometer sensor, compass navigation"Arduino Project for beginners 2024, กรกฎาคม
Anonim
Image
Image

สวัสดี! ในคำแนะนำนี้ คุณจะเห็นว่าคุณสามารถสร้างเข็มทิศดิจิตอลโดยใช้ Arduino และ IDE การประมวลผลได้อย่างไร นี่เป็นโครงการ Arduino ที่ค่อนข้างเรียบง่าย แต่น่าสนใจและดูดี

คุณสามารถดูตัวอย่างการสาธิตของบทช่วยสอนนี้ได้ในวิดีโอด้านบน คุณสามารถหาวิดีโอที่น่าสนใจกว่านี้ได้ในช่อง YouTube ของฉัน รวมทั้งพบโครงการอิเล็กทรอนิกส์และบทช่วยสอนมากมายบนเว็บไซต์ของฉัน HowToMechatronics.com

ขั้นตอนที่ 1: อะไหล่ที่จำเป็น

สำหรับโครงการนี้ คุณจะต้องใช้บอร์ด Arduino และ MEMS Magnetometer สำหรับวัดสนามแม่เหล็กโลก ฉันจะใช้บอร์ดฝ่าวงล้อม GY – 80 ซึ่งประกอบด้วย MC5883L 3 – Axis Magnetometer

ก่อนที่เราจะดำเนินการต่อด้วยซอร์สโค้ดสำหรับโครงการ หากคุณต้องการรายละเอียดเพิ่มเติมว่าเครื่องวัดสนามแม่เหล็กของ MEMS ทำงานอย่างไร รวมถึงวิธีการเชื่อมต่อและใช้งานบอร์ดฝ่าวงล้อม GY - 80 ผ่านการสื่อสาร I2C คุณสามารถตรวจสอบบทแนะนำเฉพาะของฉันสำหรับสิ่งนั้นได้

ขั้นตอนที่ 2: รหัสที่มา Arduino

สิ่งที่เราต้องทำก่อนคืออัปโหลดภาพสเก็ตช์ไปยังบอร์ด Arduino ซึ่งจะอ่านข้อมูลจากเครื่องวัดค่าความเข้มข้นของสนามแม่เหล็กแล้วส่งไปยัง Processing IDE นี่คือรหัสที่มา Arduino:

/* Arduino Compass * * โดย Dejan Nedelkovski * www. HowToMechatronics.com * */

#include //I2C Arduino Library

#define เครื่องวัดค่าความเข้มข้นของสนามแม่เหล็ก_mX0 0x03

#define Magnetometer_mX1 0x04 #define Magnetometer_mZ0 0x05 #define Magnetometer_mZ1 0x06 #define Magnetometer_mY0 0x07 #define แมกนีโตมิเตอร์_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out; int mZ0, mZ1, mZ_out;

float heading, headingDegrees, headingกรอง, ปฏิเสธ;

ลอย Xm, Ym, Zm;

#define Magnetometer 0x1E //ที่อยู่ I2C 7 บิตของ HMC5883

การตั้งค่าเป็นโมฆะ (){

//เริ่มต้นการสื่อสารแบบ Serial และ I2C Serial.begin (115200); Wire.begin(); ล่าช้า (100); Wire.beginTransmission(เครื่องวัดสนามแม่เหล็ก); Wire.write(0x02); // เลือกโหมดการลงทะเบียน Wire.write(0x00); // โหมดการวัดต่อเนื่อง Wire.endTransmission(); }

วงเป็นโมฆะ (){

//---- X-Axis Wire.beginTransmission(เครื่องวัดสนามแม่เหล็ก); // ส่งไปยังอุปกรณ์ Wire.write(Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom(เครื่องวัดสนามแม่เหล็ก, 1); if(Wire.available()<=1) { mX0 = Wire.read(); } Wire.beginTransmission (เครื่องวัดสนามแม่เหล็ก); // ส่งไปยังอุปกรณ์ Wire.write(Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom(เครื่องวัดสนามแม่เหล็ก, 1); if(Wire.available()<=1) { mX1 = Wire.read(); }

//---- แกน Y

Wire.beginTransmission(เครื่องวัดสนามแม่เหล็ก); // ส่งไปยังอุปกรณ์ Wire.write(Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom(เครื่องวัดสนามแม่เหล็ก, 1); if(Wire.available()<=1) { mY0 = Wire.read(); } Wire.beginTransmission (เครื่องวัดสนามแม่เหล็ก); // ส่งไปยังอุปกรณ์ Wire.write(Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom(เครื่องวัดสนามแม่เหล็ก 1); if(Wire.available()<=1) { mY1 = Wire.read(); } //---- Z-Axis Wire.beginTransmission(เครื่องวัดสนามแม่เหล็ก); // ส่งไปยังอุปกรณ์ Wire.write(Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom(เครื่องวัดสนามแม่เหล็ก, 1); if(Wire.available()<=1) { mZ0 = Wire.read(); } Wire.beginTransmission (เครื่องวัดสนามแม่เหล็ก); // ส่งไปยังอุปกรณ์ Wire.write(Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom(เครื่องวัดสนามแม่เหล็ก 1); if(Wire.available()<=1) { mZ1 = Wire.read(); } //---- แกน X mX1=mX1<<8; mX_out =mX0+mX1; // ข้อมูลดิบ // จากแผ่นข้อมูล: 0.92 mG/digit Xm = mX_out*0.00092; // หน่วยเกาส์ //* สนามแม่เหล็กโลกมีช่วงตั้งแต่ 0.25 ถึง 0.65 เกาส์ ดังนั้นค่าเหล่านี้จึงเป็นค่าที่เราต้องหาได้โดยประมาณ

//---- แกน Y

mY1=mY1<<8; mY_out =mY0+mY1; Ym = mY_out*0.00092;

//---- แกน Z

mZ1=mZ1< 0.073 ลาดเอียง = 0.073; หัวข้อ += การปฏิเสธ; // แก้ไขเมื่อสัญญาณถูกกลับรายการ if(heading <0) heading += 2*PI;

// แก้ไขเนื่องจากการบวกมุมเอียง

ถ้า (หัวเรื่อง > 2*PI) หัวเรื่อง -= 2*PI;

headingDegrees = หัวเรื่อง * 180/PI; // หัวเรื่องในหน่วยองศา

// ปรับมุมเอาต์พุตให้เรียบ / Low pass filter

headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;

//ส่งค่าหัวเรื่องผ่านพอร์ตอนุกรมไปยังการประมวลผล IDE

Serial.println (หัวเรื่องกรอง);

ล่าช้า (50); }

ขั้นตอนที่ 3: การประมวลผลซอร์สโค้ด IDE

หลังจากที่เราอัปโหลดภาพสเก็ตช์ Arduino ก่อนหน้านี้แล้ว เราจำเป็นต้องรับข้อมูลไปยัง Processing IDE และวาดเข็มทิศดิจิตอล เข็มทิศประกอบด้วยภาพพื้นหลัง รูปภาพคงที่ของลูกศร และรูปภาพที่หมุนได้ของตัวเข็มทิศ ดังนั้นค่าของสนามแม่เหล็กเอิร์ตที่คำนวณด้วย Arduino จะถูกใช้เพื่อหมุนเข็มทิศ

นี่คือซอร์สโค้ดของ Processing IDE:

/* Arduino Compass * * โดย Dejan Nedelkovski, * www. HowToMechatronics.com * */ import processing.serial.*; นำเข้า java.awt.event. KeyEvent; นำเข้า java.io. IOException;

อนุกรม myPort;

รูปภาพ imgCompass; รูปภาพ imgCompassArrow; พื้นหลังภาพ;

ข้อมูลสตริง="";

หัวเรื่องลอย;

การตั้งค่าเป็นโมฆะ () {

ขนาด (1920, 1080, P3D); เรียบ(); imgCompass = loadImage("Compass.png"); imgCompassArrow = loadImage("CompassArrow.png"); พื้นหลัง = loadImage ("Background.png"); myPort = ซีเรียลใหม่ (นี่คือ "COM4", 115200); // เริ่มการสื่อสารแบบอนุกรม myPort.bufferUntil('\n'); }

โมฆะวาด () {

รูปภาพ(พื้นหลัง, 0, 0); // โหลดภาพพื้นหลัง pushMatrix(); แปล(กว้าง/2,สูง/2, 0); // แปลระบบพิกัดให้อยู่ตรงกลางของหน้าจอ เพื่อให้การหมุนเกิดขึ้นที่จุดศูนย์กลางของการหมุนZ(เรเดียน(-heading)); // หมุนเข็มทิศรอบๆ ภาพแกน Z (imgCompass, -960, -540); // โหลดอิมเมจ Compass และในขณะที่ระบบพิกัดถูกย้าย เราจำเป็นต้องตั้งค่ารูปภาพที่ -960x, -540y (ครึ่งหนึ่งของขนาดหน้าจอ) popMatrix(); // นำระบบพิกัดกลับมาที่ตำแหน่งเดิม 0, 0, 0 image(imgCompassArrow, 0, 0); // โหลดอิมเมจ CompassArrow ซึ่งไม่ได้รับผลกระทบจากฟังก์ชัน rotationZ() เนื่องจากฟังก์ชัน popMatrix() textSize(30); text("หัวเรื่อง:" + หัวเรื่อง, 40, 40); // พิมพ์ค่าของหัวเรื่องบนหน้าจอ

ล่าช้า(40);

}

// เริ่มอ่านข้อมูลจาก Serial Port

ถือเป็นโมฆะ serialEvent (Serial myPort) { data = myPort.readStringUntil('\n'); // อ่านข้อมูลจาก Serial Port และใส่ลงในตัวแปร String "data" หัวเรื่อง = ลอย (ข้อมูล); // การแปลงค่า String เป็นค่า Float }

ฉันหวังว่าคุณจะชอบโครงการนี้ หากเป็นเช่นนั้น คุณสามารถเยี่ยมชมเว็บไซต์ของฉันสำหรับโครงการดีๆ เพิ่มเติมได้

แนะนำ: