Inhaltsverzeichnis:

Arduino Digitaler Kompass-Projekt - Gunook
Arduino Digitaler Kompass-Projekt - Gunook

Video: Arduino Digitaler Kompass-Projekt - Gunook

Video: Arduino Digitaler Kompass-Projekt - Gunook
Video: Free Code Arduino Project Compass using SSD1306 OLED & MPU9250 Magnetometer 2024, November
Anonim
Image
Image

Hallo! In diesem anweisbaren sehen Sie, wie Sie einen digitalen Kompass mit einem Arduino und der Verarbeitungs-IDE herstellen können. Dies ist ein recht einfaches, aber interessantes und cool aussehendes Arduino-Projekt.

Sie können sich das Demo-Beispiel dieses Tutorials im obigen Video ansehen. Weitere interessante Videos wie dieses finden Sie immer auf meinem YouTube-Kanal sowie viele Elektronikprojekte und Tutorials auf meiner Website HowToMechatronics.com

Schritt 1: Erforderliche Teile

Für dieses Projekt benötigen Sie nur ein Arduino-Board und ein MEMS-Magnetometer, um das Erdmagnetfeld zu messen. Ich werde das GY – 80 Breakout Board verwenden, das das MC5883L 3 – Axis Magnetometer enthält.

Bevor wir mit dem Quellcode für das Projekt fortfahren Wenn Sie weitere Details zur Funktionsweise des MEMS-Magnetometers sowie zum Anschließen und Verwenden des GY - 80 Breakout-Boards über die I2C-Kommunikation benötigen, können Sie meine speziellen Tutorials dafür lesen.

Schritt 2: Arduino-Quellcode

Was wir zuerst tun müssen, ist eine Skizze auf das Arduino Board hochzuladen, die die Daten vom Magnetometer liest und sie an die Verarbeitungs-IDE sendet. Hier ist der Arduino-Quellcode:

/* Arduino Kompass * * von Dejan Nedelkovski, * www. HowToMechatronics.com * */

#include //I2C-Arduino-Bibliothek

#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 Überschrift, ÜberschriftDegrees, ÜberschriftFiltered, Deklination;

Schwimmer Xm, Ym, Zm;

#define Magnetometer 0x1E //I2C 7bit Adresse des HMC5883

Void-Setup () {

// Serielle und I2C-Kommunikation initialisieren Serial.begin(115200); Wire.begin(); Verzögerung (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Modusregister auswählen Wire.write (0x00); // Kontinuierlicher Messmodus Wire.endTransmission(); }

Leere Schleife () {

//---- X-Achse Wire.beginTransmission (Magnetometer); // an Gerät übertragen Wire.write (Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom(Magnetometer, 1); if(Wire.available()<=1) {mX0 = Wire.read(); } Wire.beginTransmission (Magnetometer); // an Gerät übertragen Wire.write (Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom(Magnetometer, 1); if(Wire.available()<=1) {mX1 = Wire.read(); }

//---- Y-Achse

Wire.beginTransmission (Magnetometer); // an Gerät übertragen Wire.write (Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom(Magnetometer, 1); if(Wire.available()<=1) {mY0 = Wire.read(); } Wire.beginTransmission (Magnetometer); // an Gerät übertragen Wire.write (Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom(Magnetometer, 1); if(Wire.available()<=1) {mY1 = Wire.read(); } //---- Z-Achse Wire.beginTransmission (Magnetometer); // an Gerät übertragen Wire.write (Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom(Magnetometer, 1); if(Wire.available()<=1) { mZ0 = Wire.read(); } Wire.beginTransmission (Magnetometer); // an Gerät übertragen Wire.write (Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom(Magnetometer, 1); if(Wire.available()<=1) { mZ1 = Wire.read(); } //---- X-Achse mX1=mX1<<8; mX_out = mX0+mX1; // Rohdaten // Aus dem Datenblatt: 0,92 mG/Digit Xm = mX_out*0.00092; // Gauss-Einheit //* Das Erdmagnetfeld reicht von 0,25 bis 0,65 Gauss, also sind dies die Werte, die wir ungefähr benötigen.

//---- Y-Achse

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

//---- Z-Achse

mZ1 = mZ1 < 0,073 rad-Deklination = 0,073; Überschrift += Deklination; // Korrektur bei Vertauschung der Vorzeichen if(heading <0) header += 2*PI;

// Korrektur durch Addition des Deklinationswinkels

if(Überschrift > 2*PI)Überschrift -= 2*PI;

ÜberschriftDegrees = Überschrift * 180/PI; // Die Überschrift in der Einheit Grad

// Glättung des Ausgangswinkels / Tiefpassfilter

ÜberschriftFiltered = ÜberschriftFiltered*0,85 + ÜberschriftDegrees*0,15;

// Senden des Heading-Werts über den seriellen Port an die Verarbeitungs-IDE

Serial.println (headingFiltered);

Verzögerung (50); }

Schritt 3: IDE-Quellcode verarbeiten

Nachdem wir die vorherige Arduino-Skizze hochgeladen haben, müssen wir die Daten in die Processing IDE empfangen und den digitalen Kompass zeichnen. Der Kompass besteht aus einem Hintergrundbild, einem festen Bild des Pfeils und einem rotierenden Bild des Kompasses. Die mit dem Arduino berechneten Werte für das Erdmagnetfeld werden also verwendet, um den Kompass zu drehen.

Hier ist der Quellcode der Verarbeitungs-IDE:

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

Serieller myPort;

PImage imgCompass; PImage imgCompassArrow; PImage-Hintergrund;

Zeichenfolge data="";

Überschrift schweben;

Leere Einrichtung () {

Größe (1920, 1080, P3D); glatt(); imgCompass = loadImage("Compass.png"); imgCompassArrow = loadImage("CompassArrow.png"); background = loadImage("Background.png"); myPort = new Serial (dies, "COM4", 115200); // startet die serielle Kommunikation myPort.bufferUntil('\n'); }

Leere zeichnen () {

Bild (Hintergrund, 0, 0); // Lädt das Hintergrundbild pushMatrix(); übersetzen (Breite/2, Höhe/2, 0); // Verschiebt das Koordinatensystem in die Mitte des Bildschirms, so dass die Drehung genau in der Mitte erfolgt rotationZ(radians(-heading)); // Rotiert den Kompass um Z - Achsenbild (imgCompass, -960, -540); // Lädt das Kompassbild und da das Koordinatensystem verschoben wird, müssen wir das Bild auf -960x, -540y (halbe Bildschirmgröße) einstellen popMatrix(); // Bringt das Koordinatensystem zurück in die ursprüngliche Position 0, 0, 0 image(imgCompassArrow, 0, 0); // Lädt das CompassArrow-Bild, das wegen der popMatrix()-Funktion von der Funktion rotateZ() nicht betroffen ist textSize(30); text("Überschrift: " + Überschrift, 40, 40); // Gibt den Wert der Überschrift auf dem Bildschirm aus

Verzögerung (40);

}

// beginnt mit dem Lesen von Daten vom seriellen Port

void serialEvent (Serial myPort) { data = myPort.readStringUntil('\n'); // liest die Daten vom seriellen Port und legt sie in die String-Variable "data" ab. Überschrift = Float (Daten); // Den String-Wert in einen Float-Wert umwandeln }

Ich hoffe, Sie werden dieses Projekt mögen. Wenn es so ist, können Sie auch meine Website für weitere coole Projekte besuchen.

Empfohlen: