Мазмуну:

Arduino Digital Compass долбоору: 3 кадам
Arduino Digital Compass долбоору: 3 кадам

Video: Arduino Digital Compass долбоору: 3 кадам

Video: Arduino Digital Compass долбоору: 3 кадам
Video: Free Code Arduino Project Compass using SSD1306 OLED & MPU9250 Magnetometer 2024, Ноябрь
Anonim
Image
Image

Салам! Бул көрсөтмөдө сиз Arduino жана Processing IDE менен Digital Compassти кантип жасоону көрөсүз. Бул абдан жөнөкөй, бирок кызыктуу жана кооз көрүнгөн Arduino долбоору.

Бул окуу куралынын демо мисалын жогорудагы видеодон көрө аласыз. Сиз ар дайым менин YouTube каналымда ушул сыяктуу кызыктуу видеолорду таба аласыз, ошондой эле менин веб -сайтымдан HowToMechatronics.comдо көптөгөн электроника долбоорлорун жана окуу куралдарын таба аласыз.

1 -кадам: Тетиктер талап кылынат

Бул долбоор үчүн сизге жердин магнит талаасын өлчөө үчүн Arduino Board жана MEMS Magnetometer гана керек болот. Мен MC5883L 3 - Axis магнитометрин камтыган GY - 80 сынык тактасын колдоном.

Долбоордун баштапкы кодун улантуудан мурун, эгер сизге MEMS магнитометринин кантип иштээри, ошондой эле I2C Байланыш аркылуу GY - 80 үзүлүү тактасын кантип туташтыруу жана колдонуу керектиги жөнүндө көбүрөөк маалымат керек болсо, бул үчүн менин атайын окуу куралдарымды текшере аласыз.

2 -кадам: Arduino Source Code

Биз биринчи эмне кылышыбыз керек - бул магнитометрден маалыматтарды окуган Arduino тактасына эскиз жүктөө жана аны Processing IDEге жөнөтүү. Бул жерде Arduino Source Code:

/ * Arduino Compass * * тарабынан Дежан Неделковский, * www. HowToMechatronics.com * */

#кошуу // I2C Arduino китепканасы

#define магнитометр_mX0 0x03

#define магнитометр_mX1 0x04 #аныктоо магнитометр_mZ0 0x05 #finine 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, headFiltered, declination;

сүзүү Xm, Ym, Zm;

#define магнитометр 0x1E // HMC5883 I2C 7bit дареги

жараксыз орнотуу () {

// Serial. IgC Serial.begin (115200) байланыштарын баштоо; Wire.begin (); кечиктирүү (100); Wire.beginTransmission (магнитометр); Wire.write (0x02); // Режимди тандаңыз Wire.write (0x00); // Үзгүлтүксүз өлчөө режими Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTrmission (магнитометр); // 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-Axis

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.beginTrmission (магнитометр); // 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-Axis mX1 = mX1 << 8; mX_out = mX0+mX1; // Чийки маалыматтар // Маалымат барагынан: 0.92 мг/цифр Xm = mX_out*0.00092; // Гаусс бирдиги //* Жердин магнит талаасы 0,25тен 0,65Гаусска чейин, андыктан бул болжол менен биз алуубуз керек болгон баалуулуктар.

// ---- Y-Axis

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

// ---- Z-Axis

mZ1 = mZ1 <0.073 рад дефляциясы = 0.073; баш += ийилүү; // Белгилерди урматтоодо оңдоо, эгерде (<0 позициясы) + +2*PI башы;

// Тартуу бурчу кошулгандыктан улам оңдоо

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

headingDegrees = heading * 180/PI; // Даражалар бирдигиндеги аталыш

// Чыгаруу бурчун тегиздөө / Төмөн өтүү чыпкасы

headingFiltered = headFiltered*0.85 + headDegrees*0.15;

// Сериялык порт аркылуу IDEди иштетүү үчүн аталыштын маанисин жөнөтүү

Serial.println (headFiltered);

кечиктирүү (50); }

3 -кадам: IDE булак кодун иштетүү

Мурунку Arduino эскизин жүктөгөндөн кийин, маалыматтарды Processing IDEге кабыл алып, Digital Compassти тартуубуз керек. Компас фондук сүрөттөн, жебенин туруктуу сүрөтүнөн жана компастын денесинин айлануучу сүрөтүнөн турат. Ошентип, Arduino менен эсептелген жер магнит талаасынын баалуулуктары компасты айландыруу үчүн колдонулат.

Бул жерде Processing IDEнин баштапкы коду:

/ * Arduino Compass * * Дежан Неделковский тарабынан, * www. HowToMechatronics.com * */ импорт иштетүү.сериал. *; java.awt.event. KeyEvent импорттоо; java.io. IOException импорттоо;

Сериялык myPort;

PImage imgCompass; PImage imgCompassArrow; PImage background;

String data = "";

сүзүүчү баштык;

жараксыз орнотуу () {

өлчөмү (1920, 1080, P3D); жылмакай (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = жаңы серия (бул, "COM4", 115200); // myPort.bufferUntil ('\ n') сериялык байланышын баштайт; }

жараксыз тартуу () {

сүрөт (фон, 0, 0); // Фондогу сүрөттү жүктөйт pushMatrix (); которуу (туурасы/2, бийиктиги/2, 0); // Координат системасын экрандын борборуна которот, ошондо айлануу так борборунда болот rotateZ (радиандар (-баш)); // Компасты Z айланасында айлантат -Октун сүрөтү (imgCompass, -960, -540); // Компастын сүрөтүн жүктөйт жана координат системасы башка жакка которулганда, биз сүрөттү -960x, -540y (экрандын жарымы) popMatrix () деп коюшубуз керек; // Координат системасын кайра баштапкы абалына кайтарат 0, 0, 0 сүрөт (imgCompassArrow, 0, 0); // popMatrix () функциясы textSize (30) себеби rotateZ () функциясына таасирин тийгизбеген CompassArrow сүрөтүн жүктөйт; текст ("Баш аты:" + баш аты, 40, 40); // Экранда аталыштын маанисин басып чыгарат

кечиктирүү (40);

}

// Сериялык порттон маалыматтарды окуй баштайт

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // маалыматтарды Сериялык порттон окуйт жана String өзгөрмөсүнө "data" киргизет. heading = float (data); // String маанисин Float маанисине айландыруу}

Бул долбоор сизге жагат деп ишенем. Эгер ошондой болсо, сиз дагы сонун долбоорлор үчүн менин веб -сайтыма кире аласыз.

Сунушталууда: