Станок 2х координатный

Тема в разделе "Глядите, что я сделал", создана пользователем kulver, 19 ноя 2012.

  1. kulver

    kulver Нерд

    [​IMG]

    Что это?
    Данный станочек я строил как прототип, просто потренироваться и проверить свои силы, прежде чем браться за полноразмерную версию большого 4х3 метра мостового 15кВт-ного распиловочного станка для камня, который нужен по работе. Так что задача заключалась в сколачивании из самых обычных материалов (без "заказать на заводе деталь!") уменьшенной версии, которая бы:
    1) ездила туды сюды =)
    2) выдавала достаточную точность,
    3) была бы более-менее жёсткой по конструкции,
    4) имела бы самый базовый функционал реального станка, кроме непосредственно режущего мощного мотора с пилой, они лишь подразумеваются.

    Дисклеймер для профессионалов в области станкостроения - я нуб, ваяю в первый раз, по специальности инженер-гидравлик, поэтому ногами не таво. Конструктив приветствуется. Замечания/предложения по поводу применения тех или иных отраслевых стандартов приветствуются в квадрате, ибо о существовании таковых я узнал только, когда уже всё готово было. А сразу чё-то не вспомнил погуглить их...

    Итого, чё я тут нафигачил-то вообще - 1х1 метр габариты, 3 независимые направляющие с 3 моторчиками https://amperka.ru/collection/dc-motors , 3 передачи винт-гайка, 2 стенки и один "стол" габаритами примерно 75х75см с возможностью поднимать его в вертикальное положение, 1 Arduino Uno, 2 Motor Shield-a, 3 датчика обратной связи по оборотам винта.

    Всё это дело катается по командам с компа, дополнительный GUI я написать пока не успел, как раз сейчас пишу на питоне, так что команды через сериал порт через стоковое IDE, например. Весьма удобно, по крайней мере для тестовых целей "за глаза". Скорость перемещения - 1мм/с. Медленно конечно, сразу замечу, что для подобных размеров движки надо брать раза в 2 мощнее по моменту как минимум, чтобы не плясать с подгонкой всего и вся, как я, пару месяцев. А, да, вся стройка была весьма неспешна, нерегулярна, и заняла у меня около 1 года. Сколько ушло денег - не знаю, не считал, было пофиг, думаю около 10к за всё. Опять же, часть комплектующих была куплена, опробована и отложена с пометкой "хренота".

    Далее, сперва подробное описание всей сложноты конструкции со всеми словленными граблями, а потом код для ардуины, ибо в обратном порядке будет непонятно.

    Конструкция
    [​IMG]
    Вероятно, она выглядит просто. Простенько. Ежу понятно. Если так, то круто, ибо наворотить хитрых свистелок любой эффективненький сможет, а вот чтобы просто - оно сложно.

    Состав я уже писал выше, и, кроме указанных там крутых штук, ещё используются 2 профиля под столом, на которых во-первых лежит стол, а во-вторых которыми соединяются стенки. Выглядит оно так: [​IMG]
    Этот элемент весьма ответственен, ибо если сделать хлипкие соединительные палки, то будет плохая жёсткость и направляющие будут гулять относительно стола при небольших усилиях. Для такого мелкого станка то, как сделал я, вполне достаточно. Для большого надо будет делать дополнительные диагональные усиления жёсткости.

    Как крепить мотор к винту - есть два варианта, "правильный" и "хреновый, как на фоточках". Хреновый - это от незнания, как просто и дёшево сделать хорошо, поэтому я реализовал так: [​IMG] . [​IMG]
    В торце винта примерно по центру (в результате во всех 3х винтах ни разу я в центр так и не попал, хотя старался!) сверлится отверстие по оси винта под диаметр чуть больший, чем вал мотора, например под свои моторы я сверлил 3,5мм. А потом моторчик с щепкой просто заколачиваются нежно и аккуратно молотком в винт. Главное нежно. Возможнен фейл с испорченным моторчиком. Крайне вероятен фейл с погнутым винтом. Выпрямить его потом так, чтобы его не колбасило при вращении, сложно, проще новый купить. В итоге получается сносно, хотя несоосность мотора и винта всё равно дикая.
    А "правильный" способ намного проще - купить вот такие хрени https://amperka.ru/product/shaft-coupler-3mm и не страдать ерундой. Как жаль, что я о них узнал так поздно... =/

    Пара слов о самих моторах и о передаче винт-гайка в целом: перемещение по координате можно впринципе сделать многими способами
    1. зубчатая рейка и шестерня на моторе по ней едет;
    2. винт, вращаемый мотором, и неподвижная гайка;
    3. и всякие извращения типа "а давайте сделаем все линейные перемещения на японских гидроцилиндрах, а запитаем всё от парового двигателя, который будем топить деньгами, еее".
    К слову, большой станок я буду делать именно с помощью рейки и шестерни, ибо подозреваю, что хорошо сбалансированный точный 3,5 метровый винт будет стоить денег, в отличие от копеечной рейки из "n" частей.
    В данном случае использовалась обычная шпилька из Мерлена, с обычной метрической резьбой и соответственным люфтом гайки по ней, размером М8, длиной 1 метр, немного кривенькая, но лучше не было. Для таких размеров надо брать диаметр больше, чё-нить типа М12, ибо М8 прогибается под собственным весом и при резком включении на обороты типа 5+ об/с идёт в разнос.
    Какой мотор использовать - шаговый, или обычный? Я остановился на обычном, ибо он в промышленном исполнении сильно дешевле шагового, а прикрутить обратную связь мне было не сложно. А на промышленных так вообще обычно какие-нибудь энкодеры (счётчики оборотов вала) встраивают по дефолту. Но шаговый тоже можно. Мелкие станки обычно делают именно на шаговых.
    Как синхронизировать два параллельных линейных привода? У меня синхронизация сделана софтверно, но можно и перекинуть какой-нибудь ремень, или цепь, просто для этого все эти дополнительные детали надо искать. Мне было проще написать кусок кода. Весьма тривиальный кусок.
    Далее, про направляющие. Я использовал обычный алюминиевый П-образный профиль, чё-то типа 40х25х25мм, жёсткости хватило с запасом, а вот слайдер/каретку/ползунок/скользящую_по_ней_фигню я делать замучался. На фото представлен 4-й вариант, переработанный трижды. И он всё равно очень плох - люфтит и заедает. Но работает. Вот его фотки спереди [​IMG] и сзади [​IMG] Кто догадается, зачем нужна алюминиевая "полочка" в правом куске фанеры каретки - тому почёт и ничего. Бутерброд из фанеры по центру нужен для фиксации гайки, она туда забита с натягом, гайка М8 удлиннённая, как 3 обычных в длинну. Лучше сделать две гайки, а между ними зажать пружину, чтобы компенсировать люфт в резьбе.
    Для небольших станков идеальными направляющими является пара осей. Простые гладкие оси, диаметр вибирайте сами, для длинны в 1м я бы предположил что-то типа 12мм. Тут больше - не меньше. И каретку под них сделать будет очень просто, и сами они просто крепятся, и вообще, не надо изобретать велосипеды в домашних наколеночных условиях, ибо получится криво и косо. Проверено.
    Свои направляющие к стенкам я крепил так: [​IMG]
    Смысл в том, чтобы прижать направляющую к изначально ровному краю стенки из фанеры, но при этом не погнуть её слишком большим усилием прижима. У меня 2 таких прижималки с одной стороны и по центру с другой. Держится очень крепко.
    Ну и наконец, у станка должны быть ножки, обычно 4. ножки должны быть с регулировкой, ибо пол может быть кривой. Поэтому они такие: [​IMG] Они слегка пружинят, устраняя совсем мелкие неровности без подкручивания. Справляются с ролью ножек на отличненько.
    И последнее в конструкции - обратная связь. Это постоянные магниты и датчик Холла, аналоговый. Он показался мне удобнее. Чтобы оно работало, нужен "стягивающий резистор, установленный одним концом в промежуток между вводом данных и пином микросхемы/микроконтроллера, а другим соединенным с землей (GND). В этом случае все шумы, способные дать неверный сигнал, стекают в землю. В роли стягивающего резистора применяют сопротивления более 10 kOm." (с) Без него никак. Работает просто - магнит приклеен хорошим двухкомпонентным (весьма вонючим по началу) клеем к центру грани гайки, всего 3шт, чтобы не отлетал при высоких скоростях вращения 5+ об/с, гайка зажата двумя другими гайками на винте, над гайкой зажат датчик в импровизированной зажималке, короче вот так: [​IMG] - датчик - мелкая чёрная фигня над гайкой.
    При появлении магнита под датчиком, напряжение на соответствующей ножке датчика меняется, всё просто. Таким нехитрым образом я добился разрешающей способности позиционирования =шаг_винта / (количество_магнитов * 2), т.е. ~0,21мм. Вполне ок.
     
    Unixon нравится это.
  2. kulver

    kulver Нерд

    Код.
    А вот и он:
    Код (Text):
    //motor
    const int Motor_x1_Speed = 6;
    const int Motor_x1_Dir = 7;
    const int Motor_x2_Speed = 9;
    const int Motor_x2_Dir = 8;
    const int Motor_y_Speed = 5;
    const int Motor_y_Dir = 4;
     
    Обьявили всякие константы номеров пинов для моторчиков, кого куда воткнули.
    Кстати, ардуино по дефолту разрешает втыкать в себя только 1 моторшилд, если тупо воткнуть второй, то магии не случится, ибо используются пины 4, 5, 6, 7, и они просто будут дублировать сигналы на второй шилд. Поэтому я откусил кусачками эти ножки у второго шилда и проводами сверху перекинул пины на 8, 9. Фотка:
    [​IMG]
    Процесс необратим, поэтому рекомендуется только, если __self__.balls_of_steel = True.

    Код (Text):

    //slider
    float last_pos_x1 = 0;
    float last_pos_x2 = 0;
    float last_pos_y = 0;
    const float stepp = 0.2083;
     
     
    переменные, содержащие последние известные положения стояния кареток, и шаг константой.

    Код (Text):

     
    //hall sensor
    const int Sensor_x1_Signal = A2;
    boolean MagnetNear_x1 = false;
    boolean MagnetNearOld_x1 = false;
    const int Sensor_x2_Signal = A0;
    boolean MagnetNear_x2 = false;
    boolean MagnetNearOld_x2 = false;
    const int Sensor_y_Signal = A1;
    boolean MagnetNear_y = false;
    boolean MagnetNearOld_y = false;
    int MagnetMax = 480;
    int MagnetMin = 400;
     
     
    привязка аналоговых выходов датчиков Холла к аналоговым пинам ардуины, а так же булевские переменные, отвечающие - есть ли магнит рядом с датчиком СЕЙЧАС и был ли он там в ПРОШЛЫЙ РАЗ.

    Код (Text):

     
    //serial read array
    int inByte[20];
     
     
    массив для получения сообщения с сериал порта

    Код (Text):

     
    void setup()
    {
      //setting the starting magnet posotions...
      //for X1
      int avValue = analogRead(Sensor_x1_Signal);
      if (avValue<MagnetMin) {
        MagnetNear_x1 = false;
      };
      if (avValue>MagnetMax) {
        MagnetNear_x1 = true;
      };
      MagnetNearOld_x1 = MagnetNear_x1;
      //for X2
      avValue = analogRead(Sensor_x2_Signal);
      if (avValue<MagnetMin) {
        MagnetNear_x2 = false;
      };
      if (avValue>MagnetMax) {
        MagnetNear_x2 = true;
      };
      MagnetNearOld_x2 = MagnetNear_x2;
      //for Y
      avValue = analogRead(Sensor_y_Signal);
      if (avValue<MagnetMin) {
        MagnetNear_y = false;
      };
      if (avValue>MagnetMax) {
        MagnetNear_y = true;
      };
      MagnetNearOld_y = MagnetNear_y;
    Смотрим есть ли на момент старта магнит у Холла, и задаём соотвествующие начальные значения переменных. Не самый обязательный кусок кода, вообщем-то.

    Код (Text):

      //ensuring that no motor will run without command
      digitalWrite(Motor_x1_Speed, LOW);
      digitalWrite(Motor_x2_Speed, LOW);
      digitalWrite(Motor_y_Speed, LOW);
     
     
    подстраховка что не поедет сам случайно
    Код (Text):

     
     
      Serial.begin(115200);
     
      delay(1000);  //so u'll have time to open serial, my dear slowpoke
      print_info();
    }
     
     
    void print_info(){
      Serial.println(" ");
      Serial.println("To add a task, write [axis][distance][;]");
      Serial.println("For example: x100; - will move 2-motor slider forward for 100mm");
      Serial.println("Another ex.: y-25; - will move 1-motor slider backward for 25mm");
      Serial.println("Dont forget the [;] at the end!");
    }
    пишем инструкцию юзеру, чё куда вводить и как далеко уедем с этого.
    Код (Text):

     
    void loop()
    {
      //declaring local vars
      float pos_x1 = 0;
      float pos_x2 = 0;
      float pos_y = 0;
      int distance = 0;
    переменные для текущих значений позиций каретки
    Код (Text):

      boolean busy = false;
      unsigned long finish_time_x1 = 0;
      unsigned long finish_time_x2 = 0;
     
      ///read from serial - where to go:
      //1.get the data to the array
      if (Serial.available() > 0) {
        for (int i=0; i<20; i++) {
          inByte[i] = Serial.read();
          if (inByte[i] == ';') {
            break;
          };
        };
        busy = true; //flag that means we gotta move somewhere
      };
     
     
    прочитали сообщение из сериала, загнали его в массив и поставили статус "занят"
    Код (Text):

     
     
      //2.parse the array and move needed sliders
      if (busy == true) { //move only when flag 'busy' ON
        int i = 0; //set i to first symbol
        switch (inByte[i]) {
     
          ///////// IF WE MOVE XXX
        case 'x': //if we read smth like "x15" from serial
          {
            Serial.println("Axis: X");
            i++;
            if (inByte[i] == '-') { //if we read "x-15"
              digitalWrite(Motor_x1_Dir, LOW);
              digitalWrite(Motor_x2_Dir, LOW);
              i++;
            }
            else { //if no '-' read
              digitalWrite(Motor_x1_Dir, HIGH);
              digitalWrite(Motor_x2_Dir, HIGH);
            };
     
            distance = 0;
            do { //read the whole number
              distance = distance*10 + inByte[i] - 48;
              i++;
            }
            while (inByte[i] != ';');
            Serial.print("Distance = ");
            Serial.println(distance);
     
     
    распарсили сообщение и осознали куда ехать каретке
    Код (Text):

     
            //finally turn ON motors
            boolean other_motor_reached_finish = false;    
            digitalWrite(Motor_x1_Speed, HIGH);          
            digitalWrite(Motor_x2_Speed, HIGH);
            unsigned long start_time = millis();
            do{
              //sync motors
                        if (pos_x1 - pos_x2 > 0,5) { //x1 overruns x2 for >= 3 steps, stop x1
                          digitalWrite(Motor_x1_Speed, LOW);
                          digitalWrite(Motor_x2_Speed, HIGH);
                        };
                        if (pos_x2 - pos_x1 > 0,5) { //x2 overruns x1 for >= 3 steps, stop x2
                          digitalWrite(Motor_x1_Speed, HIGH);
                          digitalWrite(Motor_x2_Speed, LOW);
                        };
                        if (abs(pos_x1 - pos_x2) < 0,21) { //x? overruns x? for <= 1 step, let it be.
                          digitalWrite(Motor_x1_Speed, HIGH);
                          digitalWrite(Motor_x2_Speed, HIGH);
                        };
    простая синхронизация - если 1й обогнал второго, то обрубить питание первому. Можно было сделать плавное уменьшение напряжения на первом, но трение по длине винта очень неравномерно и эффект получился бы странным. Поэтому - отрубать. Проще.
    Код (Text):

              int avValue1 = analogRead(Sensor_x1_Signal);
              int avValue2 = analogRead(Sensor_x2_Signal);
              if (avValue1<MagnetMin) {
                MagnetNear_x1 = false;
              };
              if (avValue2<MagnetMin) {
                MagnetNear_x2 = false;
              };
              if (avValue1>MagnetMax) {
                MagnetNear_x1 = true;
              };
              if (avValue2>MagnetMax) {
                MagnetNear_x2 = true;
              };
              if (MagnetNear_x1 != MagnetNearOld_x1) {
                pos_x1 = pos_x1 + stepp;
                MagnetNearOld_x1 = MagnetNear_x1;
                if ((pos_x1 + stepp/2) >= distance) {
                  digitalWrite(Motor_x1_Speed, LOW); //shut down motor if distance is runned over
                  finish_time_x1 = millis();
                  if (other_motor_reached_finish) {
                    break; //break the loop if BOTH morots finish
                  }
                  else {
                    other_motor_reached_finish = true;
                  };
                };
              };
              if (MagnetNear_x2 != MagnetNearOld_x2) {
                pos_x2 = pos_x2 + stepp;
                MagnetNearOld_x2 = MagnetNear_x2;
                if ((pos_x2 + stepp/2) >= distance) {
                  digitalWrite(Motor_x2_Speed, LOW); //shut down motor if distance is runned over
                  finish_time_x2 = millis();            
                  if (other_motor_reached_finish) {
                    break; //break the loop if BOTH morots finish
                  }
                  else {
                    other_motor_reached_finish = true;
                  };
                };
              };
            }
            while((distance*1.5*1000>(millis() - start_time))); //shut down on timeout,
            //if motors r runnig longer
            //then 1.5 times 'distance' seconds,
            //cuz average speed is 1mm per 1 sec.
            //Obviously, smth went wrong.
            //Go find a crowbar and get ready to save the world.
            digitalWrite(Motor_x1_Speed, LOW);
            digitalWrite(Motor_x2_Speed, LOW);

            //report stats
            Serial.print("X1 covered: ");
            Serial.print(pos_x1);
            Serial.print("mm; time taken: ");
            Serial.print(finish_time_x1 - start_time);
            Serial.println("ms.");
            Serial.print("X2 covered: ");
            Serial.print(pos_x2);
            Serial.print("mm; time taken: ");
            Serial.print(finish_time_x2 - start_time);
            Serial.println("ms.");
            print_info();      
          }
          break;
     
     
    тут просто считаются магнитики, если насчитали нужное количество, то глохнем, если оба мотора доехали, то глушим и второй и отчитываемся перед юзером всякой ненужной статистикой в сериал порт. Либо глушим моторы, если прошло в 1.5 раза больше времени, чем должно было, а они так и не приехали - например они где-то застряли, или датчик отвалился, или ардуино сошло с ума.
     
    medv_E_Duino и Unixon нравится это.
  3. kulver

    kulver Нерд

    Код (Text):

          ///////////////////////////////////// Y /////////////////////////////////////
        case 'y': //if we read smth like "y15" from serial
          {
            Serial.println("Axis: Y");
            i++;
            if (inByte[i] == '-') { //if we read "y-15"
              digitalWrite(Motor_y_Dir, LOW);
              i++;
            }
            else { //if no '-' read
              digitalWrite(Motor_y_Dir, HIGH);
            };

            distance = 0;
            do { //read the whole number
              distance = distance*10 + inByte[i] - 48;
              i++;
            }
            while (inByte[i] != ';');
            Serial.print("Distance = ");
            Serial.println(distance);

            //finally turn ON motor    
            digitalWrite(Motor_y_Speed, HIGH);
            unsigned long start_time = millis();
            do{
              int avValue = analogRead(Sensor_y_Signal);
              if (avValue<MagnetMin) {
                MagnetNear_y = false;
              };
              if (avValue>MagnetMax) {
                MagnetNear_y = true;
              };
              if (MagnetNear_y != MagnetNearOld_y) {
                pos_y = pos_y + stepp;
                MagnetNearOld_y = MagnetNear_y;
                if ((pos_y + stepp/2) >= distance) {
                  digitalWrite(Motor_y_Speed, LOW); //shut down motor if distance is runned over
                  Serial.print("Y covered: ");
                  Serial.print(pos_y);
                  Serial.print("mm; time taken: ");
                  Serial.print(millis() - start_time);
                  Serial.println("ms.");
                  print_info();
                  break;
                };
              };
            }
            while((distance*1.5*1000>(millis() - start_time)));  //shut down on timeout,
            //if motor is runnig longer
            //then 1.5 times 'distance' seconds,
            //cuz average speed is 1mm per 1 sec.
            //Obviously, smth went wrong.
            //Go find a crowbar and get ready to save the world.
            digitalWrite(Motor_y_Speed, LOW);
          }
          break;

     
    то же самое для У-координаты, тут мотор 1, поэтому без синхронизации.
    Код (Text):


        default:
          {
            Serial.println("Cant read the task. Try again. And get ur hands straight FFS!");
          }
          break;
        };
        busy = false;
      };
    если вдруг мы не смогли разобрать чё надо юзеру - посылаем его в лес.
    Код (Text):


      delay(100); //have a rest
    }
     
    Каменты в коде в стиле "это мост", да, сочувтсвую всем читающим всем сердцем. И себе самому, читающему это месяц+ спустя. Как я мог написать такую хрень аааа.
    Вообщем всё работает, видюшку снять забыл и уже разобрал половину. Скоро (я надеюсь) будут получены деньги на создание большого станка, как чё получится - расскажу. А пока так. Строить было весело. Сложно. Долго. Но ооочень интересно. И весело. Бугагашеньки.
    =)

    PS: использованная литература:
    1) http://www.rcdesign.ru/articles/tools/cnc_mechanics
    Шикарное пособие, как сделать настольный координатник действительно "по уму".
    2) https://forum.amperka.ru
    Форум для задавания нубских вопросов по Ардуине и получению полезных ответов.
     
    sanik, medv_E_Duino и Unixon нравится это.
  4. nailxx

    nailxx Официальный Нерд Администратор

    :eek:

    Очень круто! Огромное спасибо, что поделились. Я вас помню :cool: Чертовски приятно осознавать, что всё приобретённое пошло не на полку стоять, а поучаствовало в этом вполне осязаемом, осмысленном прототипе.
     
  5. Unixon

    Unixon Оракул Модератор

    Man, you made my day... That's f***g awesome! :)

    Тоже вот подумываю над координатником, но пока процесс отчасти упирается в отсутствие четкого понимания где и как в пределах разумных средств разжиться адекватной металлической частью механики (направляющие, узлы для передачи момента, разные крепежи) и крайне малый (т.е. практически отсутствующий) опыт металлообработки. Проблема осложняется тем, что требуемая точность лежит, видимо, за пределами достижимой аналогичным вашему способом, а также большими хотелками сделать сменный инструмент на Z оси на одной и той же платформе. В идеале требуется точность перемещения не хуже 0.05мм (можно не лучше 0.01мм), это при условии, что существенного накопления ошибки (больше нормы точности) за время выполнения одной непрерывной операции не будет. Задачи - изготовление печатных плат, обработка (сверловка, фрезеровка) деталей из полимерных материалов (пластик, плекс), текстолита и легкого цветмета, в более отдаленной перспективе - Solder paste dispensing, Pick & Place, 3D печать, в еще более отдаленной - лазерная пайка компонент и резка материалов. В общем, практически все, кажется, перечислил, что вообще на координатники навешивается :D хех...

    Если все же начать с малого, то можно попробовать сделать передачу момента на 12мм стальных шпильках из ближайшего хозмага и трубках из расклиненных или нагруженных втулок оттуда же, только я боюсь вся резъба у такой конструкции сточится нафиг еще во время первых тестов независимо от качества смазки валов... не говоря уже о том, что компенсировать люфты придется независимым контролем положения какой-нибудь хитрой оптикой прямо с головы станка. А при нормах хуже 0.1мм такой координатник становится уже малополезен для моих задач. :(
     
  6. hibiki

    hibiki Гик

    круто, чё!

    а не хотите в управляющем модуле реализовать парсер G-кода? проще будет, а в перспективе - и комп для управления не понадобится, можно будет "мордочку" на самом станке сделать, да еще и со считыванием с sd-карт, скажем.

    По конструктиву - рейка, конечно, хорошо, но у винтов момент больше будет, что для камня/металла, как мне представляется, важно. Пусть и не особо прецизионных - обратную связь можно сделать, как в HPшных струйниках - риски на приводном ремне у них, которые считываются датчиком. По две "линейки" на ось, рядом с направляющими - чтобы перекос поймать, если будет.

    По моторам - коллекторники у вас в таком режиме работы удивительно быстро передадут привет. А те, которые не передадут, будут стоить, как приличные шаговики :( бесколлекторные моторы - туда же..
     
  7. kulver

    kulver Нерд

    Мерси, господа =)

    можно вот тут посмотреть http://purelogic.ru/shop/mehanika_d...dachi_vintgajka/katanye_trapeceidalnye_vinty/, вроде не астрономические цены на винты те же. Сам я там не заказывал. но если там реально катанные трапецеидальные винты указанной точности, то это очень супер для подобного станка
    я в своём тоже магию не плёл, тупо "сверлить дырку здесь" и "отрезать лобзиком тут", плохая точность компенсировалась напильником и всякими подстроечными зазорами и винтиками, про них надо помнить.
    Вероятно вы это уже видели, но если нет, то вот: http://www.rcdesign.ru/articles/tools/cnc_mechanics
    Точность достигаема, но детальки заказывать на заводе, на коленке такую точность не выпилить.
    Резьба не сотрётся, но там люфт будет порядка 1мм, который обычно компенсируют сжиманием/разжиманием двух рядом стоящих гаек. Но в любом случае такую точность на метрической резьбе получать - сомнительная затея =)

    хочу) ибо теперь я знаю, что есть некий G-код. вчера ещё не знал)) сейчас попробую поизучать википедию. Или откуда изучение лучше начать?
    ну морду и на этой реализации привинтить можно впринципе, если вы имеете ввиду просто пачку кнопок "ехать вперёд", "назад", и т.д., как это реализовано на простых серийных станках сейчас.
    А вообще не вижу особого смысла отделять станок от компа ещё и потому, что в дальнейшем планирую его доавтоматизировать до состояния, когда обслуживающий персонал впринципе не нужен будет, раз в неделю расходники типа дисков и фрез менять на новые и всё. Закидывать через интернет из офиса на комп в цеху чертежи, нажимать кнопочку "распечатай мне подоконников", и созерцать магию...

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

    через встроенные в моторы энкодеры проще должно быть...

    А вот за эту мысль отдельное спасибо! А почему помрут? Частые старт/стоп их убивают? Или пыльная влажная среда? А как отличить те, которые помрут, от тех, которые не помрут?
    От шаговиков я отказался ещё и потому, что так и не разобрался, как его завести... :oops:
    Какие вообще, по вашему мнению, нужно использовать в данном случае моторы, если требуемые характеристики порядка 100 об/мин и 2кВт мощи?
     
  8. Unixon

    Unixon Оракул Модератор

    С механикой вообще пока проблема по большому счету от незнания стандартных промышленных подходов к проектированию узлов таких вот устройств. Чем, например, передавать момент с двигателя на ходовой винт при соединении валов по оси? Если делать еще один передаточный узел на шестернях, там опять стандартны вопросы - где брать, как делать, чем крепить. В общем, с механическим сопряжением одни вопросы пока, ответов крайне мало.
     
  9. hibiki

    hibiki Гик

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

    с википедии - там ссылки внизу статьи есть.
    есть еще linuxcnc.org, там много интересного, даже если у вас не линух.

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

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

    а вот шаговые моторы позволят вам еще и намного точнее контролировать скорость (в них она линейно зависит от скорости переключения обмоток).
    а вот вам пример по ссылке из википедии - http://avrlab.com/node/60

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

    и не бойтесь гневных постов и страшных слов о стоимости от обитателей cnc-club и прочих форумов по теме станков с ЧПУ.