Мы все знаем, что такое компас и для чего он используется. Компас сообщает нам направления, то есть E-W-N-S (восток-запад-север-юг). Традиционный компас работает с магнитной иглой. Северный полюс иглы всегда указывает на географический северный полюс Земли с магнитным югом.
Датчик, который мы используем, MPU9250 имеет магнитометр, который может измерять магнитную интенсивность в заданном направлении. Ограничимся только осями X и Y, чтобы немного упростить задачу.
Комплектующие
Список компонентов для создания компаса на основе Ардуино довольно небольшой:
- Простой Ардуино (Arduino Nano в нашем случае),
- MPU 9250 IC
- OLED-дисплей для вывода данных.
MPU 9250 на Ali Express стоит примерно $3,5 доллара. Это не самая дешевая IC, но уровень шума был значительно ниже, рекомендуем. Также нужно понимать, что нет ничего особенного в выборе Arduino или основы для нашего устройства. К тому же в нашем случае Arduino является клоном и прекрасно работает. А корпус вы можете сделать вообще на свое усмотрение.
Конструкция
В качестве основного корпуса берем простой кусок древесины и обрезаем ее примерно до 10 см. Затем мы отмечаем два отверстия по длине IC. Важно, чтобы вы правильно установили IC. Если вы сделали что-то не так, пожалуйста, используйте другую сторону или даже лучше, используйте другой кусок дерева. Не пытайтесь исправить кривое отверстие. Винт может плохо удерживать плату в таком случае. В целом процесс создания конструкции компаса Ардуино можно увидеть на фото выше.
Соединения
С протоколом I2C схема соединения в нашем компасе будет несложной, делаем соединения следующим образом:
SDA <--> A4
SCl <--> A5
VCC <--> 5V
GND <--> GND
Убедитесь, что проводные соединения надежны и исправны. Убедитесь, что вы использовали достаточную длину провода.
Код для компаса
Скопировать или скачать код компаса Ардуино вы можете ниже:
#include <Adafruit_SSD1306.h> #include "MPU9250.h" // an MPU9250 object with the MPU-9250 sensor on I2C bus 0 with address 0x68 MPU9250 IMU(Wire,0x68); #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); int status; int i; float u,ux,uy,temp; float k; void setup() { // serial to display data Serial.begin(115200); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); while(!Serial) {} // start communication with IMU status = IMU.begin(); if (status < 0) { Serial.println("IMU initialization unsuccessful"); Serial.println("Check IMU wiring or try cycling power"); Serial.print("Status: "); Serial.println(status); while(1) {} } // setting the accelerometer full scale range to +/-8G IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G); // setting the gyroscope full scale range to +/-500 deg/s IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS); // setting DLPF bandwidth to 20 Hz IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ); // setting SRD to 19 for a 50 Hz update rate IMU.setSrd(19); display.setTextColor(WHITE); display.setTextSize(2); } void loop() { temp=0; for(i=0;i<10;i++) { IMU.readSensor(); // display the data Serial.print(ux=IMU.getMagX_uT()-36+1.5); Serial.print(" "); Serial.println(uy=IMU.getMagY_uT()-48+7.5); ux=-ux; u=(ux*ux+uy*uy); u=pow(u,.5); k=asin(uy/u)/3.141*180; if(ux<0) { if(uy>0) { k=180-k; } else { k=-180-k; } } //Serial.println(k); temp=temp+k; delay(30); } k=temp/10.0; display.clearDisplay(); display.setCursor(0,0); display.println(k); display.print(" w.r.t E"); display.display(); }
Стоит сказать, что предварительно нужно установить библиотеку MPU9250, которые вы можете взять на GitHub по этой ссылке.
Взглянув на серийный монитор, стало ясно, что значения были не в фазе. После некоторого тестирования, наконец, получилось произвести приличную синусоидальную функцию. Ниже вы можете увидеть её, скачав Excel-файл (в архиве):
На этом процесс создания компаса на основе Ардуино завершен. Желаем вам удачных проектов.