В программировании достаточно много прикладных задач, которые напрямую связаны с разработкой физических устройств, на основе микроконтроллеров.
В этой статье мы поговорим об одной моей задумке, которую я вынашиваю достаточно давно и приступил в данный момент к её реализации — ЧПУ робот для заточки фрез и свёрл.
Сразу скажу, что ничего подобного (несмотря на достаточно напряжённые поиски) — я никогда не встречал. Ни в российском сегменте интернета, ни в мировом. Так что, не удивлюсь, если подобный аппарат, с теми характеристиками, которые рассматриваются ниже — будет первым в мире!
Уже достаточно давно меня привлекает область программирования, которая позволяет создавать нечто ощутимое, так как в результате создаётся реальное физическое устройство, и ты можешь потрогать руками «результат работы своего кривого кода» :-В.
В тех областях, где происходит всё практически полностью виртуально, — видоизменяются какие-то переменные, происходят какие-то процессы, что-то куда-то пересылается и всё это виртуально, скрыто за экраном, — мне в этом не хватает жизни как бы, что ли… Слишком всё виртуально. Хочется, чтобы концепция вышла в жизнь и ожила…
Некоторое время назад, мне пришла в голову идея создать некое ЧПУ устройство, которое позволит достаточно легко и быстро, с повторяемым качеством, затачивать свёрла и фрезы.
Почему мне пришла эта идея: так как у меня есть свой личный токарный станок по металлу (ТВ-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-адресу и, соответственно, к нему можно обращаться и он выводит на экран подключившегося смартфона начальную страничку для ввода параметров.
В качестве кода-заготовки, на основе которого я буду делать свою страничку для ввода параметров, хочу взять вот отсюда, вот этот код:
Картинка: 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 мм:
Для насадки этого микродиска на вал электродвигателя, будут использованы следующие переходники, которые уже едут с али:
И вот, мы подошли к самому главному: А каким, собственно, образом определять геометрию затачиваемой поверхности? Ведь это самый важный вопрос, — именно с помощью этого пункта необходимо будет как-то контролировать, насколько хорошо идёт процесс заточки, на каком этапе он сейчас находится, а также проводить предварительный анализ геометрии поверхности, перед началом, чтобы понимать, насколько большой объём работы предстоит (можно даже будет выводить некое сервисное сообщение о прогнозируемом времени обработки!).
Здесь я для себя вижу два возможных решения:
Контроль с помощью оптического канала. После продолжительных размышлений, я понял, что оптический датчик должен быть очень миниатюрным, недорогим и хорошего разрешения. В качестве подобного датчика мне практически идеальным вариантом видится решение, рассмотренное, в том числе, здесь на хабре, и не только — когда в качестве оптического датчика используется датчик от обычной компьютерной мыши!
Картинка: www.interweber.ru
Датчик современных компьютерных мышей обладает достаточным, на мой взгляд, разрешением, чтобы справиться с этой задачей. Как, например,пишут, разрешение датчика лазерной мыши может достигать 2000 dpi (для понимания, насколько это много: глянцевая полиграфия в журналах — от 300 до 600 dpi). Такого разрешения просто «с горкой» хватит для контроля качества заточки.
Но, кроме самого датчика, необходима и некая подсветка поверхности, в качестве которой мне видится достаточно подходящим вариантом использование лазерного луча (можно даже снять всю систему прямо с мышки).
Использование неоптических методов контроля. Здесь достаточно интересным вариантом мне видится использование магнитного поля! Каким именно образом мы можем это реализовать?
После долгих размышлений я подумал вот о чём: ведь любое сверло или фреза — это металлический объект! А что из этого следует? То, что этот объект может вполне выступить в роли сердечника соленоида! Если мы где-то на самом основании этого объекта установим катушку, подадим на неё напряжение — всё сверло/фреза намагнитится!
Но тут есть явная проблема: так как диаметр у нас будет плавать, эта катушка у нас либо будет болтаться, либо внутрь неё сверло/фреза даже не поместятся. Кроме того, эту болтающуюся катушку надо будет каким-то образом крепить (не хочется просто заморачиваться этим вопросом).
Хотя, если хорошо подумать, альтернатива ведь есть: а что, если в самом низу сверла/фрезы — будет крепиться маленький соленоид с маленьким сердечником? Крепиться достаточно плотно, чтобы сердечник соленоида плотно прижался к нашему сверлу/фрезе. Я думаю, вы уже понимаете, да? ;-)
В результате чего у нас получается следующее: всё сверло/фреза превращается в большой магнит! Причём мы добились этого очень простым способом: всего лишь приклеили к хвостовику маленький электромагнит! Замечательно!
Только зачем же нам всё это было нужно? А вот зачем: в качестве бесконтактного средства контроля качества заточки — мы будем использовать аналоговый датчик Холла! Который будет перемещаться, будучи укреплённым на заточной головке вдоль затачиваемой поверхности, и, анализируя изменение градиента магнитного поля, — контролировать степень заточки! Конечно, значения этого датчика довольно сильно плавают, поэтому здесь можно будет использовать следующее решение: вести замеры постоянно, но блоками по 10 штук. Все значения блока из 10 замеров — усредняются.
В качестве подобного аналогового датчика Холла мы будем использовать KY-035:
Картинка: 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);
}
}
А теперь, когда я подробно рассказал о своём видении отдельных элементов системы, имеет смысл сказать о моём видении готового изделия в целом. Так как я планирую построить максимально миниатюрное устройство, то какие-либо варианты: станины, способов закрепления сверла в некий патрон, закреплённый на некотором подвесе и т.д. и т.п. — я решил не рассматривать.
Непосредственно процесс заточки будет происходить прямо на том самом станке, на котором используется данный инструмент: если это токарный или сверлильный станок по металлу, — то сверло/фреза будут затачиваться прямо, не снимая их со станка, в процессе заточки оставаясь закреплёнными в стандартном патроне.
Для этого будет использован крепёж типа диафрагмы:
Картинка: www.turbosquid.com
Это позволит зажимать в подобный крепёж широкий спектр свёрл и фрез. Устройство будет представлять собой своеобразную шайбу, которая будет перемещаться по затачиваемому инструменту.
Для этого перемещения будет использован принцип «женской губной помады» когда торчащие шпеньки перемещаются по спиралевидным канавкам, как в помаде:
Картинка: patents.google.com
Почему этот принцип я не назвал принцип болта и гайки? Потому что, хотя он и похож на это, но, на мой взгляд, всё же лучше помогает понять принцип моё предложенное название.
Сама заточная головка закреплена на устройстве, подобном тому, которое используется для крепления гироскопов:
Картинка: studfile.net
В моём случае — это устройство будет не совсем полной копией такого подвеса (но подобной ему) и выглядеть будет приблизительно как-то вот так:
Последним вопросом, который тоже требует достаточного внимания, является вопрос подачи электропитания на эту «перемещающуюся заточную шайбу».
Здесь также, на мой взгляд, возможны два варианта:
- устройство запитывается от литий-ионного аккумулятора, имеющегося прямо на борту устройства (этот вариант реалистичный, проверенный, но не настолько интересный),
- индукционная подача питания на устройство.
Второй вариант мне видится очень интересным, так как позволяет устройству быть полностью независимым от внешних проводных привязок, либо встроенных аккумуляторов с ограниченным сроком работы.
Как я себе вижу реализацию этого второго варианта: где-то на самом основании сверла/фрезы закрепляется катушка с напряжением. Внутри самой «заточной шайбы» также имеется катушка, а сверло/фреза в этом случае, представляет собой магнитопровод трансформатора.
Но тут требуется консультация знающих людей. Реалистичен ли такой вариант магнитопровода, где он представляет собой не замкнутый контур, а просто стержень?
Сканирование поверхности механическим щупом. Этот метод часто используется в сложных заводских ЧПУ-обрабатывающих центрах и выглядит примерно так:
Тоже вполне реально — пройтись щупом и построить массив значений и уже исходя из них будет понятна геометрия поверхности.
Завершая свой рассказ, хочу сказать, что этот мой проект, долго вынашиваемый, наконец-то вступил в фазу практической реализации и любые идеи (и комментарии) будут интересны и полезны, так что можете не стесняться! Спасибо, что уделили время на чтение!
Автор:
DAN_SEA