Sommario:

Progetto bussola digitale Arduino: 3 passaggi
Progetto bussola digitale Arduino: 3 passaggi

Video: Progetto bussola digitale Arduino: 3 passaggi

Video: Progetto bussola digitale Arduino: 3 passaggi
Video: Prova del Kit 37 Sensori per Arduino - 3/3 - video 342 2024, Dicembre
Anonim
Image
Image

Ciao! In questo tutorial vedrai come puoi creare una bussola digitale usando un Arduino e l'IDE di elaborazione. Questo è un progetto Arduino abbastanza semplice ma interessante e dall'aspetto interessante.

Puoi guardare l'esempio demo di questo tutorial nel video qui sopra. Puoi sempre trovare video più interessanti come questo sul mio canale YouTube, nonché molti progetti di elettronica e tutorial sul mio sito Web, HowToMechatronics.com

Passaggio 1: parti necessarie

Per questo progetto avrai bisogno solo di una scheda Arduino e di un Magnetometro MEMS, per misurare il campo magnetico terrestre. Userò la scheda breakout GY - 80 che contiene il magnetometro a 3 assi MC5883L.

Prima di continuare con il codice sorgente del progetto Se hai bisogno di maggiori dettagli su come funziona il magnetometro MEMS e su come connettere e utilizzare la scheda breakout GY - 80 tramite la comunicazione I2C, puoi controllare i miei tutorial specifici per questo.

Passaggio 2: codice sorgente Arduino

Quello che dobbiamo fare prima è caricare uno schizzo sulla scheda Arduino che leggerà i dati dal magnetometro e li invierà all'IDE di elaborazione. Ecco il codice sorgente di Arduino:

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

#include //Libreria Arduino I2C

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

intestazione float, intestazioneGradi, intestazioneFiltrata, declinazione;

galleggiante Xm, Ym, Zm;

#define Magnetometro 0x1E //Indirizzo I2C a 7 bit di HMC5883

void setup(){

//Inizializza le comunicazioni seriali e I2C Serial.begin(115200); Wire.begin(); ritardo(100); Wire.beginTransmission(Magnetometro); Wire.write(0x02); // Seleziona la modalità di registro Wire.write(0x00); // Modalità di misurazione continua Wire.endTransmission(); }

ciclo vuoto(){

//---- X-Axis Wire.beginTransmission(Magnetometro); // trasmette al dispositivo Wire.write(Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom(Magnetometro, 1); if(Filo.disponibile()<=1) { mX0 = Filo.read(); } Wire.beginTransmission(Magnetometro); // trasmette al dispositivo Wire.write(Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom(Magnetometro, 1); if(Filo.disponibile()<=1) { mX1 = Filo.read(); }

//---- Asse Y

Wire.beginTransmission(Magnetometro); // trasmette al dispositivo Wire.write(Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom(Magnetometro, 1); if(Filo.disponibile()<=1) { mY0 = Filo.read(); } Wire.beginTransmission(Magnetometro); // trasmette al dispositivo Wire.write(Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom(Magnetometro, 1); if(Filo.disponibile()<=1) { mY1 = Filo.read(); } //---- Z-Axis Wire.beginTransmission(Magnetometro); // trasmette al dispositivo Wire.write(Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom(Magnetometro, 1); if(Filo.disponibile()<=1) { mZ0 = Filo.read(); } Wire.beginTransmission(Magnetometro); // trasmette al dispositivo Wire.write(Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom(Magnetometro, 1); if(Filo.disponibile()<=1) { mZ1 = Filo.read(); } //---- Asse X mX1=mX1<<8; mX_out =mX0+mX1; // Dati grezzi // Dal datasheet: 0,92 mG/digit Xm = mX_out*0.00092; // Unità di Gauss //* Il campo magnetico terrestre varia da 0,25 a 0,65 Gauss, quindi questi sono i valori che dobbiamo ottenere approssimativamente.

//---- Asse Y

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

//---- Asse Z

mZ1=mZ1< 0,073 declinazione rad = 0,073; intestazione += declinazione; // Correzione quando i segni sono invertiti if(heading <0) titolo += 2*PI;

// Correzione dovuta all'aggiunta dell'angolo di declinazione

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

titoloGradi = titolo * 180/PI; // L'intestazione in unità Gradi

// Levigazione dell'angolo di uscita / Filtro passa basso

intestazioneFiltered = intestazioneFiltered*0.85 + intestazioneGradi*0.15;

//Invio del valore dell'intestazione tramite la porta seriale all'IDE di elaborazione

Serial.println(headingFiltered);

ritardo(50); }

Passaggio 3: elaborazione del codice sorgente IDE

Dopo aver caricato il precedente schizzo Arduino, dobbiamo ricevere i dati nell'IDE di elaborazione e disegnare la bussola digitale. La bussola è composta da un'immagine di sfondo, un'immagine fissa della freccia e un'immagine rotante del corpo della bussola. Quindi i valori per il campo magnetico terrestre calcolati con Arduino vengono utilizzati per ruotare la bussola.

Ecco il codice sorgente dell'IDE di elaborazione:

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

myPort seriale;

PImage imgCompass; PImage imgCompassArrow; Sfondo immagine;

Dati stringa="";

intestazione galleggiante;

void setup() {

dimensione (1920, 1080, P3D); liscio(); imgCompass = loadImage("Compass.png"); imgCompassArrow = loadImage("CompassArrow.png"); background = loadImage("Background.png"); myPort = new Serial(this, "COM4", 115200); // avvia la comunicazione seriale myPort.bufferUntil('\n'); }

disegno vuoto() {

immagine(sfondo, 0, 0); // Carica l'immagine di sfondo pushMatrix(); translate(larghezza/2, altezza/2, 0); // Trasla il sistema di coordinate al centro dello schermo, in modo che la rotazione avvenga proprio al centro ruotareZ(radianti(-intestazione)); // Ruota la bussola attorno a Z - Axis image(imgCompass, -960, -540); // Carica l'immagine della bussola e poiché il sistema di coordinate viene riposizionato, è necessario impostare l'immagine a -960x, -540y (metà della dimensione dello schermo) popMatrix(); // Riporta il sistema di coordinate alla posizione originale 0, 0, 0 image(imgCompassArrow, 0, 0); // Carica l'immagine CompassArrow che non è influenzata dalla funzione rotateZ() a causa della funzione popMatrix() textSize(30); text("Titolo: " + titolo, 40, 40); // Stampa il valore dell'intestazione sullo schermo

ritardo(40);

}

// inizia a leggere i dati dalla porta seriale

void serialEvent (Serial myPort) { data = myPort.readStringUntil('\n');// legge i dati dalla porta seriale e li inserisce nella variabile String "data". intestazione = float(dati); // Conversione del valore String in valore Float }

Spero che questo progetto vi piaccia. Se è così, puoi anche visitare il mio sito Web per altri progetti interessanti.

Consigliato: