roboforum.ru

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


Arduino pro mini для управления шаговым двигателем

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 31 июл 2015, 14:51

У нас то же и получится примерно. :)
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 31 июл 2015, 16:12

Понял. Тагда остаётся только ждать инструкций )) Т.к. все свои познания я уже выложил.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 03 авг 2015, 12:05

Ок. Сделаю себе "стенд" для отладки - начну писать. На этой неделе постараюсь.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 06 авг 2015, 13:34

Было бы просто замечательно... А-то не только руки чешутся попробовать всё сотворить )))

Кстати, для включения/отключения намотки, как думаете, можно использовать готтовый модуль с фотоэлементом http://www.aliexpress.com/item/High-Qua ... 45226.html ? В смысле нить провисла, перекрыла свет (я только примерно представляю работу подобных датчиков) - мотор включился и подмотал нить, затем всё повторяется.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 07 авг 2015, 10:41

Можно использовать. Но это датчик отражения. Если будет срабатывать на нить - то почему нет?
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 07 авг 2015, 11:58

Не буду голову ломать. Всё равно не пойму )) Знать бы что искать, чтобы так рраз, поставил готовенький кусочек платки с детальками, а оно работает как надо :D
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 13 авг 2015, 02:23

Собрал ардуинку с драйвером в подобие корпуса. Надо же когда-то с макетки уходить ))
Правда оставил её сверху, чтобы программировать пока всё в стадии разработки.

Вопрос к Андрею (как к автору скетча), почему мотор работает не ... не поёт чтоли, как на принтере например, а как-то не чисто по звуку, и, такое ощущение, что трясётся сильнее, чем моторы на принтере например?
Драйвер переключал по всякому (микрики на нём), но что-то всё как буд-то не так. И еще, почти на минимуме переменника, есть какой-то скачок оборотов (резко повышаются) в одном и том же вроде месте резистора. Это может быть брак переменника или что еще?
Вложения
IMG_1492[1].JPG
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 13 авг 2015, 13:10

Revenger писал(а):Вопрос к Андрею (как к автору скетча), почему мотор работает не ... не поёт чтоли, как на принтере например, а как-то не чисто по звуку, и, такое ощущение, что трясётся сильнее, чем моторы на принтере например?

Собрал "макет", сейчас проверю, возможно подправлю.
Revenger писал(а):Драйвер переключал по всякому (микрики на нём), но что-то всё как буд-то не так. И еще, почти на минимуме переменника, есть какой-то скачок оборотов (резко повышаются) в одном и том же вроде месте резистора. Это может быть брак переменника или что еще?

Переменник на сколько килоом? А, кстати, подключен правильно? Движок переменника на ногу Ax ардуины?
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 13 авг 2015, 13:33

Вроде мотор правильно, по крайней мере когда был не правильно он просто стучал и еле шагал, а переменник (на сколько помню 20кОм, но проверю схожу), судя по скетчу, на ногу А0, а не на Ах... Или я что-то не там смотрел..
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 13 авг 2015, 14:33

Ну да, на А0.
Сейчас проверю скетч.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 13 авг 2015, 18:46

Все правильно, да, при шорохах резистора возможно такое поведение. Добавлю завтра "антидребезг" для резистора, также три кнопки и светодиод.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 14 авг 2015, 14:43

Новый код. версия 0.2
Изменения:
1. Добавлен светодиод "тип управления". На ногу ардуины 7, анодом к ноге, катодом - на землю, обязательно токоограничивающий резистор ом 200
2. Добавлена кнопка "Больше" - нога 4, замыкание на землю
3. Добавлена кнопка "Меньше" - нога 2, замыкание на землю
4. Добавлена кнопка "Режим" - нога 3, замыкание на землю

Логика работы: После включения светодиод "тип управления" - выключен. Частота задается резистором.
После однократного нажатия на кнопку "режим" - светодиод включается, устройство продолжает генерировать частоту установленную резистором, но ее можно менять кнопками "Больше" и "Меньше". При этом положение и изменения резистора - неважны.
Если снова нажать кнопку режим - то светодиод выключится, частота снова задается резистором напрямую.

Сейчас в скетче установлена минимальная частота 2, максимальная 100. Меняйте как надо.
Жду результатов теста.

Код: Выделить всёРазвернуть
/*
Управление шаговиком (драйвер степ-дир) переменным резистором
теперь с кнопками! :)
v 0.2 */




#define Step_pin 6 //вывод Arduino для ноги STEP контроллера
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера
#define Resistor_pin A0 //вывод Arduino резистора 0-5вольт
#define Mode_led_pin 7 //вывод Arduino Светодиода "режим"

//********** Кнопки:
#define keyDEFtime   30 //Значение для антидребезга - клавиша удерживаемая столько времени в миллисекундах считается нажатой.
#define keyPAUSEtime   400 //Значение в миллисекундах паузы между повторами
#define Butt_Mode 3 //Кнопка "режим"
//номер кнопки - 3
#define KeyMode 3
#define Butt_Down 2 //Кнопка "Меньше"
//номер кнопки - 1
#define KeyDown 1
#define Butt_Up 4 //Кнопка "Больше"
//номер кнопки - 2
#define KeyUp 2
#define KeyNONE 0 //Ничего не нажато
byte keyTemp = KeyNONE; //Переменная для хранения временного состояния кнопок
byte keyCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
unsigned long BtnTime; //Хранит время начала нажатия кнопок
//************


byte ControlMode = 0; //Переменная определяет режим управления. 0 - резистор. 1 - кнопки.

//Переменная для значения таймера
volatile unsigned char timerLoadValue;
//Переменная для количества холостых циклов таймера
volatile unsigned char FullTimer;
volatile unsigned char FullTimerCount; //внутренный счетчик таймера

//значение минимальной частоты
#define LowFreq 2
//значение МАКСИмальной частоты
#define HighFreq 100
//Переменная для шага чаcтоты на едниницу изменения АЦП
float FreqStep;
int OutFreq = LowFreq; //Переменная для хранения установленной частоты



//Переменная для текущего значения резистора
int sensorValue = 0;
//Переменная для Старого значения резистора
int OLDsensorValue = 0;



void setup() {               
// Конфигурим вывод Step_pin как выход
pinMode(Step_pin,OUTPUT);
// Конфигурим вывод Dir_pin как выход
pinMode(Dir_pin,OUTPUT);
// Конфигурим вывод Dir_pin как вход
pinMode(Resistor_pin,INPUT);
// Конфигурим выводы кнопок как входы с подтяжкой
pinMode(Butt_Down, INPUT_PULLUP);
pinMode(Butt_Mode,INPUT_PULLUP);
pinMode(Butt_Up,INPUT_PULLUP);
pinMode(Mode_led_pin,OUTPUT); // Конфигурим вывод Mode_led_pin как выход



//Установим на выходах 0
digitalWrite(Step_pin, LOW);
digitalWrite(Dir_pin, LOW);

// Посчитаем "шаг" изменения частоты на единицу изменения резистора
FreqStep=(float)(HighFreq-LowFreq)/1024;

//Запускает последовательный порт
Serial.begin(9600);

//Сообщение о запуске программы
Serial.println("Program started"); 
Serial.print("FreqStep="); 
Serial.println(FreqStep); 

//Запускает таймер и получает загружаемое значение таймера.
//Параметр - желаемая частота в герцах.

timerLoadValue=SetupTimer2(50);

//Установки Таймер2: Делитель частоты /8, режим 0
//Частота = 16MHz/256 = 62500 герц или
//Делитель /256 дает нам хороший рабочий диапазон
//так что сейчас мы просто жестко запрограммируем это.
TCCR2A = 0;
//TCCR2B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 256
TCCR2B = 4;

//Подключение прерывания по переполнению Timer2
TIMSK2 = 1<<TOIE2;


//Выводит загружаемое значение таймера
Serial.print("Timer2 Load:");
Serial.println(timerLoadValue,HEX);
}

void loop() {
byte ButtPressed=read_buttons(); //прочитаем нажатую кнопку

if (KeyMode==ButtPressed) //Если нажата кнопка - меняем режим управления и управляем светодиодом
  {ControlMode=!ControlMode; digitalWrite(Mode_led_pin,ControlMode);}
   
   if (ControlMode) //Если режим кнопки (светодиод включен)
     {
       if (KeyUp==ButtPressed) //Если нажата кнопка "Больше"
         {OutFreq+=1;}
       if (KeyDown==ButtPressed) //Если нажата кнопка "Меньше"
         {OutFreq-=1;} 
       if (ButtPressed) {SetupTimer2(OutFreq);} //Если вообще что-то нажато
     }
   else //Если режим резистор (светодиод выключен)
     {
        //Тут будем читать занчение
        sensorValue=analogRead(Resistor_pin); 
        //Сравним значение со старым, если отличается - пересчитаем установку таймера
        if (sensorValue!= OLDsensorValue)
          {  //Serial.println("ReCall"); //debug
           OLDsensorValue=sensorValue;
           OutFreq = LowFreq+FreqStep*sensorValue; //Вычислим новое значение частоты
           SetupTimer2(OutFreq);
          }
     }
   
    /*
      Serial.print("sensor=");
      Serial.println(sensorValue,DEC);
      Serial.print("FullTimerCount");
      Serial.println(FullTimerCount);
      Serial.print("FullTimer");
      Serial.println(FullTimer,DEC);
     
      Serial.print("timer=");
      Serial.println(timerLoadValue,DEC);
     
      Serial.print("ButtPressed=");
      Serial.println(ButtPressed,DEC);
      Serial.print("OutFreq=");
      Serial.println(OutFreq,DEC);
       Serial.println("***");
          Serial.println("");

    */
    delay (1);
}



//Timer2 указатель вектора прерывания по переполнению
//Собственно говоря частота будет в два раза ниже.
ISR(TIMER2_OVF_vect)
{
  if (FullTimerCount>1)
  {FullTimerCount--;}
  else
  {if (FullTimerCount==1) //предпоследний цикл
      {
       TCNT2+=timerLoadValue;
       FullTimerCount=0;
      }
   {if (FullTimerCount==0) // Срабатывание
        {
         FullTimerCount=FullTimer;
         //Переключение IO-вывода в другое состояние.
         digitalWrite(Step_pin,!digitalRead(Step_pin));
        //Перезагрузка таймера и коррекция по задержке
        if (FullTimer)
            {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
        else
            {TCNT2+=timerLoadValue;}
        }

    }
  }
}


#define TIMER_CLOCK_FREQ 62500.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz

  //Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency){
  //Подсчет начального значения таймера
  //Слегка усложним, добавив холостые просчеты
  int ticks = TIMER_CLOCK_FREQ/timeoutFrequency;
  FullTimer=ticks/256; //Вычисляем количество ПОЛНЫХ циклов таймера
  timerLoadValue=(int)(257.0-(ticks-(256*FullTimer)+0.5));  //Вычисляем количество доплнительных тиков таймера
  //257 на самом деле должно быть 256, но я получил лучшие результаты с 257.

  //загружает таймер для первого цикла
  if (FullTimer)
    {TCNT2=1;} //Если холостые циклы есть  - максимальное значение
  else
      {TCNT2=timerLoadValue;}
}



// *****************************
//Чтение кнопок с антидребезгом
int read_buttons() {
byte KeyTempTemp = KeyNONE; //Переменная для хранения свежесчитанного внутри функции
//digitalWrite (LED_pin,0); //debug
//delay (400); //debug
//Тут используем millis() для отслеживания нажатия кнопки
// Запоминиаем в переменной BtnTime ВРЕМЯ НАЧАЛА нажатия
// Запоминаем в переменной keyTemp нажатия
// Дефиним время антидребезга #define

      if (!digitalRead(Butt_Mode)) { KeyTempTemp=KeyMode; } //Определяем в переменную ТЕКУЩУЮ нажатую кнопку.
      if (!digitalRead(Butt_Down)) { KeyTempTemp=KeyDown; }
      if (!digitalRead(Butt_Up)) { KeyTempTemp=KeyUp; }
     //А тут проверим, совпадает ли с keyTemp (была ли нажата ранее)
/*     lcd.setCursor(0, 0); //debug
     lcd.print(KeyTempTemp); //debug
     lcd.setCursor(2, 0); //debug
     lcd.print(keyTemp); //debug
     lcd.setCursor(1, 1); //debug
     lcd.print(millis()); //debug
     lcd.setCursor(12, 1); //debug
     digitalWrite (LED_pin,1); //debug
     delay (100);
     lcd.print("    "); //debug
     lcd.setCursor(12, 1); //debug
     lcd.print(adc_key_in); //debug
*/
     if (KeyTempTemp==keyTemp) //Кнопка уже БЫЛА нажата
     {
        if (keyCONTpress) //Повторные установки клавиши
          {
            if ((millis()-BtnTime) > keyPAUSEtime)
            {
              BtnTime=millis(); // Ставим стартовое время для автоповтора
              return keyTemp;
            }
          } 
        else //Первая установка клавиши
           {
              if ((millis()-BtnTime) > keyDEFtime)
              {
                keyCONTpress=1;
                BtnTime=millis(); // Ставим стартовое время для автоповтора
                return keyTemp;
              }
           }
     }
     else //Раньше было другое состояние
     {
       keyCONTpress=0;
       BtnTime=millis(); //Устанавливаем ТЕКУЩЕЕ время в переменную BtnTime
       keyTemp=KeyTempTemp; //устанавливаем кнопку во временную переменную.
     }
   
return KeyNONE; }  // Если ничего не сработало, то ничего не возвращаем
//***********************************


Ну и пожеланий жду, могу например установленную частоту запоминать. Но с экраном все ж проще, имхо.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 14 авг 2015, 17:27

Супер. Попробую прицепить сегодня весь "обвес" )) Жалко с макетки уже всё переместил, но ничего.
Отпишусь по результату.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 14 авг 2015, 17:39

Подумалось мне чего-то... О установке микрометра.
Я так понимаю что логика работы всего устройства такая: Экструдер через сопло давит расплав, он на воздухе застывает охлаждаясь. Толщина регулируется скоростью протяжки: То есть если экструдер работает на постоянных оборотах - то толщину регулируем изменением скорости шагового двигателя (протяжка). Какое расстояние между соплом экструдера и протяжкой? Где на этом расстоянии можно установить микрометр? то есть нужно место где пруток уже достаточно остыл и не раздавится измерительными роликами, но максимально близко к тому месту, где он еще "растягивается" - чтоб волн не было от положительной обратной связи.
И еще, если экструдер может из-за гранул или еще каких-то причин менять скорость, то его все равно нужно контролировать. Так что оптопару ставить желательно.
Ну, у меня сейчас вообще так:
IMG_20150814_163415.jpg
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 14 авг 2015, 23:03

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

Добавлено спустя 3 часа 44 минуты 8 секунд:
Залил прошивку. Чичас буду пробовать крутить моторчик ))

Добавлено спустя 20 минут 25 секунд:
Не получилось "зажечь" светодиод. Т.е. функция "режим" не активируется. Соответственно "кнопки" +- не фунциклируют.

Пробовал просто перемычкой от - к ногам цепляться, типа нажимать. Может контакт плохой.. попробую чуть позже подпаяться. :oops:
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Пред.След.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2