roboforum.ru

Технический форум по робототехнике.

Токарный и электроника

Токарный и электроника

ilalexey » 26 апр 2019, 11:00

Буду мусолить тему электроники и токарного с упором на "фриендли юзер интерфейс".
--------------
Затея скрестить это с grbl и чтобы лимбами можно было пользоваться, как будто никаких модификаций нет. Т.е. чтобы токарник и как чпу мог и резьбы резал и вручную. Асм может пригодиться, чтобы камушек поменьше выбрать, без всяких дуин и прикрутить его к фартуку.
Последний раз редактировалось ilalexey 26 апр 2019, 18:01, всего редактировалось 4 раз(а).

Re: Вопросы новичка.

Dmitry__ » 26 апр 2019, 11:20

Я свой токарный станок тоже по глупости начал чпушить. Потом забросил, т.к. токарное дело - чиста ручная работа. В очпушивании есть только смысл ради "электронная гитара" для резьб. Но если честно, я за всю жизнь нарезал только пяток резьб и забил. Основных шестерен гитары более чем достаточно...
Смысл в очпушивании токарника только в изготовлении огромной партии деталей с нулевой перестройкой станка - без замены резца, деталь за один зажим, и.т.д... :pardon:

Re: Вопросы новичка.

ilalexey » 26 апр 2019, 11:34

Тоже не особо с резьбами баловался, но иногда бывает нужно, а отсутствие опции меняет планы. Все шестерни поснимал, т.к. грохот от них. Без автоподачи при этом остался.
Чтобы шарики выточить резец специально делал, а с чпу это былобы проще.
Для "чисто ручной работы" и нужен энкодер аки лимб. Из плюшек при этом добавляется табло DRO.

Re: Вопросы новичка.

Dmitry__ » 26 апр 2019, 12:19

ilalexey писал(а):Для "чисто ручной работы" и нужен энкодер аки лимб. Из плюшек при этом добавляется табло DRO.

Поверь, электронные лимбы - полная чушь. Я купил наворот JET BD-8 с электронными лимбами и инверторным приводом. Работать по ним совершенно невозможно из-за задержек на жк индикаторе! Инвертор в станке - дело, лимбы - жесть.

Добавлено спустя 7 минут 50 секунд:
Вот картинка JET, основная "х" - механич. лимб, 2 другие - электронные. Ели бы основная была тоже электронная, то работать на станке было бы нереально...

Изображение

Re: Вопросы новичка.

ilalexey » 26 апр 2019, 12:22

ну, хз. Может в твоём станке навороты такие большие, что цифры в них запутываются по дороге к табло? :)
У меня тахометр 5 знаков на асме показывает мгновенно.

Re: Вопросы новичка.

Dmitry__ » 26 апр 2019, 12:43

Поверь, мелькающие цифры при подаче абсолютно нечитаемые. На мех. лимбе значительно правильнее - ты видишь как перемещается шкала. Все эти dro - игрушка и не более. Для точного образмеривания, в любом случае, надо останавливать станок, обмерять деталь цифровым штангелем и вносить поправки на обработку. Все эти dro не учитывают износ резца, отгибание и нагрев заготовки.
Оцифровкой токарника занимаются начинающие чайники (я так делал), потом это все убирают, т.к. надо работать :)

Добавлено спустя 2 минуты 30 секунд:
ilalexey писал(а):ну, хз. Может в твоём станке навороты такие большие, что цифры в них запутываются по дороге к табло? :)
У меня тахометр 5 знаков на асме показывает мгновенно.

У меня тахометр тоже показывает, но он никак не относится к обработке, ты на тахометр смотришь один раз во время запуска станка или добавлении/уменьшении оборотов. Деталь в это время не обрабатывается...

Re: Вопросы новичка.

ilalexey » 26 апр 2019, 13:43

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

Re: Вопросы новичка.

Dmitry__ » 26 апр 2019, 14:04

Меня в электронной гитаре пугает возможность проскакивания деления. Ведь датчик там не абсолютный, а инкрементальный. Железные шестерни насмерть держат положение резца относительно борозды резьбы. А может я чего и не понял с эл. гитарой, вдумчиво не разбирался... :)
Надо завязывать про токарные станки :)

Re: Токарный и электроника

ilalexey » 26 апр 2019, 21:57

:)

Добавлено спустя 24 минуты 1 секунду:
Мыслей много и их нужно причесать.
Дано:
. grbl
. электронная гитара.
. ручное управление(с шаговиком).
Начну от самого необходимого. Ручное управление. Тиньки 2313 должно хватить. Выкинуть из проекта ленту и втулить один лед_знак.
Скрестить энкодер с лимбом хз как. Трещётка с тормозом нужна наверно. На сколько делений?

Добавлено спустя 3 часа 30 минут 17 секунд:
Dmitry__ писал(а):У меня тахометр тоже показывает, но он никак не относится к обработке

Имел в виду этот тахометр. Тот, что в станке(родной) тормознутый на секунду-две.
Привёл в пример его, как вариант шустрого просчёта и вывода на экран.
Если ничего не путаю, то это он(от асма там только вставки похоже):
Код: Выделить всёРазвернуть
#define    TRUE    (!FALSE)
#define    FALSE   0
#define    BYTE    unsigned char
#define    WORD    unsigned short int
#define    BOOLEAN char

#define TIMER_OVF_ENOUGHT   49
#define NO_PULSES_INTERVAL  200

#define LED_delay 250   
#define Light_delay 2500
#define Anode
//#define Cathode       

#define     CNT_100_MS  6250

#define byBladeCnt 1 //1- две катушки, 2 - одна катушка, 4 - мотоцикл...
#define Prescaler 0x01 //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz...
#define UpCount 4  // +1 = количество пропусков (0,1S) до обновления

#include    <tiny2313.h>
#include    <delay.h>                               


BOOLEAN btTimeUpdate;   // = 1, когда нужно обновить время на дисплее
WORD wTime;             // Время, которое показывает секундомер (в десятых секунды)

BOOLEAN btTimerOn;      // TRUE - таймер запущен, FALSE - остановлен

BYTE    byTcnt;         // счетчик десятых секунд

BYTE    byDisplayRefreshCnt;    //

void ShowDisplayData(void);     // Вывод экранного буфера
void PrepareRpmData(WORD wRpm);

BOOLEAN btDisplayUpdate;        // = TRUE, если пришло время обновить дисплей


BYTE byDisplay[5];        // буфер данных, для вывода на экран       
WORD    wLockedRpm;

// Массив знакогенератора
BYTE byCharacter[12] = {0xFA,     //0
                        0x82,     //1
                       0xB9,     //2
                       0xAB,     //3
                       0xC3,     //4
                       0x6B,     //5
                       0x7B,     //6
                        0xA2,     //7
                        0xFB,     //8
                        0xEB,     //9
                        0x00,     //blank   
                        0x01      //-
                       };

WORD    wRpm;           // Скорость вращения ротора (об/мин)

//BOOLEAN btRpmUpdate;    // = 1, когда измеряно новое значение оборотов

WORD    wTimerOvfCnt;   // Счетчик переполнений таймера (нужен для
                        // увеличения разрядности

WORD    wFlashCnt;      // Счетчик срабатываний датчика прохождения допасти

BOOLEAN btFirstLowRateFlash;    // FALSE - если отсчет периода еще не начался
                                // (датчик ни разу не сработал)   
                                                                   

/************************************************************************\
  Обновление дисплея.
      Вход:  -
      Выход: -
\************************************************************************/
void RefreshDisplay(void)
{                               
    #asm("cli");
    if (btDisplayUpdate)
    {
      wLockedRpm = wRpm;
      btDisplayUpdate = FALSE;
    }
    #asm("sei");
   
    PrepareRpmData(wLockedRpm);
    ShowDisplayData();
}

/************************************************************************\
  Преобразование скорости мотора и количества лопастей
  в данные экранного буфера
      Вход:  wRpm - обороты ротора, byBladeCnt - количество лопастей
      Выход: -
\************************************************************************/
void PrepareRpmData(WORD wRpm)
{
    BYTE i;
    WORD R;
   
    R = wRpm;       
   
    byDisplay[4] = wRpm % 10;
    wRpm /= 10;
             
    if (byDisplay[4] > 4)  //округляем
    {
      wRpm++;
      R += 10;
    }       
   
    byDisplay[4] = 0;
   
   
    // Первые 5 цифр - обороты двигателя
    for(i=0; i<4; i++)
    {
       byDisplay[3-i] = wRpm % 10;
       wRpm /= 10;
    }
   
    if (R < 10)
    {
      byDisplay[0] = 10;
      byDisplay[1] = 10;
      byDisplay[2] = 10;
      byDisplay[3] = 10;           
      goto exit;
    }   
    if ((R >= 10) & (R <100))
    {
      byDisplay[0] = 10;
      byDisplay[1] = 10;
      byDisplay[2] = 10;
      goto exit;
    }
    if ((R >= 100) & (R <1000))
    {
      byDisplay[0] = 10;
      byDisplay[1] = 10;
      goto exit;
    }           
    if ((R >= 1000) & (R <10000))
    {
      byDisplay[0] = 10;
      goto exit;
    }       
   
                   
exit:
}


/************************************************************************\
  Вывод экранного буфера на дисплей.
      Вход:  -
      Выход: -
\************************************************************************/
void ShowDisplayData(void)
{
#ifdef Cathode
  PORTB = byCharacter[byDisplay[0]];
  PORTD.3 = 0;
  delay_us(LED_delay);
  PORTD.3 = 1;   
     
  PORTB = byCharacter[byDisplay[1]];
  PORTD.5 = 0;
  delay_us(LED_delay);
  PORTD.5 = 1;
     
  PORTB = byCharacter[byDisplay[2]];
  PORTD.1 = 0;
  delay_us(LED_delay);
  PORTD.1 = 1;
     
  PORTB = byCharacter[byDisplay[3]];
  PORTD.0 = 0;
  delay_us(LED_delay);
  PORTD.0 = 1;
 
  PORTB = byCharacter[byDisplay[4]];
  PORTD.4 = 0;
  delay_us(LED_delay);
  PORTD.4 = 1;

#endif

#ifdef Anode
  PORTB = ~byCharacter[byDisplay[0]];
  PORTD.3 = 1;
  delay_us(LED_delay);
  PORTD.3 = 0;   
     
  PORTB = ~byCharacter[byDisplay[1]];
  PORTD.5 = 1;
  delay_us(LED_delay);
  PORTD.5 = 0;
     
  PORTB = ~byCharacter[byDisplay[2]];
  PORTD.1 = 1;
  delay_us(LED_delay);
  PORTD.1 = 0;
     
  PORTB = ~byCharacter[byDisplay[3]];
  PORTD.0 = 1;
  delay_us(LED_delay);
  PORTD.0 = 0;
 
  PORTB = ~byCharacter[byDisplay[4]];
  PORTD.4 = 1;
  delay_us(LED_delay);
  PORTD.4 = 0;

#endif
 
  if (! PIND.6)
  {     
    delay_us(Light_delay);
  }
}                               
                               
/**************************************************************************\
   Обработка прерываний от OC1 (для отсчета импульсов 0.1 сек)
      Вход:  -
      Выход: -
\**************************************************************************/
interrupt [TIM1_COMPA] void SYSTEM_TICK_interrupt(void)
{
    // Вычисляем оммент следующего срабатывания таймера
    OCR1A += CNT_100_MS;

    // 3 раза в секунду перерисовываем дисплей,
    // независимо от обстоятельств.
    if( ++byDisplayRefreshCnt == UpCount )
    {
        byDisplayRefreshCnt = 0;
        btDisplayUpdate = TRUE;

    }
    // Если секундомер запущен - инкрементируем его показания
    if( btTimerOn )   
    {
        if (++byTcnt == 10)
        {
            byTcnt = 0;
            if( ++wTime == 60000)
                wTime = 0;
        }
    }


}
                               
/**************************************************************************\
    Обработка прерываний от управляющих импульсов
      Вход:  -
      Выход: -
\**************************************************************************/
interrupt [EXT_INT0] void RPM_PULSE_interrupt(void)
{
    long lTmp;

    GIMSK &= ~0x40;

    if(btFirstLowRateFlash)
    {
        // Первый импульс, сбрасываем счетчик периода и
        // счетчик импульсов
        wTimerOvfCnt = 0;
        wFlashCnt = 0;
        TCNT0 = 0;
        TIFR = 0x02;
        TCCR0B = 0x03;   // FCK / 64 ( 62.5 KHz )
        TCNT0 = 0;
        TIMSK |= 0x02;  // Разрешаем прерывания от TMR0

        btFirstLowRateFlash = FALSE;
    }
    else
    {
        wFlashCnt++;
        // Проверяем, не пора ли закончить измерения
        if( wTimerOvfCnt > TIMER_OVF_ENOUGHT )
        {
            TCCR0B = 0;      // Останавливаем TMR0
            GIMSK &= 0x40;  // Запрещаем прерывания от INT0
            TIMSK &= ~0x02; // Запрещаем прерывания от TMR0
            if(TIFR & 0x02)
                wTimerOvfCnt++;    // Учитываем возможность переполнения

            lTmp = (62500L * 60L * (long)wFlashCnt);
            lTmp /= ((wTimerOvfCnt << 8) + TCNT0);
            lTmp /= byBladeCnt;
            wRpm = lTmp;

            // Перезапускаем измерения
            btFirstLowRateFlash = TRUE;

            wTimerOvfCnt = 0;
            TCNT0 = 0;
            TCCR0B = 0x03;   // FCK / 64 ( 62.5 KHz )
            TCNT0 = 0;
            TIFR = 0x02;
            TIMSK |= 0x02;  // Разрешаем прерывания от TMR0

//            GIFR = 0x40;

        }
    }
    EIFR = 0x40;
    GIMSK |= 0x40;
}

/**************************************************************************\
    Обработка переполнений TMR0 (добавляем к счетчику еще 8 разрядов)
      Вход:  -
      Выход: -
\**************************************************************************/
interrupt [TIM0_OVF] void TIMER0_interrupt(void)
{
    wTimerOvfCnt++;

    // Если импульсов не было слишком долго, то показываем
    // 0 оборотов и запускаем измерение заново
    if( wTimerOvfCnt > NO_PULSES_INTERVAL )
    {
        wRpm = 0;
        btFirstLowRateFlash = TRUE;
        wTimerOvfCnt = 0;
    }
}                               
                               
/**************************************************************************\
    Головная функция. Инициализация всех модулей. Цикл вызова рабочих
    подпрограмм.
      Вход:  -
      Выход: -
\**************************************************************************/
void main(void)
{   
// Crystal Oscillator division factor:
#pragma optsize-
CLKPR=0x80;
CLKPR=Prescaler;        //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz...
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

    #asm("cli");
   
    MCUCR = 0x00;   // Запрещаем SLEEP, режимы прерывания пока не важны.
                    // В принципе, этого можно и не делать.
   
    GIMSK = 0x00;   // Запрещаем внешние прерывания
    EIFR = 0xFF;    // Очищаем флаги прерываний
   
    TIMSK = 0x00;   // Запрещаем прерывания от таймеров
    TIFR = 0xFF;    // Очищаем флаги прерываний

        //Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
        //Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
        //         если установлена 1 - то на выводе устанавливается лог. 1
        //         если установлена 0 - то на выводе устанавливается лог. 0
        //    если вывод определен входом (DDRx = 0), то PORTx - определяет состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
        //Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта
       
        PORTA=0b00000011;
        DDRA= 0b00000011;           
       
        PORTB=0b00000000;
        DDRB= 0b11111111;
                 
      #ifdef Cathode 
        PORTD=0b01111111;
        DDRD= 0b00110011;
      #endif
     
      #ifdef Anode 
        PORTD=0b01000100;
        DDRD= 0b00111011;
      #endif
     
    // Инициализируем модули
    //time------------------------------------
    btTimerOn = FALSE;
    wTime = 0;
    byTcnt = 0;
    byDisplayRefreshCnt = 0;
   
    btTimeUpdate = FALSE;
   
    TCNT1 = 0;
   
    TCCR1A = 0x00;      // Отключаем управление выводом OC1 и PWM

    TCCR1B = 0x03;      // На таймер подается FCK через делитель на 64,
                        // шумодав отключен, никакого сброса нет

    OCR1A = TCNT1 + CNT_100_MS;

    TIFR  |= 0x40;      // Сбрасываем флаг прерываний от Output-Compare
    TIMSK |= 0x40;      // Разрешаем прерывание от Output-Compare
    //time------------------------------------
   
    //rmp-------------------------------------
    btFirstLowRateFlash = TRUE;
    wRpm = 0;

    // Разрешаем прервание INT1
    EIFR = 0x40;
    GIMSK |= 0x40;
    MCUCR = 0x02;   // Настраиваем INT0 на спад, остальные биты не важны.
   
    // Таймер запускаем сразу, чтобы проверять
    // отсутствие сигнала
    wTimerOvfCnt = 0;
    TCNT0 = 0;
    TCCR0B = 0x03;   // FCK / 64 ( 62.5 KHz )
    TCNT0 = 0;
    TIMSK |= 0x02;  // Разрешаем прерывания от TMR0
    //rmp-------------------------------------
   
   
   
    #asm("sei");

//    StartLowRateRpm();
    while(TRUE)
    {
       
            RefreshDisplay();


    }
}

Re: Токарный и электроника

Dmitry__ » 27 апр 2019, 06:53

ilalexey писал(а):Начну от самого необходимого. Ручное управление. Тиньки 2313 должно хватить. Выкинуть из проекта ленту и втулить один лед_знак.

A почему просто не повторить проект с электронной гитарой?

ilalexey писал(а):Скрестить энкодер с лимбом хз как.

В чем смысл? Если крутить ручки с лимбами вручную, зачем энкодер? Если крутить ручки шаговиком, то энкодер не нужен, т.к. дублирует шаговик.
Энкодер нужен только на шпиндель (если говорить об электронной гитаре).
Посмотрел видео на chipmaker по твоей ссылке с автоматич. нарезкой резьбы, интересно, но надо еще чпушить поперечную подачу. Ради 10 раз нарезать резьбу - избыточно. А полное очпушивание, как я раньше говорил и подтверждается на chipmaker - нафиг не нужен.
chipmaker:
ЧПУ мало пригоден для единичных деталей.


ilalexey писал(а):Имел в виду этот тахометр.

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

Re: Токарный и электроника

esisl » 27 апр 2019, 09:24

Вот если бы аналог тринтера...

Re: Токарный и электроника

ilalexey » 27 апр 2019, 12:52

Dmitry__ писал(а):A почему просто не повторить проект с электронной гитарой?

Уже не вспомню, но что-то не подошло.
Dmitry__ писал(а):В чем смысл? Если крутить ручки с лимбами вручную, зачем энкодер? Если крутить ручки шаговиком, то энкодер не нужен, т.к. дублирует шаговик.

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

Теперь понял о чём ты говоришь. Согласен. Если энкодер без трещотки(фиксации) будет, тоже фигня. По моему отсутствие энкодера в проекте "ЭГ" меня и смутила - там одни кнопки, а это не удобно.

Re: Токарный и электроника

Dmitry__ » 27 апр 2019, 13:29

ilalexey писал(а):Уже не вспомню, но что-то не подошло.

Ну там проблема установить оптический диск на ось патрона. Я посмотрел на свой токарный - засада городить этот энкодер. Шум шестерен гитары меня так не волнует. Если не нужны автоматич. подачи, я просто отвожу шестерню из зацепления и все перестает громыхать.
Вот на что бы я заморочился, так это на резку шестерен. Т.е. делать подобие электронной делительной головки, а на продольную подачу ардуину. Хотяяяяя, а зачем мне шестерни? :)
Вот кинематика моего станка, верхний полый вал - привод патрона. Вот на нее городить энкодер довольно сложно (чтоб осталась опция засовывать в патрон бесконечную трубу. А внизу, шестерня отводится в кронштейне, чтоб отключать вращение ходового винта продольной подачи.
IMG_4993.JPG

Re: Токарный и электроника

ilalexey » 27 апр 2019, 13:44

Особо сложного с энкодером вала нет. Диск от принтера народ ставит. У меня донор около Ф65мм.

Добавлено спустя 4 минуты 50 секунд:
Dmitry__ писал(а):Вот кинематика моего станка

Аналогичная ситуация.
Вложения
Zenitech-MD-180-300-Vario_5.jpg.pagespeed.ce.PlMp4EiSHq.jpg

Re: Токарный и электроника

Dmitry__ » 27 апр 2019, 13:45

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


Rambler\'s Top100 Mail.ru counter