Оглавление:

Проект цифрового компаса Arduino: 3 шага
Проект цифрового компаса Arduino: 3 шага

Видео: Проект цифрового компаса Arduino: 3 шага

Видео: Проект цифрового компаса Arduino: 3 шага
Видео: Открытые уроки по Arduino. Урок 8: обсуждаем курсовой проект и пишем игру на C++ 2024, Июль
Anonim
Image
Image

Привет! В этом руководстве вы увидите, как создать цифровой компас, используя Arduino и Processing IDE. Это довольно простой, но интересный и круто выглядящий проект Arduino.

Вы можете посмотреть демонстрационный пример этого урока на видео выше. Вы всегда можете найти больше интересных видео, подобных этому, на моем канале YouTube, а также найти множество проектов и руководств по электронике на моем веб-сайте HowToMechatronics.com.

Шаг 1. Необходимые детали

Для этого проекта вам понадобится только плата Arduino и магнитометр MEMS для измерения магнитного поля Земли. Я буду использовать коммутационную плату GY-80, которая содержит 3-осевой магнитометр MC5883L.

Прежде чем мы продолжим работу с исходным кодом проекта. Если вам нужны более подробные сведения о том, как работает магнитометр MEMS, а также о том, как подключить и использовать коммутационную плату GY-80 через I2C Communication, вы можете ознакомиться с моими конкретными руководствами по этому поводу.

Шаг 2: Исходный код Arduino

Что нам нужно сделать в первую очередь, так это загрузить эскиз на плату Arduino, которая будет считывать данные с магнитометра и отправлять их в Processing IDE. Вот исходный код Arduino:

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

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

#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, склонение;

float Xm, Ym, Zm;

#define Magnetometer 0x1E // 7-битный адрес I2C HMC5883

void setup () {

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

void loop () {

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

// ---- ось Y

Wire.beginTransmission (магнитометр); // передаем на устройство Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (Магнитометр, 1); если (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (магнитометр); // передаем на устройство Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (Магнитометр, 1); если (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- ось Z Wire.beginTransmission (магнитометр); // передаем на устройство Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (Магнитометр, 1); если (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (магнитометр); // передаем на устройство Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (Магнитометр, 1); если (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- ось X mX1 = mX1 << 8; mX_out = mX0 + mX1; // Исходные данные // Из таблицы: 0,92 мгГ / цифра 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; курс + = склонение; // Исправление, когда знаки учитываются if (заголовок <0) заголовок + = 2 * PI;

// Поправка за счет добавления угла склонения

if (заголовок> 2 * PI) заголовок - = 2 * PI;

headingDegrees = заголовок * 180 / PI; // Заголовок в градусах

// Сглаживание выходного угла / Фильтр низких частот

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

// Отправка значения заголовка через последовательный порт в IDE обработки

Serial.println (заголовок с фильтром);

задержка (50); }

Шаг 3. Обработка исходного кода IDE

После того, как мы загрузили предыдущий скетч Arduino, нам нужно получить данные в Processing IDE и нарисовать цифровой компас. Компас состоит из фонового изображения, фиксированного изображения стрелки и вращающегося изображения корпуса компаса. Таким образом, значения магнитного поля земли, рассчитанные с помощью Arduino, используются для вращения компаса.

Вот исходный код Processing IDE:

/ * Arduino Compass * * от Деян Неделковски, * www. HowToMechatronics.com * * / import processing.serial. *; import java.awt.event. KeyEvent; import 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 (radians (-heading)); // Вращает компас вокруг изображения оси Z (imgCompass, -960, -540); // Загружает изображение компаса, и поскольку система координат перемещается, нам нужно установить изображение в -960x, -540y (половина размера экрана) popMatrix (); // Возвращает систему координат в исходное положение 0, 0, 0 image (imgCompassArrow, 0, 0); // Загружает изображение CompassArrow, на которое не влияет функция rotateZ () из-за функции popMatrix () textSize (30); текст («Заголовок:» + заголовок, 40, 40); // Выводит значение заголовка на экран

задержка (40);

}

// начинает чтение данных из последовательного порта

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // считывает данные из последовательного порта и помещает их в строковую переменную «data». заголовок = float (данные); // Преобразование строкового значения в значение с плавающей запятой}

Надеюсь, вам понравится этот проект. Если это так, вы также можете посетить мой веб-сайт, чтобы увидеть больше интересных проектов.

Рекомендуемые: