В области программирования существует множество практических задач, которые тесно связаны с созданием физических устройств на базе микроконтроллеров. В этой статье мы расскажем о моей давней идее, которую я долго разрабатывал и недавно начал воплощать — создании ЧПУ-робота для точной заточки фрез и сверл.
Сразу скажу, что ничего подобного (несмотря на достаточно напряжённые поиски) — я никогда не встречал. Ни в российском сегменте интернета, ни в мировом. Так что, не удивлюсь, если подобный аппарат, с теми характеристиками, которые рассматриваются ниже — будет первым в мире!
Уже достаточно давно меня привлекает область программирования, которая позволяет создавать нечто ощутимое, так как в результате создаётся реальное физическое устройство, и ты можешь потрогать руками «результат работы своего кривого кода» :-В.
В тех областях, где происходит всё практически полностью виртуально, — видоизменяются какие-то переменные, происходят какие-то процессы, что-то куда-то пересылается и всё это виртуально, скрыто за экраном, — мне в этом не хватает жизни как бы, что ли… Слишком всё виртуально. Хочется, чтобы концепция вышла в жизнь и ожила…
Некоторое время назад, мне пришла в голову идея создать некое ЧПУ устройство, которое позволит достаточно легко и быстро, с повторяемым качеством, затачивать свёрла и фрезы.
Почему мне пришла эта идея: так как у меня есть свой личный токарный станок по металлу (ТВ-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
В моём случае — это устройство будет не совсем полной копией такого подвеса (но подобной ему) и выглядеть будет приблизительно как-то вот так:
Последним вопросом, который тоже требует достаточного внимания, является вопрос подачи электропитания на эту «перемещающуюся заточную шайбу».
Здесь также, на мой взгляд, возможны два варианта:
- устройство запитывается от литий-ионного аккумулятора, имеющегося прямо на борту устройства (этот вариант реалистичный, проверенный, но не настолько интересный),
- индукционная подача питания на устройство.
Второй вариант мне видится очень интересным, так как позволяет устройству быть полностью независимым от внешних проводных привязок, либо встроенных аккумуляторов с ограниченным сроком работы.
Как я себе вижу реализацию этого второго варианта: где-то на самом основании сверла/фрезы закрепляется катушка с напряжением. Внутри самой «заточной шайбы» также имеется катушка, а сверло/фреза в этом случае, представляет собой магнитопровод трансформатора.
Но тут требуется консультация знающих людей. Реалистичен ли такой вариант магнитопровода, где он представляет собой не замкнутый контур, а просто стержень?
Сканирование поверхности механическим щупом. Этот метод часто используется в сложных заводских ЧПУ-обрабатывающих центрах и выглядит примерно так:
Тоже вполне реально — пройтись щупом и построить массив значений и уже исходя из них будет понятна геометрия поверхности.
Чем можно заточить сверло?
Сверла можно заточить с помощью специальных инструментов — точильных станков, а также вручную, используя точильный камень или шлифовальный инструмент.
Для заточки сверла вручную с помощью точильного камня нужно выполнить следующие действия:
-
Закрепить сверло в зажиме и закрепить его в неподвижном положении.
-
Начать заточку с кончика сверла, перемещая камень по краю режущей кромки вдоль угла наклона.
-
Постепенно перемещать камень вдоль всей режущей кромки сверла, сохраняя одинаковый угол наклона и равномерное давление на камень.
-
Проверить заточку, нанеся легкие отметки на поверхность металла и проверив их на ровность и остроту.
Для заточки сверла на точильном станке следует:
-
Установить сверло в зажим и закрепить его на точильном станке.
-
Выбрать нужный угол наклона и установить соответствующий угол на точильном станке.
-
Включить точильный станок и начать заточку сверла, перемещая его вдоль режущей кромки.
-
Постепенно увеличивать скорость вращения сверла и периодически останавливать станок, чтобы проверять заточку.
В любом случае, перед заточкой сверла рекомендуется ознакомиться с инструкцией для использования точильного станка или точильного камня и соблюдать все меры предосторожности для предотвращения травм и повреждения инструментов.