Статьи » Разработки |
2021-01-21 в 21:50 (последнее изменение 2023-11-09 в 11:16)
Роботам, машинам, беспилотным транспортным средствам для ориентирования на местности необходимо некое приспособление, чтобы они могли самостоятельно маневрировать. Разные устройства используют для этого различные типы датчиков, но чаще используется магнитометр, который может сообщить роботу, в каком географическом направлении он сейчас смотрит. Это не только помогает определить направление, но и передвигаться в заданную сторону. В этой статье попробуем разобраться, как работает датчик магнитометра, и как он может взаимодействовать с микроконтроллером, таким как Arduino. Опишем как создать цифровой компас, который поможет определять направления, и светодиодом укажет направление на север. Необходимые материалы
Что такое магнитометр и как он работает? Как работает модуль датчика QMC5883L Поскольку датчик работает, считывая магнитное поле, на выходные значения сильно повлияет находящиеся рядом металлы, устройства т.д.. Следует проявлять осторожность, чтобы не приближать к нему магниты, поскольку их сильное магнитное поле может вызвать ложные значения на датчике. Разница между HMC5883L и QMC5883L Чтобы узнать, какая у вас модель датчика, вам просто нужно внимательно посмотреть на саму микросхему и прочитать, что на ней написано. Если написано что-то вроде L883, то это HMC58836L, а если написано что-то вроде DA5883, то это IC QMC5883L. Оба модуля показаны на рисунке ниже. Схема цифрового компаса Модуль датчика имеет 5 контактов, из которых DRDY (Data Ready) не используется в нашем проекте, поскольку мы работаем с датчиком в постоянном режиме. Вывод Vcc и заземления используется для питания модуля напряжением 5 В от платы Arduino. SCL и SDA - это линии шины связи I2C, которые подключены к контактам A4 и A5 I2C Arduino Pro mini соответственно. Поскольку в самом модуле есть резистор с высоким сопротивлением на линиях, нет необходимости добавлять их извне. Изготовление печатных плат для цифрового компаса Скачать файл Gerber для печатной платы цифрового компаса Она разработана в виде двухсторонней платы. Arduino размещается на нижней стороне печатной платы. Зайдите на сайт https://www.pcbway.ru/, зарегистрируйтесь, если вы впервые. Затем на вкладке "Моментальный расчет стоимости платы" введите размеры вашей печатной платы, количество слоев и количество требуемых печатных плат. Размер моей печатной платы 8 см × 8 см, поэтому вкладка выглядит так, как показано ниже. В большинстве случаев значений по умолчанию будет достаточно. Единственное, что я обычно меняю, это толщина платы. Ставлю 1,2 мм. Так мне кажется лучше выглядит. Еще маску делаю синего цвета. Но тут уже как нравится. Последний шаг - загрузка файлов Gerber. В случае если загруженные файлы не подойдут, вам будет об этом сказано или менеджер компании напишет что необходимо внести изменения в файлы. Однако в процессе заказа вы можете посмотреть как выглядит ваша плата. Ребята из PCBway сделали специальный онлайн сервис для проверки плат. Сборка печатной платы Включаем паяльник и приступаем к сборке платы. Поскольку посадочные места, контактные площадки, переходные отверстия и шелкография идеально подходят по форме и размеру, у меня не было проблем со сборкой платы. Плата была готова всего за 10 минут с момента распаковки коробки. Ниже представлены некоторые фотографии платы после пайки. Программирование Arduino Полный код проекта «Цифровой компас» можно найти в конце статьи. Вы можете напрямую загрузить его на свою плату после включения библиотеки, и она готова к работе. Но если вы хотите узнать подробнее о самом коде, читайте дальше. Мы используем микросхему QMC5883, для связи с ней нам необходимо знать адрес I2C ее регистров, который можно найти в таблице данных. Но, к счастью для нас, все это уже сделано и упаковано в виде библиотеки парнем по имени keepworking на Github. Поэтому все, что вам нужно сделать, это просто загрузить библиотеку для QMC5883, щелкнув ссылку, чтобы получить ZIP-файл. Затем этот ZIP-файл можно добавить в вашу Arduino IDE, выполнив Sketch -> Include Library -> Add .ZIP library. Библиотека MechaQMC5883 - скачать Код
#include <Wire.h> //Wire Librarey for I2C communication
#include <MechaQMC5883.h> //QMC5883 Librarey is added since mine is QMC5883 and not HMC5883 В следующей строке мы создаем имя объекта для используемого датчика. Я использовал имя qmc, но это может быть что угодно. Код
MechaQMC5883 qmc; //Create an object name for the sensor, I have named it as qmc
Далее переходим к объявлениям глобальных переменных. Здесь, поскольку у нас есть 8 светодиодов в качестве выходов, трудно ссылаться на каждый через имя контакта, поэтому мы используем параметр массива для ссылки на все светодиоды. Имя массива - ledPins, а переменная led_count - это количество светодиодов, которые у нас есть. Начинается с 0. Код
int ledPins[] = {2,3,4,5,6,7,8,9}; //Array of output pin to which the LED is connected to
char led_count = 7; //Total number of LED pins Внутри функции настройки void мы также инициализируем связь I2C, последовательную связь и датчик. Затем мы объявляем все выводы светодиодов как выходные выводы. Поскольку мы использовали массив, легко ссылаться на все контакты, используя цикл for и перемещаясь по циклу for, как показано ниже. Код
void setup() {
Wire.begin(); //Begin I2C communication Serial.begin(9600); //Begin Serial Communication qmc.init(); //Initialise the QMC5883 Sensor</p> <p> for (int thisPin=0; thisPin <= led_count; thisPin++){ //Navigate through all the pins in array pinMode(ledPins[thisPin],OUTPUT); //Declare them as output } } В цикле main, мы должны получить значения x, y и z от датчика и вычислить градус, на которой датчик указывает в данный момент. Чтобы прочитать значения x, y и z, используйте следующую строку Код
int x,y,z;
qmc.read(&x,&y,&z); //Get the values of X,Y and Z from sensor Формулы для расчета курса в градусах показаны ниже. Поскольку мы не собираемся вращать компас по оси z, можно не принимать это значение во внимание. Эта формула может использоваться только в том случае, если плоская поверхность ИС обращена вверх, как в нашей установке. После расчета курса значение будет в диапазоне от -180 до 180, которое мы должны преобразовать в 0 - 360, как и во всех цифровых компасах. Код
int heading=atan2(x, y)/0.0174532925; //Calculate the degree using X and Y parameters with this formulae
//Convert result into 0 to 360 if(heading < 0) heading+=360; heading = 360-heading; Последний шаг - зажечь светодиод, указывающий в СЕВЕРНОМ направлении. Для этого у нас есть серия операторов if, в которых мы проверяем, в каком диапазоне сейчас находится градус, и в соответствии с этим включаем светодиод. Код показан ниже Код
//Based on the value of heading print the result for debugging and glow the respective LED.
if (heading > 338 || heading < 22) { Serial.println("NORTH"); digitalWrite(ledPins[0],HIGH); } Код
if (heading > 22 && heading < 68)
{ Serial.println("NORTH-EAST"); digitalWrite(ledPins[7],HIGH); } if (heading > 68 && heading < 113) { Serial.println("EAST"); digitalWrite(ledPins[6],HIGH); } if (heading > 113 && heading < 158) { Serial.println("SOUTH-EAST"); digitalWrite(ledPins[5],HIGH); } if (heading > 158 && heading < 203) { Serial.println("SOUTH"); digitalWrite(ledPins[4],HIGH); } if (heading > 203 && heading < 248) { Serial.println("SOTUH-WEST"); digitalWrite(ledPins[3],HIGH); } if (heading > 248 && heading < 293) { Serial.println("WEST"); digitalWrite(ledPins[2],HIGH); } if (heading > 293 && heading < 338) { Serial.println("NORTH-WEST"); digitalWrite(ledPins[1],HIGH); } Закономерность значений кода можно понять, изучив таблицу ниже. По сути, мы вычисляем, в каком направлении смотрим, прогнозируем направление на север и включаем соответствующий светодиод.
Последняя часть программы - установить, как быстро должен обновляться результат. Мы сделали задержку на 500 миллисекунд, а затем заставили все светодиоды выключиться, чтобы снова начать работу с первого внутри пустого цикла. Но если вам нужны более быстрые обновления, вы можете уменьшить задержку. Код
delay(500); // update position of LED for every alf seconds
//Turn off the all the LED for (int thisPin=0; thisPin <= led_count; thisPin++){ digitalWrite(ledPins[thisPin],LOW); } Тестирование цифрового компаса Можно поворочать плату и проверить, указывает ли по-прежнему светодиод на север. После этого вы можете в любое время использовать батарею 9 В для питания кмопаса и проверки направления, в котором смотрите. Надеемся, вам понравилось это руководство и вы узнали из него что-то полезное. А еще у меня остались несколько штук таких плат. Кому нужны, обращайтесь. Код
/*
* Program for Arduino Digital Compass using QMC5883 * Project by: Aswinth Raj * Dated: 1-11-2018 * Lib. from https://github.com/keepworking/Mecha_QMC5883L * WARNING: This code works only for QMC5883 Sensor which is commonly being sold as HMC5883 read article to find the actual name of the sensor you have. */ #include <Wire.h> //Wire Librarey for I2C communication #include <MechaQMC5883.h> //QMC5883 Librarey is added since mine is QMC583 and not HMC5883 MechaQMC5883 qmc; //Create an object name for the snsor, I have named it as qmc int ledPins[] = {2,3,4,5,6,7,8,9}; //Array of output pin to which the LED is connected to char led_count = 7; //Total number of LED pins void setup() { Wire.begin(); //Begin I2C communication Serial.begin(9600); //Begin Serial Communication qmc.init(); //Initialise the QMC5883 Sensor for (int thisPin=0; thisPin <= led_count; thisPin++){ //Navigate through all the pins in array pinMode(ledPins[thisPin],OUTPUT); //Declare them as output } } void loop() { //Infinite Loop int x,y,z; qmc.read(&x,&y,&z); //Get the values of X,Y and Z from sensor int heading=atan2(x, y)/0.0174532925; //Calculate the degree using X and Y parameters with this formulae //Convert result into 0 to 360 if(heading < 0) heading+=360; heading = 360-heading; Serial.println(heading); //Print the value of heading in degree for debugging </p> <p>//Based on the value of heading print the result for debugging and glow the respective LED. if (heading > 338 || heading < 22) { Serial.println("NORTH"); digitalWrite(ledPins[0],HIGH); } if (heading > 22 && heading < 68) { Serial.println("NORTH-EAST"); digitalWrite(ledPins[7],HIGH); } if (heading > 68 && heading < 113) { Serial.println("EAST"); digitalWrite(ledPins[6],HIGH); } if (heading > 113 && heading < 158) { Serial.println("SOUTH-EAST"); digitalWrite(ledPins[5],HIGH); } if (heading > 158 && heading < 203) { Serial.println("SOUTH"); digitalWrite(ledPins[4],HIGH); } if (heading > 203 && heading < 248) { Serial.println("SOTUH-WEST"); digitalWrite(ledPins[3],HIGH); } if (heading > 248 && heading < 293) { Serial.println("WEST"); digitalWrite(ledPins[2],HIGH); } if (heading > 293 && heading < 338) { Serial.println("NORTH-WEST"); digitalWrite(ledPins[1],HIGH); } delay(500); // update position of LED for every alf seconds //Turn off the all the LED for (int thisPin=0; thisPin <= led_count; thisPin++){ digitalWrite(ledPins[thisPin],LOW); } }
Посмотрите еще эти статьи
Управляем вытяжкой на кухне пультом от телевизора на Arduino Вывод картинки на дисплей 128x64 Детектор микронаушников Ethernet shield w5100 таймер включения на веб странице Вывод различных данных на дисплей LCD 128x64 Подключение датчиков газа и дыма серии MQ к Arduino Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте. Так же у нас есть Telegram канал. Вам понравился наш материал? Поделитесь с коллегами! Просмотров: 7047. Оценка статьи: 5.0 из 5. Уже оценило 1 читатель |
Всего комментариев: 0 | |