Inhoudsopgave:

Arduino digitaal kompasproject - Ajarnpa
Arduino digitaal kompasproject - Ajarnpa

Video: Arduino digitaal kompasproject - Ajarnpa

Video: Arduino digitaal kompasproject - Ajarnpa
Video: Modul cu senzor umiditate sol 2024, Juli-
Anonim
Image
Image

Hallo! In deze instructable zul je zien hoe je een digitaal kompas kunt maken met behulp van een Arduino en de Processing IDE. Dit is vrij eenvoudig maar interessant en cool uitziend Arduino-project.

Je kunt het demovoorbeeld van deze tutorial bekijken in de video hierboven. Je kunt altijd meer interessante video's zoals deze vinden op mijn YouTube-kanaal en ook veel elektronicaprojecten en tutorials vinden op mijn website, HowToMechatronics.com

Stap 1: Benodigde onderdelen

Voor dit project heb je alleen een Arduino-bord en een MEMS-magnetometer nodig om het aardmagnetisch veld te meten. Ik zal het GY - 80 breakout-bord gebruiken dat de MC5883L 3-Axis Magnetometer bevat.

Voordat we verder gaan met de broncode voor het project. Als je meer details nodig hebt over hoe de MEMS-magnetometer werkt en hoe je het GY - 80 breakout-bord via de I2C-communicatie kunt aansluiten en gebruiken, kun je daarvoor mijn specifieke tutorials raadplegen.

Stap 2: Arduino-broncode

Wat we eerst moeten doen, is een schets uploaden naar het Arduino-bord dat de gegevens van de magnetometer zal lezen en deze naar de Processing IDE zal sturen. Hier is de Arduino-broncode:

/* Arduino-kompas * * door Dejan Nedelkovski, * www. HowToMechatronics.com * */

#include //I2C Arduino-bibliotheek

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

zwevende rubriek, rubriekDegrees, rubriekGefilterd, declinatie;

vlotter Xm, Ym, Zm;

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

ongeldige setup(){

// Initialiseer seriële en I2C-communicatie Serial.begin (115200); Draad.begin(); vertraging (100); Wire.beginTransmission (magnetometer); Draad.schrijven (0x02); // Selecteer modusregister Wire.write (0x00); // Continue meetmodus Wire.endTransmission(); }

lege lus(){

//---- X-Axis Wire.begin Transmission (Magnetometer); // zenden naar apparaat Wire.write (Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom (Magnetometer, 1); if(Wire.available()<=1) { mX0 = Wire.read(); } Wire.beginTransmission (Magnetometer); // zenden naar apparaat Wire.write (Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom (Magnetometer, 1); if(Wire.available()<=1) { mX1 = Wire.read(); }

//---- Y-as

Wire.beginTransmission (magnetometer); // verzenden naar apparaat Wire.write (Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom (Magnetometer, 1); if(Wire.available()<=1) { mY0 = Wire.read(); } Wire.beginTransmission (Magnetometer); // zenden naar apparaat Wire.write (Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom (Magnetometer, 1); if(Wire.available()<=1) { mY1 = Wire.read(); } //---- Z-Axis Wire.beginTransmission (Magnetometer); // verzenden naar apparaat Wire.write (Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom (Magnetometer, 1); if(Wire.available()<=1) { mZ0 = Wire.read(); } Wire.beginTransmission (Magnetometer); // zenden naar apparaat Wire.write (Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom (Magnetometer, 1); if(Wire.available()<=1) { mZ1 = Wire.read(); } //---- X-as mX1=mX1<<8; mX_uit =mX0+mX1; // Ruwe data // Uit de datasheet: 0,92 mG/digit Xm = mX_out*0.00092; // Gauss-eenheid //* Het magnetische veld van de aarde varieert van 0,25 tot 0,65 Gauss, dus dit zijn de waarden die we ongeveer nodig hebben.

//---- Y-as

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

//---- Z-as

mZ1=mZ1< 0,073 raddeclinatie = 0,073; kop += declinatie; // Corrigeren wanneer tekens worden verwisseld als (kop <0) kop += 2*PI;

// Correctie door toevoeging van de declinatiehoek

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

rubriekDegrees = koers * 180/PI; // De kop in de eenheid Graden

// Afvlakken van de uitgangshoek / Laagdoorlaatfilter

headerFiltered = headingFiltered*0.85 + headingDegrees*0.15;

// Verzenden van de koerswaarde via de seriële poort naar Processing IDE

Serial.println (kop Gefilterd);

vertraging (50); }

Stap 3: IDE-broncode verwerken

Nadat we de vorige Arduino-schets hebben geüpload, moeten we de gegevens ontvangen in de Processing IDE en het digitale kompas tekenen. Het kompas bestaat uit een achtergrondafbeelding, een vaste afbeelding van de pijl en een draaiende afbeelding van het lichaam van het kompas. De met de Arduino berekende waarden voor het magnetisch veld van de aarde worden dus gebruikt om het kompas te roteren.

Hier is de broncode van de Processing IDE:

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

Seriële myPort;

PImage imgCompass; PImage imgCompassArrow; PImage achtergrond;

Tekenreeksgegevens="";

zwevende rubriek;

ongeldige setup() {

formaat (1920, 1080, P3D); zacht(); imgCompass = loadImage("Compass.png"); imgCompassArrow = loadImage("CompassArrow.png"); background = loadImage("Background.png"); myPort = nieuw serieel (dit, "COM4", 115200); // start de seriële communicatie myPort.bufferUntil('\n'); }

nietig tekenen() {

afbeelding (achtergrond, 0, 0); // Laadt de achtergrondafbeelding pushMatrix(); vertalen (breedte/2, hoogte/2, 0); // Vertaalt het coördinatensysteem naar het midden van het scherm, zodat de rotatie precies in het midden plaatsvindt.rotatieZ(radialen(-heading)); // Draait het kompas rond de Z-as afbeelding (imgCompass, -960, -540); // Laadt de Compass-afbeelding en als het coördinatensysteem wordt verplaatst, moeten we de afbeelding instellen op -960x, -540y (halve schermgrootte) popMatrix(); // Brengt het coördinatensysteem terug naar de oorspronkelijke positie 0, 0, 0 image(imgCompassArrow, 0, 0); // Laadt de CompassArrow-afbeelding die niet wordt beïnvloed door de functie roterenZ() vanwege de popMatrix()-functie textSize (30); text("Kop: " + kop, 40, 40); // Drukt de waarde van de kop op het scherm af

vertraging (40);

}

// begint met het lezen van gegevens van de seriële poort

void serialEvent (Serial myPort) { data = myPort.readStringUntil('\n');// leest de gegevens van de seriële poort en plaatst deze in de String-variabele "data". kop = zweven (gegevens); // De String-waarde omzetten in Float-waarde}

Ik hoop dat je dit project leuk vindt. Dan kun je ook voor meer toffe projecten op mijn website terecht.

Aanbevolen: