Përmbajtje:

Projekti Argino Digital Compass: 3 Hapa
Projekti Argino Digital Compass: 3 Hapa

Video: Projekti Argino Digital Compass: 3 Hapa

Video: Projekti Argino Digital Compass: 3 Hapa
Video: Yamaha DT Projekti Osa 7 | Mopon Kasaus & First Start 2024, Korrik
Anonim
Image
Image

Përshëndetje! Në këtë udhëzues do të shihni se si mund të bëni një busull dixhitale duke përdorur një Arduino dhe IDE të përpunimit. Ky është një projekt mjaft i thjeshtë, por interesant dhe i lezetshëm Arduino.

Ju mund të shikoni shembullin demo të këtij mësimi në videon e mësipërme. Gjithmonë mund të gjeni video më interesante si kjo në kanalin tim në YouTube, si dhe të gjeni shumë projekte elektronike dhe mësime në faqen time në internet, HowToMechatronics.com

Hapi 1: Pjesët e kërkuara

Për këtë projekt do t'ju duhet vetëm një bord Arduino dhe një magnetometër MEMS, për matjen e fushës magnetike të tokës. Unë do të përdor bordin e thyerjes GY - 80 i cili përmban MC5883L 3 - Aks Magnetometer.

Para se të vazhdojmë me kodin burimor për projektin Nëse keni nevojë për më shumë detaje se si funksionon magnetometri MEMS, si dhe si të lidhni dhe përdorni bordin e prishjes GY - 80 përmes Komunikimit I2C, mund të kontrolloni mësimet e mia të veçanta për këtë.

Hapi 2: Kodi Burimor Arduino

Ajo që duhet të bëjmë së pari është të ngarkojmë një skicë në Bordin Arduino që do të lexojë të dhënat nga magnetometri dhe do t'i dërgojë ato në IDE të Përpunimit. Këtu është Kodi Burimor Arduino:

/ * Arduino Compass * * nga Dejan Nedelkovski, * www. HowToMechatronics.com * */

#include // Biblioteka I2C Arduino

#përcakto Magnetometër_mX0 0x03

#përcaktoni magnetometrin_mX1 0x04 #përcaktoni magnetometrin_mZ0 0x05 #përcaktoni magnetometrin_mZ1 0x06 #përcaktoni magnetometrin_mY0 0x07 #përcaktoni magnetometrin_mY1 0x08

int mX0, mX1, mX_out;

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

titulli notues, kreuDegrees, headingFiltruar, declination;

noton Xm, Ym, Zm;

#define Magnetometër 0x1E // Adresa I2C 7bit e HMC5883

void setup () {

// Filloni komunikimin Serial dhe I2C Serial.begin (115200); Wire.begin (); vonesa (100); Wire.beginTransmetimi (Magnetometër); Wire.write (0x02); // Zgjidh regjimin e regjistrimit Wire.write (0x00); // Mënyra e matjes së vazhdueshme Wire.endTransmission (); }

lak void () {

// ---- X-Axis Wire.beginTransmission (Magnetometër); // transmetoni në pajisjen Wire.write (Magnetometer_mX1); Wire.endTransmission (); Tela. Kërkohet Nga (Magnetometër, 1); nëse (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometër); // transmetoni në pajisjen Wire.write (Magnetometer_mX0); Wire.endTransmission (); Tela. Kërkohet Nga (Magnetometër, 1); nëse (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Boshti Y

Wire.beginTransmetimi (Magnetometër); // transmetoni në pajisjen Wire.write (Magnetometer_mY1); Wire.endTransmission (); Tela. Kërkohet Nga (Magnetometër, 1); nëse (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometër); // transmetoni në pajisjen Wire.write (Magnetometer_mY0); Wire.endTransmission (); Tela. Kërkohet Nga (Magnetometër, 1); nëse (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (Magnetometër); // transmetoni në pajisjen Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Tela. Kërkohet Nga (Magnetometër, 1); nëse (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometër); // transmetoni në pajisjen Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Tela. Kërkohet Nga (Magnetometër, 1); nëse (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- Boshti X mX1 = mX1 << 8; mX_out = mX0+mX1; // Të dhëna të papërpunuara // Nga fleta e të dhënave: 0.92 mG/shifra Xm = mX_out*0.00092; // Njësia Gauss //* Fusha magnetike e Tokës varion nga 0.25 në 0.65 Gauss, kështu që këto janë vlerat që duhet të marrim përafërsisht.

// ---- Boshti Y

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

// ---- Boshti Z

mZ1 = mZ1 <0.073 rad deklinacion = 0.073; kreu += rënie; // Korrigjimi kur shenjat respektohen nëse (titulli <0) kreu += 2*PI;

// Korrigjimi për shkak të shtimit të këndit të pjerrësisë

nëse (titulli> 2*PI) titulli -= 2*PI;

titulliDegrees = kreu * 180/PI; // Njësia e titullit në gradë

// Zbutja e këndit të daljes / Filtri me kalim të ulët

headingFiltered = headingFiltered*0.85 + kreuDegrees*0.15;

// Dërgimi i vlerës së titullit përmes Portit Serial në Processing IDE

Serial.println (titulliFiltruar);

vonesë (50); }

Hapi 3: Përpunimi i kodit burimor IDE

Pasi të kemi ngarkuar skicën e mëparshme Arduino, duhet të marrim të dhënat në IDE të përpunimit dhe të vizatojmë busullën dixhitale. Kompasi përbëhet nga një imazh në sfond, një imazh fiks i shigjetës dhe një imazh rrotullues i trupit të busullës. Pra, vlerat për fushën magnetike të tokës të llogaritura me Arduino përdoren për të rrotulluar busullën.

Këtu keni kodin burimor të IDE të përpunimit:

/ * Arduino Compass * * nga Dejan Nedelkovski, * www. HowToMechatronics.com * */ import processing.serial. *; import java.awt.event. KeyEvent; import java.io. IOException;

Seriali myPort;

PImage imgCompass; PImage imgCompassArrow; Sfondi i imazhit;

Të dhënat e vargut = "";

titulli notues;

void setup () {

madhësia (1920, 1080, P3D); qetë (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = Serial i ri (kjo, "COM4", 115200); // fillon komunikimin serik myPort.bufferUntil ('\ n'); }

tërheqje e pavlefshme () {

imazh (sfond, 0, 0); // Ngarkon imazhin e sfondit pushMatrix (); përkthe (gjerësia/2, lartësia/2, 0); // Përkthen sistemin koordinativ në qendër të ekranit, në mënyrë që rrotullimi të ndodhë pikërisht në qendër rrotullohetZ (radianët (-koka)); // Rrotullon busullën rreth Z -Imazhi i Boshtit (imgCompass, -960, -540); // Ngarkon imazhin e busullës dhe ndërsa sistemi i koordinatave zhvendoset ne duhet të vendosim imazhin në -960x, -540y (gjysma e madhësisë së ekranit) popMatrix (); // Sjell sistemi koordinativ është kthyer në pozicionin origjinal 0, 0, 0 imazh (imgCompassArrow, 0, 0); // Ngarkon imazhin CompassArrow i cili nuk ndikohet nga funksioni rotateZ () për shkak të funksionit popMatrix () textSize (30); tekst ("Titulli:" + titulli, 40, 40); // Shtyp vlerën e titullit në ekran

vonesa (40);

}

// fillon të lexojë të dhënat nga Porti Serial

void serialEvent (Seriali myPort) {data = myPort.readStringUntil ('\ n'); // lexon të dhënat nga Porti Serial dhe i vendos në variablin String "data". titulli = noton (të dhënat); // Konvertimi i vlerës String në Vlerë Float}

Shpresoj se do t'ju pëlqejë ky projekt. Nëse është kështu, ju gjithashtu mund të vizitoni faqen time për projekte më interesante.

Recommended: