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

Готовый DIY инклинометр на базе Arduino
Введение
Давно хотел сделать свой угломер, и долго выбирал, какой датчик использовать, и наконец нашел – это MPU6050, 3-осевой гироскоп и акселерометр. Это один из самых сложных датчиков для понимания при низкой стоимости, но результат того стоит!
Вы можете спросить: "Зачем делать самому, если можно купить готовый?" И будете правы, но наш самодельный угломер имеет свои преимущества и стоит значительно дешевле самого дешевого аналога из Китая.
Что умеет наш инклинометр?
Отображает угол наклона с высокой точностью, включая отрицательные значения
Графическое изображение положения уровня на OLED-дисплее
Автоматический поворот дисплея при углах более 60° или менее -60°
Буззер оповещает о достижении уровней 0°, 90°, -90°
Преимущества DIY-решения
- Ремонтопригодность: Если через год, два или даже 10 лет что-то перестанет работать – просто меняем неисправный компонент. Разбился дисплей? Не проблема – заменили. Аккумулятор не держит? Тоже легко решается.
- Индивидуальный корпус: Можно создать корпус именно тех размеров, которые вам нужны. Планирую заказать 3D-печать на myproject.com.ua
- Экономичность: Всего 3 основные детали и корпус. Общая стоимость около 600 грн против 2000+ грн за профессиональный угломер.
Необходимые компоненты
Основные компоненты:
Для тестирования:
Для готового изделия:
Схема подключения
Датчик и дисплей подключаются параллельно к шине I2C.

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

Упрощенная схема подключения
⚠️ Важно! Размещение датчика в корпусе:
Нижняя основа платы должна быть жестко закреплена на поверхности параллельно плоскости, по которой будет измеряться угол. Длина платы должна идти вдоль длины угломера.

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

Установка необходимых библиотек в Arduino IDE
#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); }
В коде ничего менять не нужно, все готово к использованию. После загрузки кода на дисплее появится индикация уровня.




Сфера применения
🏗️ Строительство и ремонт
- Проверка уровня стен, полов, потолков
- Монтаж мебели (шкафы, полки, вешалки)
- Установка дверей и окон
- Укладка кафельной плитки
🚗 Автомобильная сфера
- Регулировка развала/схождения колес
- Проверка угла наклона подвески
- Установка автозвукового оборудования
🌾 Сельское хозяйство
- Настройка сельхозтехники
- Проверка уклона теплиц
- Монтаж систем орошения
🔧 DIY проекты
- Установка антенн, спутниковых тарелок
- Выравнивание картин, кронштейнов для ТВ
- Проектирование рамп для скейтбординга
📚 Образование
- Наглядное пособие по физике
- Демонстрация работы акселерометров
- Основы программирования микроконтроллеров
🏕️ Туризм и отдых
- Установка палатки на неровной поверхности
- Проверка уклона велосипедного маршрута
- Крепление снаряжения для альпинизма
© 2025 Мій Проект. Автор: Ardu_miha. Использование материалов разрешено только со ссылкой на источник.
Написать комментарий