Turinys:

„Arduino“skaitmeninio kompaso projektas: 3 žingsniai
„Arduino“skaitmeninio kompaso projektas: 3 žingsniai

Video: „Arduino“skaitmeninio kompaso projektas: 3 žingsniai

Video: „Arduino“skaitmeninio kompaso projektas: 3 žingsniai
Video: Lesson 2: Getting Arduino Software and using Documentation for SunFounder Arduino Kit | SunFounder 2024, Lapkritis
Anonim
Image
Image

Sveiki! Šioje instrukcijoje pamatysite, kaip galite sukurti skaitmeninį kompasą naudodami „Arduino“ir apdorojimo IDE. Tai gana paprastas, bet įdomus ir šauniai atrodantis „Arduino“projektas.

Šios pamokos demonstracinį pavyzdį galite peržiūrėti aukščiau esančiame vaizdo įraše. Visada galite rasti daugiau įdomių vaizdo įrašų, tokių kaip mano „YouTube“kanale, taip pat rasite daug elektronikos projektų ir vadovėlių mano svetainėje HowToMechatronics.com

1 žingsnis: reikalingos dalys

Šiam projektui jums reikės tik „Arduino“plokštės ir MEMS magnetometro žemės magnetiniam laukui matuoti. Aš naudoju GY -80 pertraukos plokštę, kurioje yra MC5883L 3 ašių magnetometras.

Prieš tęsdami projekto šaltinio kodą Jei jums reikia daugiau informacijos apie tai, kaip veikia MEMS magnetometras, taip pat kaip prijungti ir naudoti GY -80 atskyrimo plokštę per „I2C Communication“, galite patikrinti mano konkrečias pamokas.

2 žingsnis: „Arduino“šaltinio kodas

Pirmiausia turime įkelti eskizą į „Arduino“plokštę, kuri nuskaitys magnetometro duomenis ir nusiųs juos į apdorojimo IDE. Štai „Arduino“šaltinio kodas:

/ * „Arduino Compass“* * pateikė Dejan Nedelkovski, * www. HowToMechatronics.com * */

#include // „I2C Arduino“biblioteka

#define Magnetometras_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;

plūdės antraštė, antraštė

plūdė Xm, Ym, Zm;

#define Magnetometras 0x1E // I2C 7 bitų HMC5883 adresas

void setup () {

// Inicijuoti serijinius ir I2C ryšius Serial.begin (115200); Wire.begin (); vėlavimas (100); Wire.beginTransmission (magnetometras); Wire.write (0x02); // Pasirinkite režimo registrą Wire.write (0x00); // Nuolatinio matavimo režimas Wire.endTransmission (); }

void loop () {

// ---- X ašies viela.beginTransmission (magnetometras); // perduoti į įrenginį Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometras, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnetometras); // perduoti į įrenginį Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometras, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y ašis

Wire.beginTransmission (magnetometras); // perduoti į įrenginį Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometras, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnetometras); // perduoti į įrenginį Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometras, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z ašies viela.beginTransmission (magnetometras); // perduoti į įrenginį Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometras, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnetometras); // perduoti į įrenginį Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometras, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X ašis mX1 = mX1 << 8; mX_out = mX0+mX1; // Neapdoroti duomenys // Iš duomenų lapo: 0,92 mG/skaitmuo Xm = mX_out*0,00092; // Gauso vienetas //* Žemės magnetinis laukas svyruoja nuo 0,25 iki 0,65 Gauso, taigi tai yra vertės, kurias turime gauti apytiksliai.

// ---- Y ašis

mY1 = mY1 << 8; mY_out = mY0+mY1; Ym = mY_out*0,00092;

// ---- Z ašis

mZ1 = mZ1 <0,073 rad deklinacija = 0,073; antraštė += nuokrypis; // Taisymas, kai ženklai yra gerbiami, jei (antraštė <0) antraštė += 2*PI;

// Taisymas dėl to, kad pridėtas nuolydžio kampas

if (antraštė> 2*PI) antraštė -= 2*PI;

headDegrees = antraštė * 180/PI; // Antraštė laipsniais

// Išėjimo kampo išlyginimas / Žemo dažnio filtras

antraštėFiltruota = antraštėFiltruota*0,85 + antraštėLaipsniai*0,15;

// Antraštės vertės siuntimas per nuoseklųjį prievadą apdorojant IDE

Serial.println (antraštėFiltruota);

vėlavimas (50); }

3 veiksmas: apdorokite IDE šaltinio kodą

Įkėlę ankstesnį „Arduino“eskizą, turime gauti duomenis į apdorojimo IDE ir nupiešti skaitmeninį kompasą. Kompasą sudaro fono vaizdas, fiksuotas rodyklės vaizdas ir besisukantis kompaso korpuso vaizdas. Taigi kompasui pasukti naudojamos įžeminimo magnetinio lauko vertės, apskaičiuotos naudojant „Arduino“.

Štai apdorojimo IDE šaltinio kodas:

/ * „Arduino Compass“* * pateikė Dejan Nedelkovski, * www. HowToMechatronics.com * */ import processing.serial. *; importuoti java.awt.event. KeyEvent; importuoti java.io. IOException;

Serijinis myPort;

PImage imgCompass; PImage imgCompassArrow; PImage fonas;

Eilutės duomenys = "";

plūdės antraštė;

void setup () {

dydis (1920, 1080, P3D); lygus (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); fonas = loadImage ("Background.png"); myPort = nauja serija (tai, "COM4", 115200); // paleidžia serijinį ryšį myPort.bufferUntil ('\ n'); }

void draw () {

vaizdas (fonas, 0, 0); // Įkelia fono paveikslėlį pushMatrix (); versti (plotis/2, aukštis/2, 0); // Išverčia koordinačių sistemą į ekrano centrą, kad sukimasis vyktų tiesiai centre rotateZ (radianai (-galvos)); // Pasuka kompasą aplink Z -ašies vaizdą (imgCompass, -960, -540); // Įkelia kompaso atvaizdą ir kai koordinačių sistema perkeliama, turime nustatyti vaizdą -960x, -540y (pusės ekrano dydžio) popMatrix (); // Atneša koordinačių sistemą į pradinę padėtį 0, 0, 0 vaizdas (imgCompassArrow, 0, 0); // Įkelia „CompassArrow“vaizdą, kuriam funkcija rotateZ () neturi įtakos dėl „popMatrix“() funkcijos textSize (30); tekstas ("Antraštė:" + antraštė, 40, 40); // Spausdina antraštės vertę ekrane

vėlavimas (40);

}

// pradeda skaityti duomenis iš nuoseklaus prievado

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // skaito duomenis iš nuoseklaus prievado ir įdeda juos į eilutės kintamąjį „data“. antraštė = plūdė (duomenys); // „String“vertės konvertavimas į „Float value“}

Tikiuosi, kad jums patiks šis projektas. Jei taip, taip pat galite apsilankyti mano svetainėje, kur rasite daugiau įdomių projektų.

Rekomenduojamas: