Work in Progress: самодельный микро ЧПУ-робот для заточки фрез и свёрл

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!


В программировании достаточно много прикладных задач, которые напрямую связаны с разработкой физических устройств, на основе микроконтроллеров.

В этой статье мы поговорим об одной моей задумке, которую я вынашиваю достаточно давно и приступил в данный момент к её реализации — ЧПУ робот для заточки фрез и свёрл.

Сразу скажу, что ничего подобного (несмотря на достаточно напряжённые поиски) — я никогда не встречал. Ни в российском сегменте интернета, ни в мировом. Так что, не удивлюсь, если подобный аппарат, с теми характеристиками, которые рассматриваются ниже — будет первым в мире!

Уже достаточно давно меня привлекает область программирования, которая позволяет создавать нечто ощутимое, так как в результате создаётся реальное физическое устройство, и ты можешь потрогать руками «результат работы своего кривого кода» :-В.

В тех областях, где происходит всё практически полностью виртуально, — видоизменяются какие-то переменные, происходят какие-то процессы, что-то куда-то пересылается и всё это виртуально, скрыто за экраном, — мне в этом не хватает жизни как бы, что ли… Слишком всё виртуально. Хочется, чтобы концепция вышла в жизнь и ожила…

Некоторое время назад, мне пришла в голову идея создать некое ЧПУ устройство, которое позволит достаточно легко и быстро, с повторяемым качеством, затачивать свёрла и фрезы.

Почему мне пришла эта идея: так как у меня есть свой личный токарный станок по металлу (ТВ-16), мне периодически приходится заниматься заточкой указанных металлорежущих инструментов. Несмотря на то что я, в принципе, умею это делать, результат отличается «разной степенью кривизны» и гуляет от раза к разу. Кроме того, это достаточно муторная и сложная работа, требующая максимальной собранности и внимательности.

Я подумал: «программисты мы или где?!»

Человек, который плохо знает эту сферу, может, по своему незнанию, сказать «иди купи с али трёхкопеечную точилку для свёрл и успокойся!»

И тут ему придётся ответить: тю! Свёрла ещё полбеды, — а вот если мы обратимся к фрезам и вопросу их заточки: каждого пера на конце, а также боковой поверхности ленточки — «вечер резко перестанет быть томным»:



Заточить подобное, да ещё с повторяемым результатом, да ещё и когда они разного диаметра и типа… Ну, в общем, вы поняли.

В результате долгих размышлений родилась следующая концепция:

Это должно быть некое компактное, недорогое устройство, которое может эффективно и быстро точить свёрла практически любого диаметра, а также фрезы. Так как задача эта достаточно ёмкая и требующая индивидуального подхода к каждому типу свёрл и фрез, я решил пока ограничиться только теми инструментами, которые в своём сечении не превышают приблизительно 30-35 мм. Почему так: я полагаю, что металлорежущие инструменты более большого диаметра используются, как правило, на больших предприятиях, где для правки подобного инструмента имеется вся необходимая инфраструктура.

Малый размер подобного устройства даёт нам хорошие «плюшки»:

  • легко хранить и переносить от места к месту (это не огромная «коряга», весом в 5-7 кг и занимающая существенное место и по сути, являющаяся отдельным специальным станком),
  • можно использовать маленькие недорогие электроприводы, которые к тому же являются достаточно энергосберегающими (например, всё устройство можно запитать от компактных литийионных аккумуляторов),
  • расходные материалы (заточные диски) к подобному ЧПУ-роботу будут тоже достаточно недорогими и маленькими в размерах.

После ряда размышлений я решил озвучить эту идею на одном из самых известных российских форумов по металлообработке. После чего мне было сказано, что если я выпущу подобное недорогое компактное ЧПУ устройство, — то это на корню обрушит весь рынок заточных станков, что вызовет в мой адрес крайнее неудовольствие «больших дяденек», связанных с этим бизнесом.

Я адекватно оценил сказанное, в ужасе забился далеко под кровать, откуда и пишу эту статью (хе-хе).

Почему подобное устройство до сих пор не было создано?

На мой взгляд, это связано с тем, что редко когда люди могут объединять не связанные напрямую друг с другом сферы. Причём это отмечал, насколько мне известно, ещё и сам Эйнштейн, долгое время проработавший в патентном бюро, — потому что люди, как правило, сидят внутри своей профессии, редко бросая взгляд на соседние сферы, которые не пересекаются непосредственно с их профессией.

В то же время существует довольно малое количество людей, которые могут объединять напрямую не связанное между собой. И именно такие люди и творят историю и создают поразительные вещи.

Видимо, до того как я обратил внимание на этот момент, никто из программистов и не думал создать что-то подобное (дешёвое и простое!) в сфере металлообработки (я это так подробно расписал не для того, чтобы похвалить самого себя, а просто попытался объяснить настоящее положение вещей и почему оно именно такое).

Давным-давно в далёкой-далёкой галактике, на одном из далёких форумов, где я учился в своё время 3D моделированию и рендерингу (был такой период у меня в жизни), была рубрика, которая носила название WIP (Work In Progress).

Рубрика пользовалась живым интересом со стороны форумчан, так как в ней люди выкладывали свои работы, не по принципу «как нарисовать сову: рисуем два круга — далее дорисовываем остаток совы», а поэтапно выкладывали весь процесс создания финальной работы, все свои сомнения, творческие метания и так далее. В процессе люди получали достаточно большой фидбэк, что позволяло соответствующим образом отточить финальный результат. Так как обратная связь — это всегда очень хорошо…

И поэтому я решил сотворить нечто подобное, и периодически выкладывать, то, что получается у меня с этим проектом. Я думаю, что это будет интересно ;-). Кроме того, возможно, даже кто-то опередит меня – нисколько не буду против :-)

В данный момент, часть требующихся для проекта деталей уже имеется у меня на руках, а часть — едет с известного китайского магазина. И пока они едут, мы можем обсудить этот проект с разных сторон…

Так как в программировании одной из главных концепций, которая постоянно постулируется, является декомпозиция задачи, которая подразумевает разбиение основной задачи на более мелкие неделимые подзадачи, я попробую также разделить стоящий передо мной вопрос на отдельные задачи и высказать мысли насчёт путей достижения целей для каждого из задач. Буду рад любым вашим встречным идеям и корректировкам моих мыслей!

Начнём с самой платформы: в качестве неё я планирую использовать свою любимую esp32. Почему именно её: она достаточно мощная, недорогая, предоставляет богатые возможности по программированию и беспроводным интерфейсам.

В качестве схемы взаимодействия предполагаю использовать локальную wi-fi сеть, которая строится между esp32 и смартфоном. В этой сети микроконтроллер выступает в роли клиента, который подключается к запущенной на смартфоне точке доступа. Для этого клиент использует следующий код:

#include <WiFi.h>
// SSID и пароль WiFi-сети:
const char* ssid = "название вашей сети";
const char* password = "пароль вашей сети";

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  Serial.println("WiFi connected");
}

После создания подключения, микроконтроллер становится доступным по ip-адресу и, соответственно, к нему можно обращаться и он выводит на экран подключившегося смартфона начальную страничку для ввода параметров.

В качестве кода-заготовки, на основе которого я буду делать свою страничку для ввода параметров, хочу взять вот отсюда, вот этот код:

image
Картинка: www.randomnerdtutorials.com

<!DOCTYPE html>
<html>
<head>
  <title>ESP Wi-Fi Manager</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,">
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <div class="topnav">
    <h1>ESP Wi-Fi Manager</h1>
  </div>
  <div class="content">
    <div class="card-grid">
      <div class="card">
        <form action="/" method="POST">
          <p>
            <label for="ssid">SSID</label>
            <input type="text" id ="ssid" name="ssid"><br>
            <label for="pass">Password</label>
            <input type="text" id ="pass" name="pass"><br>
            <label for="ip">IP Address</label>
            <input type="text" id ="ip" name="ip" value="192.168.1.200"><br>
            <label for="gateway">Gateway Address</label>
            <input type="text" id ="gateway" name="gateway" value="192.168.1.1"><br>
            <input type ="submit" value ="Submit">
          </p>
        </form>
      </div>
    </div>
  </div>
</body>
</html>

Эта страничка нужна для ввода начальных значений:

  • будем точить сверло или фрезу,
  • диаметр фрезы/сверла,
  • будем затачивать только кончик или будем затачивать ещё и боковую ленточку,
  • угол заточки кончика фрезы/сверла (точится под разные углы, для работы по разным материалам),
  • если это фреза, какое количество «перьев» на конце фрезы.

Это пока первоначальная прикидка вводимых параметров. Наверняка этот список будет уточняться и пополняться.

Теперь, что касается привода всего этого устройства, я планирую использовать несколько типов приводов сразу, что даст мне следующее:

  • точность перемещения,
  • контроль за скоростью вращения.

Для точного отклонения заточной головки я планирую использовать несколько миниатюрных шаговых двигателей.



Также для перемещения всей конструкции вдоль сверла/фрезы будет использован ещё один шаговый двигатель с миниатюрным планетарным редуктором:



Код для управления шаговыми двигателями я планирую использовать вот этот:


/*
 Stepper Motor Control - one revolution

 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.

 The motor should revolve one revolution in one direction, then
 one revolution in the other direction.


 Created 11 Mar. 2007
 Modified 30 Nov. 2009
 by Tom Igoe

 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(60);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

Что же касается второго типа двигателя, то он будет коллекторным, миниатюрным, со встроенным металлическим редуктором (так называемый «N20 gear motor», — если кому надо будет загуглить).



Металлический редуктор даст необходимый момент для такого маленького двигателя, в то время как передаточное число будет подобрано таким образом, чтобы двигатель давал где-то 1.000 оборотов в минуту. Почему именно так? По личному опыту. Когда я заказывал разные типы подобных двигателей с металлическим редуктором (гора которых лежит у меня прямо здесь, на расстоянии вытянутой руки), убедился, что, похоже, именно такой двигатель и с такой скоростью вращения выходного вала — является приемлемым для применения в моих целях.

То есть, он не настолько быстр, чтобы вращающийся, насаженный на него заточенный инструмент пережигал затачиваемую поверхность (ну, знаете, тот самый эффект, когда отрезной диск болгарки, в процессе отрезания ещё и жжёт металл, — мне такого не надо), но в то же время — он достаточно быстр, чтобы быстро затачивать.

Этот двигатель, как я уже сказал выше, будет использован в качестве основного привода в заточной головке, то есть на этот двигатель будет насажен заточный инструмент. Для контроля его скорости вращения мы сможем использовать ШИМ (широтно-импульсную модуляцию). Так как esp32 не поддерживает стандартную arduino-вскую функцию analogWrite(), то управлять мы будем так, как в примере ниже, используя ledcWrite:

#include "esp32-hal-ledc.h"

const int frequency = 25000;

const int pwmChannel = 0;
const int resolution = 8;

void setup() {

pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);

ledcSetup(pwmChannel, frequency, resolution);
}

void loop() {

//CW rotation
ledcWrite(pwmChannel, 255);
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);

delay (1000);

//CCW rotation
ledcWrite(pwmChannel, 255);
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
}

И здесь, наверное, стоит сразу сказать пару слов о самом заточном инструменте: в качестве него я решил использовать алмазные микродиски. Они достаточно недорогие, миниатюрные, малого веса и очень хорошо подходят к такому маленькому редукторному двигателю.



Диаметр микродиска я решил подобрать таким, чтобы он мог затачивать отдельные перья самой маленькой фрезы, которая у меня была в наличии — диаметром 8 мм:



Для насадки этого микродиска на вал электродвигателя, будут использованы следующие переходники, которые уже едут с али:



И вот, мы подошли к самому главному: А каким, собственно, образом определять геометрию затачиваемой поверхности? Ведь это самый важный вопрос, — именно с помощью этого пункта необходимо будет как-то контролировать, насколько хорошо идёт процесс заточки, на каком этапе он сейчас находится, а также проводить предварительный анализ геометрии поверхности, перед началом, чтобы понимать, насколько большой объём работы предстоит (можно даже будет выводить некое сервисное сообщение о прогнозируемом времени обработки!).

Здесь я для себя вижу два возможных решения:

Контроль с помощью оптического канала. После продолжительных размышлений, я понял, что оптический датчик должен быть очень миниатюрным, недорогим и хорошего разрешения. В качестве подобного датчика мне практически идеальным вариантом видится решение, рассмотренное, в том числе, здесь на хабре, и не только — когда в качестве оптического датчика используется датчик от обычной компьютерной мыши!

image
Картинка: www.interweber.ru

Датчик современных компьютерных мышей обладает достаточным, на мой взгляд, разрешением, чтобы справиться с этой задачей. Как, например,пишут, разрешение датчика лазерной мыши может достигать 2000 dpi (для понимания, насколько это много: глянцевая полиграфия в журналах — от 300 до 600 dpi). Такого разрешения просто «с горкой» хватит для контроля качества заточки.

Но, кроме самого датчика, необходима и некая подсветка поверхности, в качестве которой мне видится достаточно подходящим вариантом использование лазерного луча (можно даже снять всю систему прямо с мышки).

Использование неоптических методов контроля. Здесь достаточно интересным вариантом мне видится использование магнитного поля! Каким именно образом мы можем это реализовать?

После долгих размышлений я подумал вот о чём: ведь любое сверло или фреза — это металлический объект! А что из этого следует? То, что этот объект может вполне выступить в роли сердечника соленоида! Если мы где-то на самом основании этого объекта установим катушку, подадим на неё напряжение — всё сверло/фреза намагнитится!



Но тут есть явная проблема: так как диаметр у нас будет плавать, эта катушка у нас либо будет болтаться, либо внутрь неё сверло/фреза даже не поместятся. Кроме того, эту болтающуюся катушку надо будет каким-то образом крепить (не хочется просто заморачиваться этим вопросом).

Хотя, если хорошо подумать, альтернатива ведь есть: а что, если в самом низу сверла/фрезы — будет крепиться маленький соленоид с маленьким сердечником? Крепиться достаточно плотно, чтобы сердечник соленоида плотно прижался к нашему сверлу/фрезе. Я думаю, вы уже понимаете, да? ;-)



В результате чего у нас получается следующее: всё сверло/фреза превращается в большой магнит! Причём мы добились этого очень простым способом: всего лишь приклеили к хвостовику маленький электромагнит! Замечательно!

Только зачем же нам всё это было нужно? А вот зачем: в качестве бесконтактного средства контроля качества заточки — мы будем использовать аналоговый датчик Холла! Который будет перемещаться, будучи укреплённым на заточной головке вдоль затачиваемой поверхности, и, анализируя изменение градиента магнитного поля, — контролировать степень заточки! Конечно, значения этого датчика довольно сильно плавают, поэтому здесь можно будет использовать следующее решение: вести замеры постоянно, но блоками по 10 штук. Все значения блока из 10 замеров — усредняются.

В качестве подобного аналогового датчика Холла мы будем использовать KY-035:

image
Картинка: www.umnyjdomik.ru

Код для считывания его значений достаточно простой и выглядит следующим образом (взят отсюда):

// KY-035 аналоговый линейный датчик Холла
// umnyjdomik.ru
int linearHallSensorPin = A0;    // выбор пина для датчика
int ledPin = 13;       // выбор пина для светодиода
int linearHallSensorValue = 0;   // переменная для значения с датчика
 
void setup ()
{
  pinMode (ledPin, OUTPUT);
  Serial.begin (9600);
}
 
void loop ()
{
  linearHallSensorValue = analogRead (linearHallSensorPin); // чтение значения с датчика
  digitalWrite (ledPin, HIGH);
  delay (linearHallSensorValue);
  digitalWrite (ledPin, LOW);
  delay (linearHallSensorValue);
  Serial.println (linearHallSensorValue, DEC);
}

Кроме того, наверняка понадобится контролировать конечные точки перемещения всей системы и потребуется установить некоторое количество концевиков. В их качестве я планирую использовать такие же датчики Холла, только цифровые KY-003 (у них в отличие от аналогового датчика не показывается градиент значений, а просто на выходе имеются два варианта «да/нет»). Для работы с этими датчиками используется вот такой код (взят вот отсюда):

// KY-003 цифровой магнитный датчик Холла (Hall)
// umnyjdomik.ru
 
int led = 13 ; // назначение пина светодиода
int hallPin = 10 ; // назначение пина датчика
int value ; // переменная для хранения значения с датчика
 
void setup ()
{
  pinMode (led, OUTPUT);   
  pinMode (hallPin, INPUT);
}
 
void loop ()
{
  value = digitalRead (hallPin) ; // чтение значения с датчика
  if (value == LOW) // когда имеется магнитное поле, светодиод горит
  {
    digitalWrite (led, HIGH);
  }
  {
    digitalWrite (led, LOW);
  }
}

А теперь, когда я подробно рассказал о своём видении отдельных элементов системы, имеет смысл сказать о моём видении готового изделия в целом. Так как я планирую построить максимально миниатюрное устройство, то какие-либо варианты: станины, способов закрепления сверла в некий патрон, закреплённый на некотором подвесе и т.д. и т.п. — я решил не рассматривать.

Непосредственно процесс заточки будет происходить прямо на том самом станке, на котором используется данный инструмент: если это токарный или сверлильный станок по металлу, — то сверло/фреза будут затачиваться прямо, не снимая их со станка, в процессе заточки оставаясь закреплёнными в стандартном патроне.

Для этого будет использован крепёж типа диафрагмы:

image
Картинка: www.turbosquid.com

Это позволит зажимать в подобный крепёж широкий спектр свёрл и фрез. Устройство будет представлять собой своеобразную шайбу, которая будет перемещаться по затачиваемому инструменту.

Для этого перемещения будет использован принцип «женской губной помады» когда торчащие шпеньки перемещаются по спиралевидным канавкам, как в помаде:


Картинка: patents.google.com

Почему этот принцип я не назвал принцип болта и гайки? Потому что, хотя он и похож на это, но, на мой взгляд, всё же лучше помогает понять принцип моё предложенное название.

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

image
Картинка: studfile.net

В моём случае — это устройство будет не совсем полной копией такого подвеса (но подобной ему) и выглядеть будет приблизительно как-то вот так:



Последним вопросом, который тоже требует достаточного внимания, является вопрос подачи электропитания на эту «перемещающуюся заточную шайбу».

Здесь также, на мой взгляд, возможны два варианта:

  • устройство запитывается от литий-ионного аккумулятора, имеющегося прямо на борту устройства (этот вариант реалистичный, проверенный, но не настолько интересный),
  • индукционная подача питания на устройство.

Второй вариант мне видится очень интересным, так как позволяет устройству быть полностью независимым от внешних проводных привязок, либо встроенных аккумуляторов с ограниченным сроком работы.

Как я себе вижу реализацию этого второго варианта: где-то на самом основании сверла/фрезы закрепляется катушка с напряжением. Внутри самой «заточной шайбы» также имеется катушка, а сверло/фреза в этом случае, представляет собой магнитопровод трансформатора.



Но тут требуется консультация знающих людей. Реалистичен ли такой вариант магнитопровода, где он представляет собой не замкнутый контур, а просто стержень?

Сканирование поверхности механическим щупом. Этот метод часто используется в сложных заводских ЧПУ-обрабатывающих центрах и выглядит примерно так:

Тоже вполне реально — пройтись щупом и построить массив значений и уже исходя из них будет понятна геометрия поверхности.

Завершая свой рассказ, хочу сказать, что этот мой проект, долго вынашиваемый, наконец-то вступил в фазу практической реализации и любые идеи (и комментарии) будут интересны и полезны, так что можете не стесняться! Спасибо, что уделили время на чтение!

Источник: https://habr.com/ru/company/ruvds/blog/668414/


Интересные статьи

Интересные статьи

Расскажу про системы с микросервисной архитектурой (MSA). Как они устроены, как я их анализировала, какие увидела проблемы и преимущества.Статья не раскрывает лучшие практики использования микросервис...
Выгрузка пользователей из 1C ЗУП в Битрикс24 или правдивая история о том как настроить интеграцию 1С-Битрикс24 с ЗУП без 1С-ника.В жизни так бывает, причём бывает чаще чем хотелось бы, хоть в целом и ...
Есть статьи о недостатках Битрикса, которые написаны программистами. Недостатки, описанные в них рядовому пользователю безразличны, ведь он не собирается ничего программировать.
Всем доброго времени суток! никогда такого не было и вот опять. С моей прошлой статьи прошло уже достаточно времени, а оно ставит новые задачи. И если раньше я передавал данные на скорости 100 Mb...
Я работаю со студентами на микроконтроллере STM32F411RE, имеющего целых 512 кБайт ROM и 128 кБайт ОЗУ. Обычно в этом микроконтроллере в ROM память записывается программа, а в RAM изменяемые дан...