Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-23 15:05
Привет! В этом руководстве вы увидите, как создать цифровой компас, используя 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 (данные); // Преобразование строкового значения в значение с плавающей запятой}
Надеюсь, вам понравится этот проект. Если это так, вы также можете посетить мой веб-сайт, чтобы увидеть больше интересных проектов.
Рекомендуемые:
Управляемый по MIDI шаговый двигатель с микросхемой прямого цифрового синтеза (DDS): 3 шага
Управляемый по MIDI шаговый двигатель с микросхемой прямого цифрового синтеза (DDS): Вы когда-нибудь задумывались о том, что вам ПРОСТО нужно было превратить в мини-проект? Ну, я играл с наброском, который я сделал для Arduino Due, предназначенным для создания музыки с модулем прямого цифрового синтеза (DDS) AD9833 … и в какой-то момент я подумал & q
Учебное пособие по интерфейсу датчика компаса HMC5883L с Arduino: 10 шагов (с изображениями)
Учебное пособие по взаимодействию с датчиком компаса HMC5883L с Arduino: Описание HMC5883L - это 3-осевой цифровой компас, используемый для двух основных целей: для измерения намагниченности магнитного материала, такого как ферромагнетик, или для измерения силы и, в некоторых случаях, направления магнитное поле в точке в с
Создание цифрового эскиза: 4 шага
Etch a Sketch Digital: La cantidad de horas que habré pasado de pequeño intentando pintar una casita en el Etch A Sketch (o telesketch, como se conocía en España). Todo iba bien hasta que intentaba hacer las diagonales del techo. Como se puede ver en la segunda images, es
Проект цифрового кодового замка Arduino с использованием матричной клавиатуры: 9 шагов
Проект цифрового кодового замка Arduino с использованием матричной клавиатуры: создайте устройство цифрового кодового замка с системой Arduino и Qwiic, используя Zio M Uno и матричную клавиатуру Hex 4x3. Обзор проекта Для этого проекта мы создадим простой цифровой кодовый замок, который пользователи могут вводить и нажимать дюйм. В этом уроке мы покажем использование
Горелка с питанием от USB! Этот проект может прожечь пластик / дерево / бумагу (веселый проект также должен быть очень качественным деревом): 3 шага
Горелка с питанием от USB! Этот проект может прожечь пластик / дерево / бумагу (забавный проект также должен быть из очень хорошего дерева): НЕ ДЕЛАЙТЕ ЭТО С ПОМОЩЬЮ USB !!!! я узнал, что это может повредить ваш компьютер из всех комментариев. мой компьютер в порядке. Используйте зарядное устройство для телефона на 600 мА, 5 В. Я использовал это, и он отлично работает, и ничего не может быть повреждено, если вы воспользуетесь предохранительной вилкой, чтобы отключить питание