roboforum.ru

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

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

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

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

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

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

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

Сообщение alfamosk » 25 авг 2015, 17:33

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

по мотору да, на намотчик) есть еще моторчик от дрели на 18v если память не изменяет.
а так есть моторы от принтеров, просто было около 5-6 штук на разборке, разобрал их, вытащил все что можно)

не очень пойму какие детальки еще нужны
1) arduino любой. если нано то + 3.3V 5V MB102 для макетки + модуль юсб CP2102
2) TB6560 драйвер. а какой нибудь другой подойдет?
3) макетка с проводами.
4) мотор, в вашем случае нема 17.
Аватара пользователя
alfamosk
 
Сообщения: 368
Зарегистрирован: 14 мар 2015, 00:36
Откуда: Казань-Италия

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

Сообщение Revenger » 25 авг 2015, 18:42

По драйверу не скажу. Мне что посоветовали в начале темы, то я и взял ))
Есть еще м-шилды к ардуине для шаговиков и коллекторных, но это я точно не скажу.
На "нано" вроде есть усб-разъём, там конвертер ТТЛ вроде не нужен. Но тоже уверять не буду, я тут "доцент".
Мотор можно и из принтера шаговый. У меня сейчас дербан Эпсона Р220, там на протяжке бумаги шаговик, только нужно смотреть напряжение. Есть и на 24 (ТВ6560 лучше от 24В работает говорят) и на 48В. Я просто всё от 12В стараюсь запитать, чтобы минимум обвеса и трансформаторов. Потребуется - есть и на 24В транс, но большущий.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение alfamosk » 25 авг 2015, 20:49

вот что из моторов есть)
Вложения
WP_20150825_17_01_49_Pro.jpg
Аватара пользователя
alfamosk
 
Сообщения: 368
Зарегистрирован: 14 мар 2015, 00:36
Откуда: Казань-Италия

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

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

Ну.. как минимум три верхние (правее) вроде шаговые. Смотри напряжение и если что в путь ))


п.с. Что-то по свечению светодиода я не понял на макетке с оптодатчиком... Поставил рядом на пробу светодиод с резистором 300Ом, так он вообще не горит. А почему тогда тот, что с 1кОм светится еле еле? Я думал, что уменьшив сопротивление яркость увеличится ))
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение RootAdmin » 26 авг 2015, 11:50

Не надо играться с номиналом резистора. Нам светодиод нужен только для того, чтоб определить выводы. Рекомендую резистор на 200 припаять прямо на плату, порезав дорожку. А светодиод - уберем, его резистор увеличим килоом до 4,7 или 10. Сейчас напишу процедурку для обработки оптодатчика.

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

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

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

Может спросить в магазине что-то подобное смд резистору (чтобы на плату влепить)? Правда я такие и паять не пробовал то.. Хотя спрошу, может их и нет у нас в продаже. Деревня блин..

Добавлено спустя 1 час 36 минут 2 секунды:
купил смд 200Ом и 4,7кОм... это ппц какие они маленькие. Попробую чтонить запаять ))
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение RootAdmin » 26 авг 2015, 15:26

Да смысла нет. Нам место экономить не надо, разве что эстетичней.

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

/*
Вывод    Назначение
0        UART
1        UART
2       
3       
4       
5        Dir_pin
6        Step_pin     
7        LCD RS
8        LCD RW
9        LCD E
10       LCD DB4
11       LCD DB5
12       LCD DB6
13       LCD DB7
A0       Резистор
A1
A2
A3
A4       
A5       
A6
A7        Кнопки
*/

#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
#define lcd_RS_pin 7
#define lcd_RW_pin 8
#define lcd_E_pin 9
#define lcd_DB4_pin 10
#define lcd_DB5_pin 11
#define lcd_DB6_pin 12
#define lcd_DB7_pin 13
//                    RS,         RW,        E,         DB4,           DB5,       DB6,          DB7
LiquidCrystal lcd(lcd_RS_pin, lcd_RW_pin, lcd_E_pin, lcd_DB4_pin, lcd_DB5_pin, lcd_DB6_pin, lcd_DB7_pin);


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


//********** Кнопки:
#define btnRIGHT  1 //Определяем кнопки
#define btnUP     2
#define btnDOWN   3
#define btnLEFT   4
#define btnSELECT 5
#define btnNONE   0


#define btnDEFtime   30 //Значение для антидребезга - клавиша удерживаемая столько времени в миллисекундах считается нажатой.
#define btnPAUSEtime   400 //Значение в миллисекундах паузы между повторами
int lcd_key     = btnNONE;  //Для хранения полученного значеник кнопки
byte keyTemp = btnNONE; //Переменная для хранения временного состояния кнопок
byte keyCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
unsigned long BtnTime; //Хранит время начала нажатия кнопок
byte btnCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
byte btnTemp=btnNONE; //Для хранения номера ранее нажатой кнопки
#define ButtonPin A7 //Сюда подключены кнопки
//************


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);
 
  lcd.begin(16,2); //Инициализируем экран
 
 
  //Установим на выходах 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);
 
  lcd.setCursor(0, 0); //устанавливаем курсор
  lcd.print("Stepper control"); //выводим на него  строку
  lcd.setCursor(0, 1); //устанавливаем курсор
  lcd.print("R   B   "); //выводим на него  строку
  lcd.setCursor(0, 1); //устанавливаем курсор
  lcd.cursor(); //Включим курсор
  lcd.blink(); //Пусть мигает
 
  delay(100);
}

void loop() {
  lcd_key=read_LCD_buttons(); //прочитаем нажатую кнопку
  if (lcd_key) //Нажата какая-то кнопка
  {
      Serial.print("Button=");
      Serial.println(lcd_key,DEC);
    if (btnRIGHT==lcd_key) //нажата кнопка ВПРАВО
    {
      lcd.setCursor(4, 1);
      ControlMode = 1;
    }
    if (btnLEFT==lcd_key) //нажата кнопка ВЛЕВО   
    {
      lcd.setCursor(0, 1);
      ControlMode = 0;
    }
  }


   if (ControlMode) //Если режим "кнопки"
     {
       if (btnUP==lcd_key) //Если нажата кнопка "Больше"
         {OutFreq+=1;}
       if (btnDOWN==lcd_key) //Если нажата кнопка "Меньше"
         {OutFreq-=1;} 
       if (lcd_key) //Если вообще что-то нажато
       {
         lcd.setCursor(5, 1);
         lcd.print("   "); //чистим вывод
         lcd.setCursor(5, 1);
         lcd.print(OutFreq); //выводим Частоту
         lcd.setCursor(4, 1);
         SetupTimer2(OutFreq);
       }
     }
   else //Если режим резистор (светодиод выключен)
     {
        //Тут будем читать занчение
        sensorValue=analogRead(Resistor_pin); 
        //Сравним значение со старым, если отличается - пересчитаем установку таймера
        if (sensorValue!= OLDsensorValue)
          {  //Serial.println("ReCall"); //debug
           OLDsensorValue=sensorValue;
           OutFreq = LowFreq+FreqStep*sensorValue; //Вычислим новое значение частоты
           lcd.setCursor(1, 1);
           lcd.print("   "); //Чистим вывод
           lcd.setCursor(1, 1);
           lcd.print(OutFreq); //выводим Частоту
           lcd.setCursor(0, 1);
           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;}
}



// *****************************
//Чтение кнопок с антидребезгом
// read the buttons
int read_LCD_buttons()
{
int adc_key_in = analogRead(ButtonPin);      // Получаем напряжение с АЦП
byte btnTempTemp = btnNONE; //Переменная для хранения свежесчитанного внутри функции
//digitalWrite (LED_pin,0); //debug
//lcd.setCursor(5, 0); //debug
//lcd.print(adc_key_in); //debug
//delay (400); //debug
//Тут используем millis() для отслеживания нажатия кнопки
// Запоминиаем в переменной BtnTime ВРЕМЯ НАЧАЛА нажатия
// Запоминаем в переменной btnTemp нажатия
// Дефиним время антидребезга #define

if (adc_key_in > 950) //Ничего не нажато
  {
   //BtnTime=0; //Скидываем время нажатия
   btnCONTpress=0;
   return btnNONE; // We make ths the 1st option for speed reasons since it will be the most likely result
  }
else //что-то нажато
   {
      if (adc_key_in < 790) { btnTempTemp=btnSELECT; } //Определяем в переменную ТЕКУЩУЮ нажатую кнопку.
      if (adc_key_in < 555) { btnTempTemp=btnLEFT; }
      if (adc_key_in < 380) { btnTempTemp=btnDOWN; }
      if (adc_key_in < 195) { btnTempTemp=btnUP; }
      if (adc_key_in < 50)  { btnTempTemp=btnRIGHT; }

     //А тут проверим, совпадает ли с btnTemp (была ли нажата ранее)
/*     lcd.setCursor(0, 0); //debug
     lcd.print(btnTempTemp); //debug
     lcd.setCursor(2, 0); //debug
     lcd.print(btnTemp); //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 (btnTempTemp==btnTemp) //Кнопка уже БЫЛА нажата
     {
        if (btnCONTpress) //Повторные установки клавиши
          {
            if ((millis()-BtnTime) > btnPAUSEtime)
            {
              BtnTime=millis(); // Ставим стартово время для автоповтора
              return btnTemp;
            }
          } 
        else //Первая установка клавиши
           {
              if ((millis()-BtnTime) > btnDEFtime)
              {
                btnCONTpress=1;
                BtnTime=millis(); // Ставим стартово время для автоповтора
                return btnTemp;
              }
           }
       
     }
     else //Раньше было другое состояние
     {
//       digitalWrite (LED_pin,1); //debug
//       delay (100);
       btnCONTpress=0;
       BtnTime=millis(); //Устанавливаем ТЕКУЩЕЕ время в переменную BtnTime
       btnTemp=btnTempTemp; //устанавливаем кнопку во временную переменную.
     }
   }
return btnNONE;   // Если ничего не сработало, то ничего не возвращаем
}
//***********************************

Все должно быть интуитивно понятно. :)
Влево-вправо для выбора режима
вверх-вниз - для изменения. Резистор пока оставил.
Энкодер готов?
PS Исправил код чуть-чуть для эстетики.

Добавлено спустя 12 минут 44 секунды:
Да не надо SMD.
Так, теперь важный вопрос - скоростью экструдера будем управлять/стабилизировать или только контролировать и подстраивать под нее протяжку?

Добавлено спустя 7 минут 7 секунд:
Блин, я в код забыл обработку оптодатчика дописать. Если успею - то сегодня сделаю.

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

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

Сообщение Revenger » 26 авг 2015, 15:32

Экран и всё остальное попробую чуть позже, вытащил ардуинку из корпуса, собираю на макетке. Оптодатчик с резистором 200Ом готов (получилось СМД влепить :crazy: ). 4,7 пока не впаивал, т.к. не определённость пока в номинале.

Контроль как мне видится в определении оборотов экструдера и подгонки под это скорость протяжки. Как минимум. Если еще через какое-то меню можно будет управлять скоростью - только плюс! Просто я думаю, что задав переменником на шимконтроллере скорость его вращения, подогнав под это скорость протяжки, ардуино остаётся только "зависнуть" в паре и поддерживать синхронно скорость. Увеличивать обороты экструдера программно разве получится?
Это как я вижу. Что выйдет в реальности пока не могу даже представить. )
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение RootAdmin » 26 авг 2015, 16:56

Получится-получится. Мы можем с помощью всего пары транзисторов (дохлая материнка есть? Ну или купить за 100 рублей) организовать тот же шим-контроллер. С программным управлением скоростью.
Так, у нас немного разные оптосенсоры, мультиметр есть? типа
мультиметр.jpg
мультиметр 838


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

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

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

Транзисторы есть ИРФ (брал для флокатора мощные) и есть материнки и БП. :roll:

Есть точно такой мультиметр.
Чичас впаяю и проверю.

Добавлено спустя 12 минут 53 секунды:
У меня получается 3,2 и 2,2 соответственно.
Добавил на макетке ещё 4,7 и напряжение поднялось на 1В и так и так, т.е. 4,8 и 3,8В.
Последний раз редактировалось Revenger 26 авг 2015, 18:15, всего редактировалось 1 раз.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

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

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

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

Сообщение Revenger » 26 авг 2015, 18:15

ща 5 сек. 4,7 уже добавлял... выше написал.

Получилось с 15кОм (плюс к тем 4,7) :Yahoo!:
Вышло 4,7 и 0,8 (+-)
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

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

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

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

Сообщение Revenger » 26 авг 2015, 18:36

Да я не знаю.. наверное в минуту. Экструдер то крутится не очень быстро вроде.

п.с. а резистор получается можно 20кОм или все же нужно 19,7? Хочу перепаять смд. Уж очень симпатиШно смотрится прямо на платке. Хотя может просто когда ардуину собирать в общий узел, там этот 15кОм воткнуть да и не забивать голову...
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Пред.След.

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

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

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