INHOUDSOPGAWE:

Arduino Digital Compass Project: 3 stappe
Arduino Digital Compass Project: 3 stappe

Video: Arduino Digital Compass Project: 3 stappe

Video: Arduino Digital Compass Project: 3 stappe
Video: It Became Unliveable! ~ Abandoned Home Of The Spenser's In The USA 2024, November
Anonim
Image
Image

Hallo! In hierdie instruksies sal u sien hoe u 'n digitale kompas kan maak met 'n Arduino en die verwerkings -IDE. Dit is redelik eenvoudig, maar interessant en koel Arduino -projek.

U kan die demo -voorbeeld van hierdie tutoriaal in die video hierbo sien. U kan altyd meer interessante video's soos hierdie op my YouTube -kanaal vind, sowel as baie elektroniese projekte en tutoriale op my webwerf, HowToMechatronics.com.

Stap 1: Onderdele benodig

Vir hierdie projek benodig u slegs 'n Arduino -bord en 'n MEMS -magnetometer om die aardmagnetiese veld te meet. Ek sal die GY -80 uitbreekbord gebruik wat die MC5883L 3 -as magnetometer bevat.

Voordat ons voortgaan met die bronkode vir die projek. As u meer inligting benodig oor hoe die MEMS -magnetometer werk, asook hoe u die GY - 80 -uitbreekbord kan koppel en gebruik via die I2C -kommunikasie, kan u my spesifieke tutoriale daarvoor nagaan.

Stap 2: Arduino -bronkode

Wat ons eers moet doen, is om 'n skets op te laai na die Arduino -bord wat die data van die magnetometer sal lees en dit na die verwerkings -IDE sal stuur. Hier is die Arduino -bronkode:

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

#include // I2C Arduino -biblioteek

#definieer magnetometer_mX0 0x03

#define Magnetometer_mX1 0x04 #definieer Magnetometer_mZ0 0x05 #definieer Magnetometer_mZ1 0x06 #definieer Magnetometer_mY0 0x07 #definieer Magnetometer_mY1 0x08

int mX0, mX1, mX_out;

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

float heading, headingDegrees, headingFiltreer, deklinasie;

dryf Xm, Ym, Zm;

#define Magnetometer 0x1E // I2C 7bit adres van HMC5883

ongeldige opstelling () {

// Initialiseer Serial- en I2C -kommunikasie Serial.begin (115200); Wire.begin (); vertraging (100); Wire.begin Transmissie (Magnetometer); Wire.write (0x02); // Kies modusregister Wire.write (0x00); // Deurlopende metingsmodus Wire.endTransmission (); }

leemte -lus () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // stuur na toestel Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); as (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.begin Transmissie (magnetometer); // stuur na toestel Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); as (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-as

Wire.begin Transmissie (Magnetometer); // stuur na toestel Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); as (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.begin Transmissie (magnetometer); // stuur na toestel Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); as (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.begin Transmissie (Magnetometer); // stuur na toestel Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); as (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.begin Transmissie (magnetometer); // stuur na toestel Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); as (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-as mX1 = mX1 << 8; mX_out = mX0+mX1; // Rou data // Uit die datablad: 0.92 mG/syfer Xm = mX_out*0.00092; // Gauss -eenheid //* Aardmagnetiese veld wissel van 0,25 tot 0,65 Gauss, dus dit is die waardes wat ons ongeveer moet kry.

// ---- Y-as

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

// ---- Z-as

mZ1 = mZ1 <0,073 rad deklinasie = 0,073; opskrif += deklinasie; // Regstel wanneer tekens vereer word as (opskrif <0) opskrif += 2*PI;

// Korrigering as gevolg van die byvoeging van die deklinasiehoek

as (opskrif> 2*PI) opskrif -= 2*PI;

headingDegrees = opskrif * 180/PI; // Die opskrif in Graad -eenheid

// Maak die uitvoerhoek glad / Laag deurlaatfilter

headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;

// Stuur die opskrifwaarde deur die seriële poort na die verwerking van IDE

Serial.println (opskrif gefilter);

vertraging (50); }

Stap 3: Verwerking van IDE -bronkode

Nadat ons die vorige Arduino -skets opgelaai het, moet ons die data in die verwerkings -IDE ontvang en die digitale kompas teken. Die kompas bestaan uit 'n agtergrondbeeld, 'n vaste beeld van die pyl en 'n roterende beeld van die liggaam van die kompas. Dus word die waardes vir die aardmagnetiese veld bereken met die Arduino gebruik om die kompas te draai.

Hier is die bronkode van die verwerkings -IDE:

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

Seriële myPort;

PImage imgCompass; PImage imgCompassArrow; Beeld agtergrond;

String data = "";

dryfkop;

ongeldige opstelling () {

grootte (1920, 1080, P3D); glad (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = new Serial (hierdie, "COM4", 115200); // begin die seriële kommunikasie myPort.bufferUntil ('\ n'); }

nietige trekking () {

beeld (agtergrond, 0, 0); // Laai die agtergrondprent pushMatrix (); translate (breedte/2, hoogte/2, 0); // Vertaal die koördinaatstelsel in die middel van die skerm, sodat die rotasie in die middelste rotasie Z plaasvind (radiale (-opskrif)); // Draai die kompas om Z -As -beeld (imgCompass, -960, -540); // Laai die kompasbeeld af, en namate die koördinaatstelsel hervestig word, moet ons die beeld op -960x, -540y (die helfte van die skermgrootte) popMatrix () stel; // Bring die koördinaatstelsel terug na die oorspronklike posisie 0, 0, 0 image (imgCompassArrow, 0, 0); // Laai die CompassArrow -beeld wat nie deur die rotateZ () -funksie beïnvloed word nie as gevolg van die popMatrix () -funksie textSize (30); teks ("Opskrif:" + opskrif, 40, 40); // Druk die waarde van die opskrif op die skerm af

vertraging (40);

}

// begin data vanaf die seriële poort lees

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // lees die data van die seriële poort en plaas dit in die string veranderlike "data". opskrif = float (data); // Om die string -waarde in float -waarde oor te dra}

Ek hoop dat u van hierdie projek sal hou. As dit so is, kan u ook my webwerf besoek vir nog meer interessante projekte.

Aanbeveel: