Каталог товаров
Клиенту
Тема сайта:
+38 (066) 305-77-25
Наш адрес
Харьков, времено - только доставка Новой Почтой, УкрПочтой, МистЕкспрес, ROZETKA Delivery
Телефоны:
Время работы
  • Пн-Пт: с 9 до 18
  • Сб.: с 10 до 17
  • Вс: с 11 до 16
E-mail
Мы в соцсетях
Перейти в контакты
0 0
Каталог
Главная
Закладки
0
Сравнить
0
Контакты

Diy Инклинометр (Угломер)

Чи була корисною ця стаття?
Diy Инклинометр (Угломер)

DIY Инклинометр (Угломер)

Прибор для измерения угла наклона различных объектов относительно гравитационного поля Земли

DIY Инклинометр

Готовый DIY инклинометр на базе Arduino

Введение

Давно хотел сделать свой угломер, и долго выбирал, какой датчик использовать, и наконец нашел – это MPU6050, 3-осевой гироскоп и акселерометр. Это один из самых сложных датчиков для понимания при низкой стоимости, но результат того стоит!

Вы можете спросить: "Зачем делать самому, если можно купить готовый?" И будете правы, но наш самодельный угломер имеет свои преимущества и стоит значительно дешевле самого дешевого аналога из Китая.

Что умеет наш инклинометр?

📐 Точный замер

Отображает угол наклона с высокой точностью, включая отрицательные значения

🖼️ Визуализация

Графическое изображение положения уровня на OLED-дисплее

🔄 Автоповорот

Автоматический поворот дисплея при углах более 60° или менее -60°

🔊 Звуковая индикация

Буззер оповещает о достижении уровней 0°, 90°, -90°

Преимущества DIY-решения

  • Ремонтопригодность: Если через год, два или даже 10 лет что-то перестанет работать – просто меняем неисправный компонент. Разбился дисплей? Не проблема – заменили. Аккумулятор не держит? Тоже легко решается.
  • Индивидуальный корпус: Можно создать корпус именно тех размеров, которые вам нужны. Планирую заказать 3D-печать на myproject.com.ua
  • Экономичность: Всего 3 основные детали и корпус. Общая стоимость около 600 грн против 2000+ грн за профессиональный угломер.

Необходимые компоненты

Схема подключения

Датчик и дисплей подключаются параллельно к шине I2C.

Схема подключения

Детальная схема подключения компонентов

Упрощенная схема

Упрощенная схема подключения

⚠️ Важно! Размещение датчика в корпусе:

Нижняя основа платы должна быть жестко закреплена на поверхности параллельно плоскости, по которой будет измеряться угол. Длина платы должна идти вдоль длины угломера.

Пример корпуса

Пример корпуса для угломера

Скетч Arduino

Перед загрузкой необходимо установить библиотеки для работы с дисплеем и датчиком:

Установка библиотек

Установка необходимых библиотек в Arduino IDE

Arduino Code
#include 
#include 
#include 
#include 

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define LED_PIN 2        
#define BLINK_DELAY 100  

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MPU6050 mpu;

#define LINE_LENGTH 37
#define CENTER_LINE_LENGTH 30

enum RotationState {
  NORMAL,
  RIGHT_90,
  LEFT_90
};
RotationState currentRotation = NORMAL;

bool wasAtTargetAngle = false;
unsigned long lastBlinkTime = 0;
byte blinkCount = 0;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  pinMode(LED_PIN, OUTPUT);  
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("Ошибка инициализации OLED");
    while(1);
  }
  
  display.clearDisplay();
  display.display();
  
  if (!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) {
    Serial.println("MPU6050 не найден!");
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 20);
    display.println("MPU6050");
    display.display();
    while (1);
  }
  
  mpu.setAccelPowerOnDelay(3);
  
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(20, 25);
  display.println("Готово");
  display.display();
  delay(1000);
}

void blinkLED() {
  if (millis() - lastBlinkTime >= BLINK_DELAY) {
    lastBlinkTime = millis();
    
    if (blinkCount < 4) { 
      digitalWrite(LED_PIN, !digitalRead(LED_PIN));
      blinkCount++;
    } else {
      digitalWrite(LED_PIN, LOW); 
    }
  }
}

void drawLevelIndicator(float angle) {
  display.clearDisplay();
  
  int leftX, rightX, centerY;
  if (currentRotation == NORMAL) {
    leftX = 20;
    rightX = 108;
    centerY = 22;
  } else {
    leftX = 32;
    rightX = 96;
    centerY = 44;
  }

  if (currentRotation == NORMAL) {
    display.drawFastHLine(leftX - LINE_LENGTH/2, centerY, LINE_LENGTH, WHITE);
    display.drawFastHLine(rightX - LINE_LENGTH/2, centerY, LINE_LENGTH, WHITE);
  } else {
    display.drawFastVLine(leftX, centerY - LINE_LENGTH/2, LINE_LENGTH, WHITE);
    display.drawFastVLine(rightX, centerY - LINE_LENGTH/2, LINE_LENGTH, WHITE);
  }

  float angle_rad = radians(angle);
  int x1, y1, x2, y2;
  
  if (currentRotation == NORMAL) {
    x1 = SCREEN_WIDTH/2 - CENTER_LINE_LENGTH/2 * cos(angle_rad);
    y1 = centerY - CENTER_LINE_LENGTH/2 * sin(angle_rad);
    x2 = SCREEN_WIDTH/2 + CENTER_LINE_LENGTH/2 * cos(angle_rad);
    y2 = centerY + CENTER_LINE_LENGTH/2 * sin(angle_rad);
  } else if (currentRotation == RIGHT_90) {
    x1 = SCREEN_WIDTH/2 + CENTER_LINE_LENGTH/2 * sin(angle_rad);
    y1 = centerY - CENTER_LINE_LENGTH/2 * cos(angle_rad);
    x2 = SCREEN_WIDTH/2 - CENTER_LINE_LENGTH/2 * sin(angle_rad);
    y2 = centerY + CENTER_LINE_LENGTH/2 * cos(angle_rad);
  } else { 
    x1 = SCREEN_WIDTH/2 - CENTER_LINE_LENGTH/2 * sin(angle_rad);
    y1 = centerY + CENTER_LINE_LENGTH/2 * cos(angle_rad);
    x2 = SCREEN_WIDTH/2 + CENTER_LINE_LENGTH/2 * sin(angle_rad);
    y2 = centerY - CENTER_LINE_LENGTH/2 * cos(angle_rad);
  }
  
  display.drawLine(x1, y1, x2, y2, WHITE);

  display.setTextSize(2);
  if (currentRotation == NORMAL) {
    display.setCursor(55, 48);
  } else {
    display.setCursor(12, 10);
  }
  display.print(angle, 0);
  display.print((char)247);
}

void loop() {
  Vector rawAccel = mpu.readRawAccel();
  float accel_angle_x = atan2(rawAccel.YAxis, rawAccel.ZAxis) * 180 / PI;
  
  bool atTargetAngle = (abs(accel_angle_x) < 1.0) || 
                      (abs(accel_angle_x + 90) < 3.0) || 
                      (abs(accel_angle_x - 90) < 3.0);
  
  if (atTargetAngle) {
    if (!wasAtTargetAngle) {
      blinkCount = 0;
      lastBlinkTime = millis();
      digitalWrite(LED_PIN, HIGH); 
      blinkCount++;
    }
    blinkLED();
  } else {
    digitalWrite(LED_PIN, LOW); 
    blinkCount = 0;
  }
  wasAtTargetAngle = atTargetAngle;
  
  
  if (accel_angle_x < -60 && currentRotation != RIGHT_90) {
    currentRotation = RIGHT_90;
    display.setRotation(1); 
  } else if (accel_angle_x > 60 && currentRotation != LEFT_90) {
    currentRotation = LEFT_90;
    display.setRotation(3); 
  } else if (abs(accel_angle_x) <= 60 && currentRotation != NORMAL) {
    currentRotation = NORMAL;
    display.setRotation(0); 
  }

  drawLevelIndicator(accel_angle_x);
  display.display();
  
  delay(80); 
}

В коде ничего менять не нужно, все готово к использованию. После загрузки кода на дисплее появится индикация уровня.

Работа прибора 1
Работа прибора 2
Работа прибора 3
Работа прибора 4

Сфера применения

🏗️ Строительство и ремонт

  • Проверка уровня стен, полов, потолков
  • Монтаж мебели (шкафы, полки, вешалки)
  • Установка дверей и окон
  • Укладка кафельной плитки

🚗 Автомобильная сфера

  • Регулировка развала/схождения колес
  • Проверка угла наклона подвески
  • Установка автозвукового оборудования

🌾 Сельское хозяйство

  • Настройка сельхозтехники
  • Проверка уклона теплиц
  • Монтаж систем орошения

🔧 DIY проекты

  • Установка антенн, спутниковых тарелок
  • Выравнивание картин, кронштейнов для ТВ
  • Проектирование рамп для скейтбординга

📚 Образование

  • Наглядное пособие по физике
  • Демонстрация работы акселерометров
  • Основы программирования микроконтроллеров

🏕️ Туризм и отдых

  • Установка палатки на неровной поверхности
  • Проверка уклона велосипедного маршрута
  • Крепление снаряжения для альпинизма

Желаю вам держать уровень не только при замерах вместе с myproject.com.ua

Автор: Ardu_miha

© 2025 Мій Проект. Автор: Ardu_miha. Использование материалов разрешено только со ссылкой на источник.

Рекомендуемые товары
Похожие статьи
Мой АмперМетр
Мой АмперМетр
Блог, Инструкции Подключения и Обзоры
14 апреля
Давай измерим "его"!
Давай измерим "его"!
Блог, Инструкции Подключения и Обзоры, Интересное и Полезное
20 мая
RFID та зачинена шухлядка
RFID та зачинена шухлядка
Блог, Интересное и Полезное
22 мая