Spisu treści:

Projekt cyfrowego kompasu Arduino: 3 kroki
Projekt cyfrowego kompasu Arduino: 3 kroki

Wideo: Projekt cyfrowego kompasu Arduino: 3 kroki

Wideo: Projekt cyfrowego kompasu Arduino: 3 kroki
Wideo: #ArduBlock 2.0 - Wiki Учебник - Сенсоры входа - Компас HMC5883 2024, Listopad
Anonim
Image
Image

Cześć! W tej instrukcji zobaczysz, jak możesz zrobić cyfrowy kompas za pomocą Arduino i Processing IDE. Jest to dość prosty, ale ciekawy i fajnie wyglądający projekt Arduino.

Przykład demo tego samouczka można obejrzeć na powyższym filmie. Zawsze możesz znaleźć ciekawsze filmy tego typu na moim kanale YouTube, a także znaleźć wiele projektów elektronicznych i samouczków na mojej stronie internetowej HowToMechatronics.com

Krok 1: Wymagane części

Do tego projektu będziesz potrzebować tylko płytki Arduino i magnetometru MEMS do pomiaru ziemskiego pola magnetycznego. Wykorzystam tablicę zaciskową GY – 80, która zawiera magnetometr MC5883L 3 – Axis.

Zanim przejdziemy do kodu źródłowego projektu Jeśli potrzebujesz więcej szczegółów na temat działania magnetometru MEMS, a także jak podłączyć i używać tabliczki zaciskowej GY - 80 za pośrednictwem komunikacji I2C, możesz zapoznać się z moimi konkretnymi samouczkami.

Krok 2: Kod źródłowy Arduino

To, co musimy najpierw zrobić, to wgrać szkic na płytkę Arduino, który odczyta dane z magnetometru i prześle go do Processing IDE. Oto kod źródłowy Arduino:

/* Kompas Arduino * * autorstwa Dejana Nedelkovskiego, * www. HowToMechatronics.com * */

#include //Biblioteka Arduino I2C

#definiuj magnetometr_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;

nagłówek zmiennoprzecinkowy, nagłówekStopnie, nagłówekOdfiltrowane, deklinacja;

pływak Xm, Ym, Zm;

#define Magnetometer 0x1E //I2C 7-bitowy adres HMC5883

pusta konfiguracja (){

//Zainicjuj komunikację szeregową i I2C Serial.begin(115200); Wire.początek(); opóźnienie (100); Wire.beginTransmisja (magnetometr); Wire.write(0x02); // Wybierz tryb rejestru Wire.write(0x00); // Tryb pomiaru ciągłego Wire.endTransmission(); }

pusta pętla () {

//---- X-Axis Wire.beginTransmission(Magnetometr); // prześlij do urządzenia Wire.write(Magnetometer_mX1); Wire.endTransmission(); Wire.requestFrom(Magnetometr, 1); if(Przewód.dostępny()<=1) { mX0 = Przewód.odczyt(); } Wire.beginTransmission(Magnetometr); // prześlij do urządzenia Wire.write(Magnetometer_mX0); Wire.endTransmission(); Wire.requestFrom(Magnetometr, 1); if(Przewód.dostępny()<=1) { mX1 = Przewód.odczyt(); }

//---- Oś Y

Wire.beginTransmisja (magnetometr); // prześlij do urządzenia Wire.write(Magnetometer_mY1); Wire.endTransmission(); Wire.requestFrom(Magnetometr, 1); if(Przewód.dostępny()<=1) { mY0 = Przewód.odczyt(); } Wire.beginTransmission(Magnetometr); // prześlij do urządzenia Wire.write(Magnetometer_mY0); Wire.endTransmission(); Wire.requestFrom(Magnetometr, 1); if(Przewód.dostępny()<=1) { mY1 = Przewód.odczyt(); } //---- Drut osi Z.beginTransmission(Magnetometr); // prześlij do urządzenia Wire.write(Magnetometer_mZ1); Wire.endTransmission(); Wire.requestFrom(Magnetometr, 1); if(Przewód.dostępny()<=1) { mZ0 = Przewód.odczyt(); } Wire.beginTransmission(Magnetometr); // prześlij do urządzenia Wire.write(Magnetometer_mZ0); Wire.endTransmission(); Wire.requestFrom(Magnetometr, 1); if(Przewód.dostępny()<=1) { mZ1 = Przewód.odczyt(); } //---- Oś X mX1=mX1<<8; mX_out =mX0+mX1; // Surowe dane // Z arkusza danych: 0,92 mG/cyfrę Xm = mX_out*0.00092; // jednostka Gaussa //* Pole magnetyczne Ziemi waha się od 0,25 do 0,65 Gaussa, więc są to wartości, które musimy uzyskać w przybliżeniu.

//---- Oś Y

mY1=mY1<<8; my_out = myY0+mY1; Ym = mY_out*0.00092;

//---- Oś Z

mZ1=mZ1< 0,073 rad deklinacja = 0,073; nagłówek += deklinacja; // Poprawianie, gdy znaki są odwrócone if(nagłówek <0) nagłówek += 2*PI;

// Korekta ze względu na dodanie kąta deklinacji

if(nagłówek > 2*PI)nagłówek -= 2*PI;

nagłówekDegrees = nagłówek * 180/PI; // Nagłówek w jednostkach stopni

// Wygładzanie kąta wyjścia / Filtr dolnoprzepustowy

nagłówekPrzefiltrowany = nagłówekPrzefiltrowany*0,85 + nagłówekStopnie*0,15;

//Wysyłanie wartości nagłówka przez port szeregowy do Processing IDE

Serial.println(odfiltrowany nagłówek);

opóźnienie(50); }

Krok 3: Przetwarzanie kodu źródłowego IDE

Po przesłaniu poprzedniego szkicu Arduino musimy pobrać dane do Processing IDE i narysować Digital Compass. Kompas składa się z obrazu tła, nieruchomego obrazu strzałki i obracającego się obrazu korpusu kompasu. Tak więc wartości pola magnetycznego ziemskiego obliczone za pomocą Arduino są używane do obracania kompasu.

Oto kod źródłowy IDE przetwarzania:

/* Kompas Arduino * * autorstwa Dejana Nedelkovskiego, * www. HowToMechatronics.com * */ import processing.serial.*; import java.awt.event. KeyEvent; import java.io. IOException;

port szeregowy myPort;

PImage imgKompas; PImage imgCompassArrow; Tło obrazu;

Ciąg data="";

kurs pływaka;

pusta konfiguracja () {

rozmiar (1920, 1080, P3D); gładki(); imgCompass = loadImage("Kompas.png"); imgKompasArrow = loadImage("KompasStrzałka.png"); background = loadImage("Tło.png"); myPort = new Serial(to, "COM4", 115200); // uruchamia komunikację szeregową myPort.bufferUntil('\n'); }

nieważne rysowanie () {

obraz(tło, 0, 0); // Wczytuje obraz tła pushMatrix(); przetłumacz(szerokość/2, wysokość/2, 0); // Przekłada układ współrzędnych na środek ekranu, dzięki czemu obrót następuje dokładnie w środku rotateZ(radiany(-heading)); // Obraca kompas wokół Z - Axis image(imgCompass, -960, -540); // Wczytuje obraz kompasu, a gdy układ współrzędnych zostanie przeniesiony, musimy ustawić obraz na -960x, -540y (połowa rozmiaru ekranu) popMatrix(); // Przywraca układ współrzędnych do pierwotnej pozycji 0, 0, 0 image(imgCompassArrow, 0, 0); // Wczytuje obraz CompassArrow, na który nie ma wpływu funkcja rotateZ() z powodu funkcji popMatrix() textSize(30); text("Nagłówek: " + nagłówek, 40, 40); // Wyświetla wartość nagłówka na ekranie

opóźnienie(40);

}

// rozpoczyna odczytywanie danych z portu szeregowego

void serialEvent (Serial myPort) { data = myPort.readStringUntil('\n');// odczytuje dane z portu szeregowego i umieszcza je w zmiennej String "data". nagłówek = float(dane); // Konwersja wartości String na wartość Float }

Mam nadzieję, że spodoba Ci się ten projekt. Jeśli tak, możesz również odwiedzić moją stronę, aby zobaczyć więcej fajnych projektów.

Zalecana: