224   221     15   57    
02.04.2019   Уроки   Теги статьи #, #

Делаем компас на основе Ардуино своими руками

Мы все знаем, что такое компас и для чего он используется. Компас сообщает нам направления, то есть 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-файл (в архиве):

На этом процесс создания компаса на основе Ардуино завершен. Желаем вам удачных проектов.

Ардуино+