So erstellen Sie einen Kompass mit Arduino und Processing IDE
In diesem Arduino-Projekt werden wir sehen, wie wir diesen cool aussehenden Kompass mit einem Arduino, einem MEMS-Magnetometer und der Verarbeitungs-IDE herstellen können. Hier ist ein Demonstrationsvideo des Kompasses:
Alles, was wir für dieses Projekt brauchen, ist ein MEMS-Magnetometer, um das Erdmagnetfeld zu messen, ein Arduino-Board und einige Schaltdrähte. Als Beispiel werde ich das HMC5883L verwenden, ein 3-Achsen-Magnetometer, das in das GY-80-Breakout-Board integriert ist.
Zuerst müssen wir die Daten vom Sensor mit dem Arduino Board über das I2C-Protokoll abrufen. Dann berechnen wir unter Verwendung der X-Achsen- und Y-Achsen-Werte des Sensors den Kurs und senden seinen Wert über die serielle Schnittstelle an die Verarbeitungs-IDE. Der folgende Code erledigt diese Aufgabe:
Wenn Sie weitere Einzelheiten zur Funktionsweise des MEMS-Magnetometers und zum Abrufen der Daten benötigen, können Sie sich mein Tutorial zu MEMS-Sensoren ansehen.
Hier müssen wir zuerst die Heading-Werte empfangen, die von der seriellen Schnittstelle kommen. Weitere Informationen dazu finden Sie in meinem Arduino- und Verarbeitungs-Tutorial.
Der Kompass ist eigentlich ein Bild, oder genauer gesagt, er besteht aus mehreren transparenten Bildern, die in die Processing IDE geladen werden. Die Bilder müssen sich im Arbeitsverzeichnis der Skizze befinden. Nachdem wir die Bildobjekte im Abschnitt draw() mit der Funktion image() definiert haben, laden wir das Hintergrundbild (optional, Sie können nur eine einfache Farbe für den Hintergrund verwenden). Dann wird das Kompassbild geladen das mithilfe der Funktion „rotateZ()“ mit den Werten der Überschrift gedreht wird. Darüber wird das Kompasspfeilbild geladen.
Hier ist der Verarbeitungs-IDE-Code:
Hier können Sie die Dateien aus dem Projekt, die Bilder und die Quellcodes herunterladen: Übersicht
So funktioniert der Kompass
Arduino-Teil
/* Arduino Compass
*
* by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
*/
#include <Wire.h> //I2C Arduino Library
#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, declination;
float Xm,Ym,Zm;
#define Magnetometer 0x1E //I2C 7bit address of HMC5883
void setup(){
//Initialize Serial and I2C communications
Serial.begin(115200);
Wire.begin();
delay(100);
Wire.beginTransmission(Magnetometer);
Wire.write(0x02); // Select mode register
Wire.write(0x00); // Continuous measurement mode
Wire.endTransmission();
}
void loop(){
//---- X-Axis
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mX1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mX0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mX0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mX1 = Wire.read();
}
//---- Y-Axis
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mY1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mY0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mY0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mY1 = Wire.read();
}
//---- Z-Axis
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mZ1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mZ0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); // transmit to device
Wire.write(Magnetometer_mZ0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
if(Wire.available()<=1)
{
mZ1 = Wire.read();
}
//---- X-Axis
mX1=mX1<<8;
mX_out =mX0+mX1; // Raw data
// From the datasheet: 0.92 mG/digit
Xm = mX_out*0.00092; // Gauss unit
//* Earth magnetic field ranges from 0.25 to 0.65 Gauss, so these are the values that we need to get approximately.
//---- Y-Axis
mY1=mY1<<8;
mY_out =mY0+mY1;
Ym = mY_out*0.00092;
//---- Z-Axis
mZ1=mZ1<<8;
mZ_out =mZ0+mZ1;
Zm = mZ_out*0.00092;
// ==============================
//Calculating Heading
heading = atan2(Ym, Xm);
// Correcting the heading with the declination angle depending on your location
// You can find your declination angle at: https://www.ngdc.noaa.gov/geomag-web/
// At my location it's 4.2 degrees => 0.073 rad
declination = 0.073;
heading += declination;
// Correcting when signs are reveresed
if(heading <0) heading += 2*PI;
// Correcting due to the addition of the declination angle
if(heading > 2*PI)heading -= 2*PI;
headingDegrees = heading * 180/PI; // The heading in Degrees unit
// Smoothing the output angle / Low pass filter
headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;
//Sending the heading value through the Serial Port to Processing IDE
Serial.println(headingFiltered);
delay(50);
}
Codesprache:Arduino (arduino) IDE-Teil wird verarbeitet
/* Arduino Compass
*
* by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
PImage imgCompass;
PImage imgCompassArrow;
PImage background;
String data="";
float heading;
void setup() {
size (1920, 1080, P3D);
smooth();
imgCompass = loadImage("Compass.png");
imgCompassArrow = loadImage("CompassArrow.png");
background = loadImage("Background.png");
myPort = new Serial(this, "COM4", 115200); // starts the serial communication
myPort.bufferUntil('\n');
}
void draw() {
image(background,0, 0); // Loads the Background image
pushMatrix();
translate(width/2, height/2, 0); // Translates the coordinate system into the center of the screen, so that the rotation happen right in the center
rotateZ(radians(-heading)); // Rotates the Compass around Z - Axis
image(imgCompass, -960, -540); // Loads the Compass image and as the coordinate system is relocated we need need to set the image at -960x, -540y (half the screen size)
popMatrix(); // Brings coordinate system is back to the original position 0,0,0
image(imgCompassArrow,0, 0); // Loads the CompassArrow image which is not affected by the rotateZ() function because of the popMatrix() function
textSize(30);
text("Heading: " + heading,40,40); // Prints the value of the heading on the screen
delay(40);
}
// starts reading data from the Serial Port
void serialEvent (Serial myPort) {
data = myPort.readStringUntil('\n');// reads the data from the Serial Port and puts it into the String variable "data".
heading = float(data); // Convering the the String value into Float value
}
Codesprache:Arduino (arduino)
Herstellungsprozess
- Erstellen von Monitor-Ambilight mit Arduino
- ULTRASCHALLLEVITATION-Maschine mit ARDUINO
- Universelle Fernbedienung mit Arduino, 1Sheeld und Android
- DIY-Voltmeter mit Arduino und Smartphone
- Frequenz- und Duty-Cycle-Messung mit Arduino
- So erstellen Sie eine anpassbare stanzbare Tastaturtaste
- Sonar mit Arduino und Anzeige bei der Verarbeitung von IDE
- Autozähler mit Arduino + Processing + PHP
- Steuerung der LED-Helligkeit mit Bolt und Arduino
- Einfacher und intelligenter Roboterarm mit Arduino