Cuprins:

Proiectul Arduino Digital Compass: 3 pași
Proiectul Arduino Digital Compass: 3 pași

Video: Proiectul Arduino Digital Compass: 3 pași

Video: Proiectul Arduino Digital Compass: 3 pași
Video: Arduino: Arduino IDE + Controlul unui LED #3 2024, Iulie
Anonim
Image
Image

Buna! În acest instructable veți vedea cum puteți crea o busolă digitală folosind un Arduino și IDE-ul de procesare. Acesta este un proiect Arduino destul de simplu, dar interesant și interesant.

Puteți urmări exemplul demonstrativ al acestui tutorial pe videoclipul de mai sus. Puteți găsi oricând mai multe videoclipuri interesante de genul acesta pe canalul meu YouTube, precum și multe proiecte electronice și tutoriale pe site-ul meu, HowToMechatronics.com

Pasul 1: Piese necesare

Pentru acest proiect veți avea nevoie doar de o placă Arduino și un magnetometru MEMS, pentru măsurarea câmpului magnetic al pământului. Voi folosi placa GY-80 care conține magnetometrul cu 3 axe MC5883L.

Înainte de a continua cu codul sursă al proiectului. Dacă aveți nevoie de mai multe detalii despre modul în care funcționează magnetometrul MEMS, precum și despre modul de conectare și utilizare a plăcii GY-80 prin intermediul comunicării I2C, puteți verifica tutorialele mele speciale.

Pasul 2: Codul sursă Arduino

Ceea ce trebuie să facem mai întâi este să încărcăm o schiță pe placa Arduino care va citi datele de pe magnetometru și le va trimite la IDE-ul de procesare. Iată codul sursă Arduino:

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

#include // Biblioteca I2C Arduino

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

plutitor Xm, Ym, Zm;

#define Magnetometru 0x1E // I2C 7bit adresa HMC5883

configurare nulă () {

// Inițializați comunicațiile Serial și I2C Serial.begin (115200); Wire.begin (); întârziere (100); Wire.beginTransmission (magnetometru); Wire.write (0x02); // Selectați modul de înregistrare Wire.write (0x00); // Mod de măsurare continuă Wire.endTransmission (); }

bucla nulă () {

// ---- X-Axis Wire.beginTransmission (magnetometru); // transmite dispozitivului Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometru, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnetometru); // transmite dispozitivului Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometru, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Axa Y

Wire.beginTransmission (magnetometru); // transmite dispozitivului Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometru, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnetometru); // transmite dispozitivului Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometru, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (magnetometru); // transmite dispozitivului Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometru, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnetometru); // transmite dispozitivului Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometru, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- Axa X mX1 = mX1 << 8; mX_out = mX0 + mX1; // Date brute // Din foaia de date: 0,92 mG / cifră Xm = mX_out * 0,00092; // Unitatea Gauss // * Câmpul magnetic al Pământului variază de la 0,25 la 0,65 Gauss, deci acestea sunt valorile pe care trebuie să le obținem aproximativ.

// ---- Axa Y

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

// ---- Axa Z

mZ1 = mZ1 <0,073 declinare rad = 0,073; titlu + = declinare; // Corectarea când semnele sunt venerate dacă (titlu <0) titlu + = 2 * PI;

// Corectarea datorită adăugării unghiului de declinare

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

headingDegrees = rubrica * 180 / PI; // Rubrica din unitatea de grade

// Netezirea unghiului de ieșire / Filtru trece jos

headingFiltered = headingFiltered * 0.85 + headingDegrees * 0.15;

// Trimiterea valorii de titlu prin portul serial către IDE de procesare

Serial.println (headingFiltered);

întârziere (50); }

Pasul 3: Procesarea codului sursă IDE

După ce am încărcat schița anterioară Arduino, trebuie să primim datele în IDE de procesare și să desenăm busola digitală. Busola este compusă dintr-o imagine de fundal, o imagine fixă a săgeții și o imagine rotativă a corpului busolei. Deci valorile pentru câmpul magnetic eart calculate cu Arduino sunt folosite pentru a roti busola.

Iată codul sursă al IDE de procesare:

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

Serial myPort;

PImage imgCompass; PImage imgCompassArrow; PImage fundal;

Date șir = "";

direcția plutitor;

configurare nulă () {

dimensiune (1920, 1080, P3D); neted(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = serial nou (acesta, "COM4", 115200); // pornește comunicarea în serie myPort.bufferUntil ('\ n'); }

draw nul () {

imagine (fundal, 0, 0); // Încarcă imaginea de fundal pushMatrix (); traducere (lățime / 2, înălțime / 2, 0); // Traduce sistemul de coordonate în centrul ecranului, astfel încât rotația să aibă loc chiar în centrul rotireZ (radiani (-heading)); // Rotește busola în jurul Z - imagine Axis (imgCompass, -960, -540); // Încarcă imaginea Compass și pe măsură ce sistemul de coordonate este mutat, trebuie să setăm imaginea la -960x, -540y (jumătate din dimensiunea ecranului) popMatrix (); // Aduce sistemul de coordonate înapoi la poziția inițială 0, 0, 0 imagine (imgCompassArrow, 0, 0); // Încarcă imaginea CompassArrow care nu este afectată de funcția rotateZ () din cauza funcției popMatrix () textSize (30); text („Antet:” + antet, 40, 40); // Tipărește valoarea titlului pe ecran

întârziere (40);

}

// începe să citească date din portul serial

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // citește datele din portul serial și le pune în variabila Șir „date”. antet = float (date); // Conversia valorii String în valoare Float}

Sper să vă placă acest proiect. Dacă este așa, puteți vizita site-ul meu web pentru proiecte mai interesante.

Recomandat: