2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-23 15:01
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:
Digitaal kompas en koerszoeker: 6 stappen
Digitaal kompas en koerszoeker: Auteurs: Cullan Whelan Andrew Luft Blake Johnson Erkenningen: California Maritime Academy Evan Chang-Siu Inleiding: De basis van dit project is een digitaal kompas met koersbepaling. Hierdoor kan de gebruiker een koers volgen over lange afstand
Digitaal vertragingspedaal: 19 stappen (met afbeeldingen)
Digitaal vertragingspedaal: Gitaarpedalen bouwen is een tijdrovend, vaak frustrerend en duur proces. Als je denkt dat je tijd en geld kunt besparen door je eigen digitale delaypedaal te maken, raad ik je ten zeerste aan om R.G. Keen's pagina over de economie van pedaalbouw
Telefoon quarantaine voor digitaal minimalisme! 5 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Telefonische quarantaine voor digitaal minimalisme!: Te vaak zou ik mijn telefoon pakken om het weer te checken en in een sociale-mediaspiraal belanden. Ik had een telefoon quarantaine nodig. :) Dit is een telefoonstandaard die oplicht als je je telefoon neerlegt. Daarnaast houdt het bij hoe lang je het laat staan
Digitaal degelijke muziek maken: 4 stappen
Hoe maak je fatsoenlijke muziek digitaal: Wanneer je muziek maakt op een computer-gebaseerd apparaat (iPad, iPhone, MacBook, laptop, computer, etc.) zijn er meerdere dingen om te overwegen. Ten eerste is er het kiezen van een D.A.W. (Ook bekend als een digitaal audiowerkstation) om muziek op te maken of te produceren.Se
Digitaal display voor ESP8266: 3 stappen
Digitaal display voor ESP8266: in dit project leert u hoe u het digitale display van Arduino op uw ESP8266-bord aansluit en hoe u IP-adressen op het display kunt weergeven