Innehållsförteckning:
Video: Arduino Digital Compass Project: 3 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:46
Hej! I den här instruktören kommer du att se hur du kan göra en digital kompass med en Arduino och Processing IDE. Detta är ganska enkelt men intressant och coolt Arduino -projekt.
Du kan se demo -exemplet på den här självstudien i videon ovan. Du kan alltid hitta fler intressanta videor som detta på min YouTube -kanal samt hitta många elektronikprojekt och självstudier på min webbplats, HowToMechatronics.com
Steg 1: Delar krävs
För detta projekt behöver du bara en Arduino Board och en MEMS Magnetometer för att mäta jordens magnetfält. Jag kommer att använda GY - 80 breakout board som innehåller MC5883L 3 - Axis Magnetometer.
Innan vi fortsätter med källkoden för projektet. Om du behöver mer information om hur MEMS -magnetometern fungerar samt hur du ansluter och använder GY -80 -utbrottskortet via I2C -kommunikationen kan du kolla mina speciella handledning för det.
Steg 2: Arduino -källkod
Det vi måste göra först är att ladda upp en skiss till Arduino Board som läser data från magnetometern och den skickar den till Processing IDE. Här är Arduino -källkoden:
/ * Arduino Compass * * av Dejan Nedelkovski, * www. HowToMechatronics.com * */
#include // 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, headingFiltrerat, deklination;
flyta Xm, Ym, Zm;
#define Magnetometer 0x1E // I2C 7bit adress till HMC5883
void setup () {
// Initiera seriell och I2C -kommunikation Serial.begin (115200); Wire.begin (); fördröjning (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Välj lägesregister Wire.write (0x00); // Kontinuerligt mätläge Wire.endTransmission (); }
void loop () {
// ---- X-Axis Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }
// ---- Y-axel
Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (Magnetometer); // överföra till enheten Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // överföra till enheten 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; // Rå data // Från databladet: 0,92 mG/siffra Xm = mX_out*0,00092; // Gauss -enhet //* Jordens magnetfält varierar från 0,25 till 0,65 Gauss, så det är de värden som vi behöver för att få ungefär.
// ---- Y-axel
mY1 = mY1 << 8; mY_out = mY0+mY1; Ym = mY_out*0,00092;
// ---- Z-axel
mZ1 = mZ1 <0,073 raddeklination = 0,073; rubrik += deklination; // Korrigera när tecken är vördade om (rubrik <0) rubrik += 2*PI;
// Korrigering på grund av tillägget av deklinationsvinkeln
om (rubrik> 2*PI) rubrik -= 2*PI;
rubrikgrader = rubrik * 180/PI; // Rubriken i grader -enhet
// Utjämning av utgångsvinkeln / Lågpassfilter
headingFiltered = headingFiltered*0,85 + headingDegrees*0,15;
// Skicka rubrikvärdet via Serial Port till Processing IDE
Serial.println (rubrikFiltrerad);
fördröjning (50); }
Steg 3: Bearbetar IDE -källkod
Efter att vi har laddat upp den tidigare Arduino -skissen måste vi ta emot data till Processing IDE och rita den digitala kompassen. Kompassen består av en bakgrundsbild, en fast bild av pilen och en roterande bild av kompassens kropp. Så värdena för jordmagnetfältet beräknat med Arduino används för att rotera kompassen.
Här är källkoden för Processing IDE:
/ * Arduino Compass * * av Dejan Nedelkovski, * www. HowToMechatronics.com * */ import processing.serial. *; importera java.awt.event. KeyEvent; importera java.io. IOException;
Seriell myPort;
PImage imgCompass; PImage imgCompassArrow; PImage bakgrund;
Strängdata = "";
flottörrubrik;
void setup () {
storlek (1920, 1080, P3D); slät(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = new Serial (detta, "COM4", 115200); // startar seriell kommunikation myPort.bufferUntil ('\ n'); }
void draw () {
bild (bakgrund, 0, 0); // Läser in bakgrundsbilden pushMatrix (); translate (bredd/2, höjd/2, 0); // Översätter koordinatsystemet till mitten av skärmen, så att rotationen sker mitt i rotationen Z (radianer (-heading)); // Roterar kompassen runt Z -axelbild (imgCompass, -960, -540); // Läser in kompassbilden och när koordinatsystemet flyttas behöver vi ställa in bilden på -960x, -540y (halva skärmstorleken) popMatrix (); // Bringer koordinatsystemet är tillbaka till den ursprungliga positionen 0, 0, 0 image (imgCompassArrow, 0, 0); // Läser in CompassArrow -bilden som inte påverkas av funktionen rotateZ () på grund av popMatrix () -funktionen textSize (30); text ("Rubrik:" + rubrik, 40, 40); // Skriver ut värdet på rubriken på skärmen
fördröjning (40);
}
// börjar läsa data från serieporten
void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // läser data från serieporten och lägger in den i strängvariabeln "data". rubrik = float (data); // Konvertera strängvärdet till Float -värde}
Jag hoppas att du kommer att gilla det här projektet. Om det är så kan du också besöka min webbplats för fler coola projekt.
Rekommenderad:
Micro: Bit Compass DIY: 6 steg
Micro: Bit Compass DIY: Så här kodar du en Micro: Bitkompass
DIY Compass Bot: 14 steg
DIY Compass Bot: Hej! Idag ska jag göra en kompassbot. Jag fick den här idén genom att tänka på hur svårt det är att rita den perfekta cirkeln utan en matematisk ruta. Jag har väl din lösning? Som du vet att en cirkel är exakt 360 grader, så kan denna bot rita en sha
Haptic Compass Belt: 9 steg
Haptic Compass Belt: Ett Arduino -drivet bälte som vibrerar mot norr. Människans uppfattning har alltid varit begränsad till våra biologiska sinnen, men tänk om vi skulle kunna ändra på det? I naturen finns det djur med förmågan att känna av magnetfält, barometertryck, ambi
Arduino Digital Code Lock Project Using Matrix Keypad: 9 Steg
Arduino Digital Code Lock Project Using Matrix Keypad: Bygg en digital kodlåsenhet med Arduino och Qwiic -system med Zio M Uno och Hex 4x3 Matrix Keypad. i. I den här självstudien visar vi användning
Digital Dice: an Arduino Project .: 4 Steg
Digital Dice: an Arduino Project .: Folk gillar spel "high tech". Till exempel: i mitt land finns det ett spel som heter "Monopol". I det spelet måste man samla "gator" genom att köpa dem med pengar. Det spelet släppte nyligen en version där man inte betalar med papper utan med en kreditkod