Sadržaj:

Arduino projekt digitalnog kompasa: 3 koraka
Arduino projekt digitalnog kompasa: 3 koraka

Video: Arduino projekt digitalnog kompasa: 3 koraka

Video: Arduino projekt digitalnog kompasa: 3 koraka
Video: Управление серводвигателем с помощью потенциометра с помощью Arduino 2024, Novembar
Anonim
Image
Image

Zdravo! U ovom uputstvu ćete vidjeti kako možete napraviti digitalni kompas pomoću Arduina i IDE -a za obradu. Ovo je prilično jednostavan, ali zanimljiv i cool projekt Arduino.

Demo primjer ovog vodiča možete pogledati na videu iznad. Na mom YouTube kanalu uvijek možete pronaći zanimljivije video zapise poput ovog, kao i mnogo elektroničkih projekata i vodiča na mojoj web stranici, HowToMechatronics.com

Korak 1: Potrebni dijelovi

Za ovaj projekt trebat će vam samo Arduino ploča i MEMS magnetometar za mjerenje magnetskog polja zemlje. Koristit ću ploču za razbijanje GY - 80 koja sadrži MC5883L 3 - osni magnetometar.

Prije nego nastavimo s izvornim kodom za projekt Ako vam je potrebno više detalja o načinu rada MEMS magnetometra, kao i o tome kako spojiti i koristiti GY - 80 ploču za razbijanje putem I2C komunikacije, možete provjeriti moje posebne vodiče za to.

Korak 2: Arduino izvorni kod

Ono što prvo moramo učiniti je otpremiti skicu na Arduino ploču koja će očitavati podatke s magnetometra i poslati ih u IDE za obradu. Evo izvornog koda Arduina:

/ * Arduino kompas * * autora Dejana Nedelkovskog, * www. HowToMechatronics.com * */

#include // I2C Arduino biblioteka

#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, deklinacija;

plovak Xm, Ym, Zm;

#define Magnetometar 0x1E // I2C 7 -bitna adresa HMC5883

void setup () {

// Inicijalizacija serijske i I2C komunikacije Serial.begin (115200); Wire.begin (); kašnjenje (100); Wire.beginTransmission (Magnetometar); Wire.write (0x02); // Odabir registra načina Wire.write (0x00); // Kontinuirani način mjerenja Wire.endTransmission (); }

void loop () {{100} {101}

// ---- X-Axis Wire.beginTransmission (Magnetometar); // prenosi na uređaj Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometar, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometar); // prenosi na uređaj Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometar, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-os

Wire.beginTransmission (Magnetometar); // prenosi na uređaj Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometar, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometar); // prenosi na uređaj Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometar, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Žica Z-osi.beginTransmission (Magnetometar); // prenosi na uređaj Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometar, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometar); // prenosi na uređaj Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometar, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-os mX1 = mX1 << 8; mX_out = mX0+mX1; // Sirovi podaci // Iz podatkovne tablice: 0,92 mG/znamenka Xm = mX_out*0,00092; // Gauss jedinica //* Magnetno polje Zemlje se kreće od 0,25 do 0,65 Gauss, pa su to vrijednosti koje moramo približno dobiti.

// ---- Y-os

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

// ---- Z-os

mZ1 = mZ1 <0,073 deklinacija rada = 0,073; naslov += deklinacija; // Ispravljanje pri poništavanju znakova if (zaglavlje <0) zaglavlje += 2*PI;

// Ispravljanje zbog dodavanja kuta deklinacije

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

headingDegrees = zaglavlje * 180/PI; // Jedinica naslova u stupnjevima

// Zaglađivanje izlaznog kuta / Niskopropusni filter

headingFiltered = headingFiltered*0,85 + headingDegrees*0,15;

// Slanje vrijednosti naslova kroz serijski port u Processing IDE

Serial.println (headingFiltered);

kašnjenje (50); }

Korak 3: Obrada IDE izvornog koda

Nakon što smo učitali prethodnu Arduino skicu, moramo primiti podatke u IDE za obradu i nacrtati digitalni kompas. Kompas se sastoji od slike u pozadini, nepomične slike strelice i rotirajuće slike tijela kompasa. Dakle, vrijednosti za magnetsko polje uzemljenja izračunate s Arduinom koriste se za rotiranje kompasa.

Evo izvornog koda IDE -a za obradu:

/ * Arduino kompas * * autora Dejana Nedelkovskog, * www. HowToMechatronics.com * */ import processing.serial. *; import java.awt.event. KeyEvent; import java.io. IOException;

Serijski myPort;

PImage imgCompass; PImage imgCompassArrow; PImage background;

Niz podataka = "";

plutajući zaglavlje;

void setup () {

veličina (1920, 1080, P3D); smooth (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = novi serijski (ovo, "COM4", 115200); // pokreće serijsku komunikaciju myPort.bufferUntil ('\ n'); }

void draw () {

slika (pozadina, 0, 0); // Učitava pozadinsku sliku pushMatrix (); prevesti (širina/2, visina/2, 0); // Prevodi koordinatni sistem u središte ekrana, tako da se rotacija dešava tačno u centru rotateZ (radijani (-glavlje)); // Rotira kompas oko Z -slike osi (imgCompass, -960, -540); // Učitava sliku Compass -a i kako se koordinatni sistem premješta potrebno je postaviti sliku na -960x, -540y (polovina veličine ekrana) popMatrix (); // Vraća koordinatni sistem na početnu poziciju 0, 0, 0 slika (imgCompassArrow, 0, 0); // Učitava sliku CompassArrow na koju funkcija rotateZ () ne utječe zbog funkcije popMatrix () textSize (30); text ("Naslov:" + naslov, 40, 40); // Štampa vrijednost naslova na ekranu

kašnjenje (40);

}

// počinje čitanje podataka sa serijskog porta

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // čita podatke sa serijskog porta i stavlja ih u String varijablu "data". zaglavlje = float (podaci); // Pretvaranje vrijednosti String u Float vrijednost}

Nadam se da će vam se svideti ovaj projekat. Ako je tako, možete posjetiti i moju web stranicu za više kul projekata.

Preporučuje se: