Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Отображение глубины бурения с гироскопическим датчиком

Компоненты и расходные материалы

Arduino Nano R3
× 1

Необходимые инструменты и машины

3D-принтер (общий)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Если вам необходимо просверлить определенную глубину для проекта, вам понадобится настольное сверло с индикатором глубины. У большинства упражнений на скамью есть линейка со стрелкой для чтения. Успех сверления зависит от того, насколько точно вы сможете прочитать желаемую позицию. В этом проекте 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

Схема


Производственный процесс

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