Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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:

Übersicht

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.

So funktioniert der Kompass

Arduino-Teil

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:

/* 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)

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.

IDE-Teil wird verarbeitet

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:

/*   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) 

Hier können Sie die Dateien aus dem Projekt, die Bilder und die Quellcodes herunterladen:


Herstellungsprozess

  1. Erstellen von Monitor-Ambilight mit Arduino
  2. ULTRASCHALLLEVITATION-Maschine mit ARDUINO
  3. Universelle Fernbedienung mit Arduino, 1Sheeld und Android
  4. DIY-Voltmeter mit Arduino und Smartphone
  5. Frequenz- und Duty-Cycle-Messung mit Arduino
  6. So erstellen Sie eine anpassbare stanzbare Tastaturtaste
  7. Sonar mit Arduino und Anzeige bei der Verarbeitung von IDE
  8. Autozähler mit Arduino + Processing + PHP
  9. Steuerung der LED-Helligkeit mit Bolt und Arduino
  10. Einfacher und intelligenter Roboterarm mit Arduino