Kazalo:

Projekt digitalnega kompasa Arduino: 3 koraki
Projekt digitalnega kompasa Arduino: 3 koraki

Video: Projekt digitalnega kompasa Arduino: 3 koraki

Video: Projekt digitalnega kompasa Arduino: 3 koraki
Video: #15 HC 05 Bluetooth Modbus Android HMI | Внешний ПЛК Arduino 2024, Julij
Anonim
Image
Image

Zdravo! V tem navodilu boste videli, kako lahko z Arduinom in IDE -jem za obdelavo naredite digitalni kompas. To je precej preprost, a zanimiv in kul projekt Arduino.

Predstavitveni primer te vadnice si lahko ogledate v zgornjem videu. Na mojem kanalu v YouTubu lahko vedno najdete več zanimivih videoposnetkov, kot je ta, na moji spletni strani HowToMechatronics.com pa najdete veliko projektov in vaj za elektroniko.

1. korak: potrebni deli

Za ta projekt potrebujete le ploščo Arduino in magnetometer MEMS za merjenje zemeljskega magnetnega polja. Uporabil bom ploščo GY - 80, ki vsebuje 3 -osni magnetometer MC5883L.

Preden nadaljujemo z izvorno kodo za projekt. Če potrebujete več podrobnosti o delovanju magnetometra MEMS ter o tem, kako povezati in uporabiti prekinjeno ploščo GY -80 prek komunikacije I2C, lahko za to preverite moje posebne vaje.

2. korak: izvorna koda Arduino

Najprej moramo narediti, da na ploščo Arduino naložimo skico, ki bo prebrala podatke z magnetometra in jih poslala v IDE za obdelavo. Tu je izvorna koda Arduino:

/ * Arduino kompas * * Dejana Nedelkovskega, * www. HowToMechatronics.com * */

#include // Knjižnica Arduino I2C

#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, deklinacija;

plovec Xm, Ym, Zm;

#define Magnetometer 0x1E // 7 -bitni naslov I2C HMC5883

void setup () {

// Inicializiraj serijsko in I2C komunikacijo Serial.begin (115200); Wire.begin (); zamuda (100); Wire.beginTransmission (Magnetometer); Wire.write (0x02); // Izberite register načina Wire.write (0x00); // Način neprekinjenega merjenja Wire.endTransmission (); }

void loop () {

// ---- žica X-osi.beginTransmission (magnetometer); // pošiljanje na napravo Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); če (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // prenesite na napravo Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); če (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-os

Wire.beginTransmission (Magnetometer); // pošiljanje na napravo Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); če (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // pošiljanje na napravo Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); če (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- žica Z-osi.beginTransmission (magnetometer); // pošiljanje na napravo Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); če (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (Magnetometer); // prenesite na napravo Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Magnetometer, 1); če (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-os mX1 = mX1 << 8; mX_out = mX0+mX1; // Neobdelani podatki // Iz podatkovnega lista: 0,92 mG/številka Xm = mX_out*0,00092; // Gaussova enota //* Magnetno polje Zemlje se giblje od 0,25 do 0,65 Gauss, zato so to vrednosti, ki jih moramo približno dobiti.

// ---- Y-os

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

// ---- os Z

mZ1 = mZ1 <0,073 deklinacija rad = 0,073; naslov += deklinacija; // Popravljanje, ko so znaki razveljavljeni, če (naslov <0) naslov += 2*PI;

// Popravljanje zaradi dodatka kota deklinacije

če (naslov> 2*PI) naslov -= 2*PI;

headingDegrees = naslov * 180/PI; // naslov v enotah stopinj

// Glajenje izhodnega kota / nizkoprepustni filter

headingFiltered = headFiltered*0,85 + headingDegrees*0,15;

// Pošiljanje vrednosti naslova skozi zaporedna vrata v IDE za obdelavo

Serial.println (headFiltrirano);

zamuda (50); }

3. korak: Obdelava izvorne kode IDE

Ko naložimo prejšnjo skico Arduino, moramo podatke prejeti v IDE za obdelavo in narisati digitalni kompas. Kompas je sestavljen iz slike ozadja, fiksne slike puščice in vrtljive slike telesa kompasa. Tako se vrednosti za zemeljsko magnetno polje, izračunane z Arduinom, uporabljajo za vrtenje kompasa.

Tu je izvorna koda IDE -ja za obdelavo:

/ * Arduino Compass * * Dejana Nedelkovskega, * www. HowToMechatronics.com * */ import processing.serial. *; uvoz java.awt.event. KeyEvent; uvoz java.io. IOException;

Serijski myPort;

PImage imgCompass; PImage imgCompassArrow; Ozadje PImage;

Niz podatkov = "";

plavajoči naslov;

void setup () {

velikost (1920, 1080, P3D); gladko (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = nov serijski (to, "COM4", 115200); // zažene serijsko komunikacijo myPort.bufferUntil ('\ n'); }

void draw () {

slika (ozadje, 0, 0); // naloži sliko ozadja pushMatrix (); prevesti (širina/2, višina/2, 0); // prevede koordinatni sistem v sredino zaslona, tako da se vrtenje zgodi ravno v središču rotateZ (radiani (-glavje)); // Zavrti kompas okoli slike Z -os (imgCompass, -960, -540); // Naloži sliko Compass in ko se koordinatni sistem premakne, moramo sliko nastaviti na -960x, -540y (polovica velikosti zaslona) popMatrix (); // Vrne koordinatni sistem nazaj v prvotni položaj slike 0, 0, 0 (imgCompassArrow, 0, 0); // naloži sliko CompassArrow, na katero funkcija rotateZ () ne vpliva zaradi funkcije popMatrix () textSize (30); besedilo ("Naslov:" + naslov, 40, 40); // Natisne vrednost naslova na zaslonu

zamuda (40);

}

// začne brati podatke iz zaporednih vrat

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // prebere podatke iz zaporednih vrat in jih vstavi v spremenljivko "data". naslov = plavajoči (podatki); // Pretvarjanje vrednosti String v vrednost Float}

Upam, da vam bo ta projekt všeč. Če je tako, lahko obiščete tudi mojo spletno stran za bolj kul projekte.

Priporočena: