Отображение глубины бурения с гироскопическим датчиком
Компоненты и расходные материалы
![]() |
| × | 1 |
Необходимые инструменты и машины
![]() |
|
Приложения и онлайн-сервисы
![]() |
|
Об этом проекте
Если вам необходимо просверлить определенную глубину для проекта, вам понадобится настольное сверло с индикатором глубины. У большинства упражнений на скамью есть линейка со стрелкой для чтения. Успех сверления зависит от того, насколько точно вы сможете прочитать желаемую позицию. В этом проекте Arduino я представляю альтернативное предложение:дисплей глубины бурения с гироскопическим датчиком и 7-сегментный дисплей с поддержкой Arduino.
Станок, который я чаще всего использую в своей мастерской, - это не пила или шлифовальный станок. Это, безусловно, верстак. Вне зависимости от проекта он фактически всегда используется. Если мне нужна определенная глубина сверления, я могу использовать встроенную линейку на станке. И помните, на какую глубину мне нужно сверлить. Это действительно хорошо работает.
Но с возрастом - да, да, да - мне становится все труднее читать глубину с точностью до миллиметра. А если свет недостаточно яркий, прочитать его практически невозможно. Но просто надеть для этого очки? А после сверления где хранить очки? Я еще не так далеко.
Верный девизу Пола Акерса из "2 Secon Lean":
Должно быть лучшее решение, вам просто нужно подумать и принять его.
Возможности измерения
Конечно, я мог бы поставить увеличительное стекло перед шкалой, чтобы линейку было легче читать. Это улучшило бы показания, но не помогло бы то, что мне приходилось запоминать измерения в каждом случае. А если вы занимаетесь рукоделием, это тоже должно быть весело.
Вот почему электронное решение намного лучше. Желательно в небольшом пространстве, чтобы все помещалось рядом с выключателем дрели. В таких случаях мне нравится использовать Arduino Nano. У него достаточно контактов, чтобы контролировать практически все, и, соответственно, он маленький.
Но как измерить глубину сверления? Есть несколько возможностей для измерения длины. Установить ультразвуковое измерение? Может работать, но только с небольшой механикой, которая движется вместе со сверлом в качестве отражающей поверхности. Или использовать энкодер с проводным управлением? Было бы возможно, но очень сложно, если бы вы построили его самостоятельно:с поворотным столом, вилочными световыми барьерами и пружинным возвратом. Лучше сразу взять поворотный энкодер? Это означало бы намного меньше компонентов - да, но это было бы слишком грубо, вам пришлось бы устанавливать шестерни для перевода.
Хорошо, подумай об этом.
У моей дрели, как и у большинства других, есть маховик сбоку для регулировки глубины. Его можно повернуть прим. 270 °. Так что даже не на полный оборот.
Это идеально подходит для измерения угла с помощью гироскопического датчика. Кабельное соединение не перекручивается, требуется только один недорогой компонент. Гироскопический датчик также можно очень легко прикрепить непосредственно к оси вращения маховика.
Концепция
Я всегда действую одним и тем же способом при указании глубины сверления:царапаю поверхность сверлом, записываю координаты, затем добавляю желаемую глубину сверления и, наконец, сверлим, пока глубина не будет достигнута.
Я хотел бы сохранить основной процесс. Чтобы не сверлить слишком глубоко, я хотел бы получать информацию о том, когда будет достигнута глубина бурения.


Эту функцию берет на себя кнопка. Когда вы ее нажимаете, Arduino сохраняет текущую позицию сверления в качестве значения остановки и всегда может напомнить мне о ней, когда она будет достигнута позже.
Остальные компоненты занимают больше места и весят значительно больше. К счастью, корпус моей машины металлический. Вот почему я использую для его крепления неодимовый магнит.
Остается вопрос, как прикрепить датчик к машине?
На оси сверла установлена шестигранная гайка SW17. Так что мне нужен только компонент, напечатанный на 3D-принтере, который принимает датчик и может быть вставлен на шестигранную гайку.

Необходимые компоненты
- Ардуино Нано
- Гироскопический датчик GY-521
- 7-сегментный модуль с 8 цифрами (версия SPI с микросхемой MAX7219)
- Кнопка
- Выключатель.
- Источник питания:зажимы для батареек AA или AAA или внешний аккумулятор.
- Корпус, напечатанный на 3D-принтере
- Неодимовый магнит
Подключение гироскопического датчика
Гиродатчик подключается через I2C. Таким образом, мы должны использовать A5 и A4 для Nano.
- VCC -> 5 В
- GND -> GND
- SCL -> A5
- ПДД -> A4
- XDA -> не подключен
- XCL -> не подключен
- ADO -> не подключен
- INT -> не подключен
7-сегментный модуль
При подключении 7-сегментного модуля можно использовать любой цифровой вывод. Контакты устанавливаются с использованием эскиза Arduino.
- VCC -> 3,3 В
- GND -> GND
- DIN -> D12
- CS -> D10
- CLK -> D11
Кнопка
Входной контакт кнопки также может быть выбран произвольно. Я использую контакт D9.
Источник питания
Для питания я использую 6 батареек АА. После включения / выключения они снабжают электроэнергией всю систему.
Кожух
Я разработал корпус с помощью Autodesk Fusion 360. Я создал 3D-печать с помощью Anycubic i3 Mega.
Неодимовый магнит для крепления к станку приклеен. Если мешает вся индикация глубины сверления, все быстро снимается.
Эскиз Arduino
Я использовал LedControl.h библиотека для управления 7-сегментным дисплеем. Если вы еще не установили их, сначала необходимо установить их с помощью диспетчера библиотек.
Гиродатчик подключается по шине I2C. В поисках возможных библиотек для датчика я решил не использовать их. Связь осуществляется через Wire.h .
В конце статьи вы найдете несколько ссылок, которые помогли мне понять.
Управление 7-сегментным дисплеем очень хорошо работает с LedControl .
После инициализации с помощью контактов процедура настройки требует всего лишь нескольких подготовительных действий, чтобы вывести дисплей из спящего режима и отрегулировать яркость.
В петлевой части дисплей показывает только текущую глубину сверления и, если установлено, положение остановки, также в виде чисел.
Дисплей ожидает каждую цифру как тип символа. Я хотел бы использовать десятичный знак для точности. Функция dtostrf преобразует число с плавающей запятой в массив символов. Затем в строку, чтобы отобразить ее по символам на дисплее.
dtostrf (currentPos, 4,1, txt);
s ='' + String (txt);
lc. setChar (0,4, см. charAt (см. length () -1), false);
lc. setChar (0.5, см. charAt (см. length () -3), true);
lc. setChar (0.6, см. charAt (см. length () -4), false);
lc. setChar (0.7, см. charAt (см. length () -5), false);
Когда достигнуто положение остановки, на дисплее появляется «StOP». Маленький "t" можно создать с помощью setRow процедура и соответствующий битовый шаблон B00001111.
Считывание показаний гироскопа осуществляется через функции библиотеки проводов. Я использую только акселерометр для определения углового положения.
При работе с USB-подключением к Arduino IDE все работало отлично. После отключения и подключения к внешнему источнику питания датчик не выдал никаких данных. Он снова заработал только после перезагрузки Arduino.
Это вызвало у меня самую большую головную боль за весь проект. Можно сказать, что индикатор глубины сверления спас мои глаза, но именно поэтому я вырвал почти все волосы!
После долгих поисков решением стала установка времени ожидания после пробуждения датчика. Это делает задержка (1000) самая важная команда во всем исходном коде.
// подготавливаем датчик GY-521
// используем только данные ускорителя
Wire.begin ();
Wire.beginTransmission (MPU);
Wire .write (0x6B);
Wire.write (0x00); // пробуждаем MPU
Wire.endTransmission (true);
// в моем случае эта задержка была очень необходима!
delay (1000);
Wire.beginTransmission(MPU);
Wire.write (0x1C); // регистрируем ACCEL_CONFIG
Wire.write (0x10); // Устанавливаем 00010000 для диапазона +/- 8g полного диапазона
Wire.endTransmission (true);
Значения смещения должны быть определены для датчика в начале, иначе значения будут колебаться. В части настройки измеряется 100 значений и усредняются отклонения.
Вычислить угол по данным датчика не так просто. Но есть много инструкций, как производить расчеты.
Угол X в градусах рассчитывается по следующей формуле:
AccAngleX =(atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg);
Однако значения датчика ускорения сильно колеблются. Таким образом, текущее рассчитанное значение усредняется с предыдущим значением по 50% каждое.
TotalAngleX =0,5 * TotalAngleX + 0,5 * AccAngleX;
Датчик выводит значения угла от -90 ° до + 90 °. Но мне нужен угол от 0 ° до 360 ° для преобразования в глубину сверления.
Я пока не нашел для этого простого решения. Однако для моего приложения достаточно увидеть, являются ли данные датчика Z и Y положительными или отрицательными. И соответственно преобразовать угол.
delta =0;
if ((AccZ <0)) {
delta =180.0-TotalAngleX * 2.0;
}
if ((AccZ> 0 ) &&(AccY <0)) {
delta =360.0;
}
DrillingMachineAngle =TotalAngleX + delta;
// если около 360 °, отображение лучше 0 °
if (DrillingMachineAngle> 350) {DrillingMachineAngle =0;}
Чего еще не хватает, так это максимально возможного угла поворота, который позволяет маховик. Самый простой способ сделать это - вывести определенный угол через Serial.print и отметить максимальное значение.
Для меня это 316 °. При максимальной глубине сверления 50 мм текущее положение рассчитывается следующим образом:
currentPos =50.0 / 316.0 * DrillingMachineAngle;
Если кнопка нажата, Arduino сохраняет текущую позицию сверления. На дисплее отображается 8888, и происходит короткое ожидание в 1 секунду.
Если задано положение остановки, оставшаяся глубина сверления до упора отображается на правом дисплее.
Сборка и тестирование
Гироскопический датчик лучше всего закрепить с помощью точки горячего клея. Пропустите соединительные кабели через крышку. На этом все.
В первом тесте сначала необходимо отрегулировать гироскопический датчик. Я установил его горизонтально. Поскольку держатель предназначен для вращения, его можно легко регулировать до тех пор, пока на дисплее не отобразится 0,0.






Тогда можно начинать первый тест.
В целом я очень доволен решением. Датчик реагирует очень быстро, и расчетные значения точно соответствуют глубине бурения.
А благодаря большому светодиодному дисплею мне не нужно беспокоиться о очках возрастом до 85 лет, чтобы определить точную глубину сверления.
Так что всегда помните, что говорит Пол:исправляйте ошибки!
Удачи, создавая его!
___________________________________________________________
Некоторые, возможно, полезные ссылки:
https://medium.com/@kavindugimhanzoysa/lets-work-with-mpu6050-gy-521-part1-6db0d47a35e6
или https://playground.arduino.cc/Main/MPU-6050/
или также https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interfacing-with-arduino/
Библиотека GY-521 Роба Тилаарта:https://github.com/RobTillaart/GY521
И посмотрите книгу Пола Эйкерса на https://paulakers.net/books/2-second-lean
Das Projekt gibt es auch auf Deutsch unter:https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/
Код
- Drilling-depth.ino
Drill-depth.ino Arduino
/ * программа:Drilling-depth.ino * автор:Thomas Angielsky * версия:2021-03-20 * * https://techpluscode.de/ * https://techpluscode.de/bohrtiefenanzeige-mit-gyro- sensor / * * этот набросок измеряет глубину сверления настольного сверлильного станка * с использованием данных гироскопического датчика GY-521 * глубина просматривается на 7-сегментном дисплее * * Идея компенсации ошибок вычислений от electronicoobs.com - спасибо! * * / # include#include #include "LedControl.h" #define MPU 0x68char txt [8]; String s; float currentPos, stopPos; float rad_to_deg; float AccX, AccY, AccZ; float AccAngleX, AccAngleY; float AccAngleErrorX, AccAngleErrorY; float TotalAngleX, TotalAngleY; float DrillingMachineAngle, delta; // светодиоды инициализации:вывод D12, вывод D11, вывод D10, 1 moduleLedControl lc =LedControl (12,11,10,1); void setup () {// подготавливаем последовательное соединение / /Serial.begin(9600); // начальные значения stopPos =0.0; currentPos =0,0; rad_to_deg =180 / PI; // подготавливаем датчик GY-521 // используем только данные ускорителя Wire.begin (); Wire.beginTransmission (MPU); Wire.write (0x6B); Wire.write (0x00); // пробуждаем MPU Wire.endTransmission (true); // в моем случае эта задержка была очень нужна! задержка (1000); Wire.beginTransmission (MPU); Wire.write (0x1C); // регистрируем ACCEL_CONFIG Wire.write (0x10); // Устанавливаем 00010000 для диапазона +/- 8g полного диапазона Wire.endTransmission (true); // вычисляем ошибку данных ускорителя // делаем 100 измерений для (int a =0; a <100; a ++) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (ложь); Wire.requestFrom (MPU, 6, истина); AccX =(Wire.read () <<8 | Wire.read ()) / 4096.0; AccY =(Wire.read () <<8 | Wire.read ()) / 4096.0; AccZ =(Wire.read () <<8 | Wire.read ()) / 4096.0; AccAngleErrorX =AccAngleErrorX + ((atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg)); // AccAngleErrorY =AccAngleErrorY + ((atan (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * rad_to_deg)); } AccAngleErrorX =AccAngleErrorX / 100; // AccAngleErrorY =AccAngleErrorY / 100; // подготовка кнопки:вывод D9 pinMode (9, INPUT_PULLUP); // подготавливаем 7-сегментный дисплей lc.shutdown (0, false); lc.setIntensity (0,8); lc.clearDisplay (0);} void loop () {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (ложь); Wire.requestFrom (MPU, 6, истина); AccX =(Wire.read () <<8 | Wire.read ()) / 4096.0; AccY =(Wire.read () <<8 | Wire.read ()) / 4096.0; AccZ =(Wire.read () <<8 | Wire.read ()) / 4096.0; AccAngleX =(atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg) -AccAngleErrorX; // AccAngleY =(atan (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * rad_to_deg) -AccAngleErrorY; // сглаживаем значения TotalAngleX =0,5 * (TotalAngleX) + 0,5 * AccAngleX; //TotalAngleY=0.5*(TotalAngleY)+0.5*AccAngleY; // вычислить угол x до 360, используя +/- от X, Y, Z delta =0; если ((AccZ <0)) {delta =180.0-TotalAngleX * 2.0; } если ((AccZ> 0) &&(AccY <0)) {delta =360.0; } DrillingMachineAngle =TotalAngleX + delta; // если около 360, лучше отобразить 0 if (DrillingMachineAngle> 350) {DrillingMachineAngle =0;} // вычислить глубину сверления // максимальная глубина сверления:50 мм (измерено на станке) // максимальный угол маховика:316 (измерено с данными Serial.print) currentPos =50.0 / 316.0 * DrillingMachineAngle; / * Serial.print ("X / X / Y / Z / E:BOHRTIEFE"); Serial.print (TotalAngleX); Serial.print (""); Serial.print (AccX); Serial.print (""); Серийный принт (AccY); Serial.print (""); Серийный принт (AccZ); Serial.print (">>"); Serial.print (DrillingMachineAngle); Serial.print (">>"); Serial.print (currentPos); Serial.println (""); * / // кнопка нажата? if (digitalRead (9) ==LOW) {// сохранить позицию остановки stopPos =currentPos; lc.setChar (0,3, '8', ложь); lc.setChar (0,2, '8', ложь); lc.setChar (0,1, '8', ложь); lc.setChar (0,0, '8', ложь); //Serial.println("Кнопка нажата "); задержка (1000); } if (stopPos> 0) {// достигнута стоповая позиция? if (currentPos> =stopPos) {// да:отображать STOP (5t0P) справа lc.setChar (0,3, '5', false); lc.setRow (0,2, B00001111); lc.setChar (0,1, '0', ложь); lc.setChar (0,0, 'P', ложь); } else {// no:отображаем расстояние до позиции остановки dtostrf (stopPos-currentPos, 4,1, txt); s ='' + строка (txt); lc.setChar (0,0, s.charAt (s.length () - 1), false); lc.setChar (0,1, s.charAt (s.length () - 3), true); lc.setChar (0,2, s.charAt (s.length () - 4), false); lc.setChar (0,3, s.charAt (s.length () - 5), false); }} else {// ничего не отображать lc.setChar (0,3, '', false); lc.setChar (0,2, '', ложь); lc.setChar (0,1, '', ложь); lc.setChar (0,0, '', ложь); } // отображаем текущую глубину сверления слева // форматируем как строку dtostrf (currentPos, 4,1, txt); s ='' + строка (txt); lc.setChar (0,4, s.charAt (s.length () - 1), false); lc.setChar (0,5, s.charAt (s.length () - 3), true); lc.setChar (0,6, s.charAt (s.length () - 4), false); lc.setChar (0,7, s.charAt (s.length () - 5), false); задержка (200);}
Изготовленные на заказ детали и корпуса
Drilling-depth-3d-model_Yn2q0MSNa4.zipСхема

Производственный процесс
- Интеграция данных датчика с микропроцессором Raspberry Pi
- Датчик отслеживания линии с RPi
- API датчика окружающей среды с RPi
- Аэропоника с Raspberry Pi и датчиком влажности
- Raspberry Pi GPIO с датчиком движения PIR:Лучшее руководство
- Использование импульсного радиолокационного датчика A111 с Raspberry Pi
- Взаимодействие датчика движения HC-SR501 PIR с Raspberry Pi
- Регистратор датчиков Python / MicroPython с Google Таблицами
- Датчик Portenta и термопары (с MAX6675)
- Устройство измерения расхода воздуха под давлением с аналоговым датчиком