Съдържание:

Проект за цифров компас на Arduino: 3 стъпки
Проект за цифров компас на Arduino: 3 стъпки

Видео: Проект за цифров компас на Arduino: 3 стъпки

Видео: Проект за цифров компас на Arduino: 3 стъпки
Видео: Компас на ардуино своими руками / DIY compass on arduino 2024, Ноември
Anonim
Image
Image

Здравейте! В тази инструкция ще видите как можете да направите цифров компас, използвайки Arduino и IDE за обработка. Това е доста прост, но интересен и готин Arduino проект.

Можете да гледате демонстрационния пример на този урок във видеото по -горе. Винаги можете да намерите по -интересни видеоклипове като този в моя канал в YouTube, както и да намерите много проекти за електроника и уроци на моя уебсайт, HowToMechatronics.com

Стъпка 1: Необходими части

За този проект ще ви трябват само Arduino Board и MEMS магнитометър за измерване на земното магнитно поле. Ще използвам пробивната платка GY - 80, която съдържа MC5883L 3 - осен магнитометър.

Преди да продължим с изходния код на проекта. Ако имате нужда от повече подробности как работи магнитометърът MEMS, както и как да свържете и използвате пробивната платка GY - 80 чрез комуникацията I2C, можете да проверите конкретните ми уроци за това.

Стъпка 2: Изходният код на Arduino

Това, което трябва първо да направим, е да качим скица на Arduino Board, която ще прочете данните от магнитометъра и ще ги изпрати до IDE за обработка. Ето изходния код на Arduino:

/ * Компас Arduino * * от Деян Неделковски, * www. HowToMechatronics.com * */

#include // I2C Arduino библиотека

#Определете магнитометър_mX0 0x03

#определи магнитометър_mX1 0x04 #дефинирай магнитометър_mZ0 0x05 #дефинирай магнитометър_mZ1 0x06 #дефинирай магнитометър_mY0 0x07 #дефинирай магнитометър_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out; int mZ0, mZ1, mZ_out;

float heading, headingDegrees, headingFiltered, склонение;

поплавък Xm, Ym, Zm;

#define Магнитометър 0x1E // I2C 7 -битов адрес на HMC5883

void setup () {

// Инициализиране на серийни и I2C комуникации Serial.begin (115200); Wire.begin (); забавяне (100); Wire.beginTransmission (магнитометър); Wire.write (0x02); // Избор на регистър на режим Wire.write (0x00); // Режим на непрекъснато измерване Wire.endTransmission (); }

void loop () {

// ---- Wire X-Axis Wire.beginTransmission (магнитометър); // предава към устройството Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (Магнитометър, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (магнитометър); // предава на устройството Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (Магнитометър, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Y-ос

Wire.beginTransmission (магнитометър); // предава на устройството Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Магнитометър, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (магнитометър); // предава на устройството Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Магнитометър, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (Магнитометър); // предава на устройството Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Магнитометър, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (магнитометър); // предава към устройството Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Магнитометър, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- X-ос mX1 = mX1 << 8; mX_out = mX0+mX1; // Сурови данни // От листа с данни: 0.92 mG/цифра Xm = mX_out*0.00092; // Гаусова единица //* Земното магнитно поле варира от 0,25 до 0,65 Гаус, така че това са стойностите, които трябва да получим приблизително.

// ---- Y-ос

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

// ---- Z-ос

mZ1 = mZ1 <0,073 рад отклонение = 0,073; заглавие += отклонение; // Коригиране, когато знаците са отменени, ако (заглавие <0) заглавие += 2*PI;

// Коригиране поради добавяне на ъгъла на склонение

if (заглавие> 2*PI) заглавие -= 2*PI;

headingDegrees = заглавие * 180/PI; // Заглавието в единица градуси

// Изглаждане на изходния ъгъл / Нискочестотен филтър

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

// Изпращане на стойността на заглавието през серийния порт до IDE за обработка

Serial.println (headingFiltered);

забавяне (50); }

Стъпка 3: Обработка на IDE изходния код

След като качим предишната скица на Arduino, трябва да получим данните в IDE за обработка и да нарисуваме цифровия компас. Компасът се състои от фоново изображение, неподвижно изображение на стрелката и въртящо се изображение на тялото на компаса. Така че стойностите за земното магнитно поле, изчислени с Arduino, се използват за завъртане на компаса.

Ето изходния код на IDE за обработка:

/ * Arduino Compass * * от Dejan Nedelkovski, * www. HowToMechatronics.com * */ import processing.serial. *; импортиране на java.awt.event. KeyEvent; импортиране на java.io. IOException;

Сериен myPort;

PImage imgCompass; PImage imgCompassArrow; PImage фон;

Низови данни = "";

плаващ заглавие;

void setup () {

размер (1920, 1080, P3D); гладка (); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = нов сериен (това, "COM4", 115200); // стартира серийната комуникация myPort.bufferUntil ('\ n'); }

void draw () {

изображение (фон, 0, 0); // Зарежда фоновото изображение pushMatrix (); превод (ширина/2, височина/2, 0); // Превежда координатната система в центъра на екрана, така че завъртането става точно в центъра rotateZ (радиани (-заглавие)); // Завърта компаса около Z -изображение на оста (imgCompass, -960, -540); // Зарежда изображението на компаса и тъй като координатната система се премества, трябва да настроим изображението на -960x, -540y (половината от размера на екрана) popMatrix (); // Връща координатната система обратно в първоначалната позиция 0, 0, 0 изображение (imgCompassArrow, 0, 0); // Зарежда изображението CompassArrow, което не се влияе от функцията rotateZ () поради функцията popMatrix () textSize (30); текст ("Заглавие:" + заглавие, 40, 40); // Отпечатва стойността на заглавието на екрана

забавяне (40);

}

// започва да чете данни от серийния порт

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // чете данните от серийния порт и ги поставя в променливата String "data". заглавие = поплавък (данни); // Конвертиране на стойността на String в Float стойност}

Надявам се този проект да ви хареса. Ако е така, можете да посетите и уебсайта ми за още готини проекти.

Препоръчано: