roboforum.ru

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


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

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

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

Сообщение RootAdmin » 30 окт 2015, 18:40

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

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

Сообщение Revenger » 31 окт 2015, 12:17

А по "нашему" вопросу нет пока новостей/изменений ? :oops:
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение tapki1987 » 01 ноя 2015, 22:54

RootAdmin писал(а):Без разницы - какие пины, это в общем. А в частностях... Куда у вас подключен пин драйвера 'step'? К какому выводу ардуины?

1. Мотор подключен к оси Y а пин step к аналогову выходу А6 подключен
tapki1987
 
Сообщения: 12
Зарегистрирован: 28 окт 2015, 15:25

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

Сообщение RootAdmin » 02 ноя 2015, 17:06

Revenger писал(а):А по "нашему" вопросу нет пока новостей/изменений ? :oops:

на работе аврал.
Возрастание скорости - поправил.
Код: Выделить всёРазвернуть
/*
Управление шаговиком (драйвер степ-дир) переменным резистором
теперь с кнопками! :)
А на этот раз - с экраном и резистивными кнопками.
Добавил измерение скорости вращения экструдера. Чуть подправил генерацию импульса на шаговик.
Управление преработано. Кнопка Select переключает режим "выбор" и "редактирование" Частота экструдера - в оборотах в минуту.
Добавлен коэффициент
Исправлена ошибка возрастания скорости.
v 0.7 */

/*
Вывод    Назначение
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 <EEPROM.h> //подключаем библиотеку EEPROM

#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 OptoSensor_pin 2 //вывод Arduino для оптодатчика (вход)
#define ToothSumm 4 //сколько усреднять событий
#define ToothAll 140 // Событий на оборот
float ExtruderConst=(float)1/((float)(ToothAll/ToothSumm)*((float)1/250000)); // Коэффициент тиков :) Для оборотов в СЕКУНДУ делим его на измеренные
float DivK =500; //Коэффициент для соотношения скорости шаговика к скорости экструдера

volatile unsigned long OptoSensorTicks=0;//Переменная для хранения тиков таймера на 1 вызов (время между зубьями)
volatile byte OptoToothCounter =0; //Указатель на текущтй зуб в массиве
volatile unsigned int OptoToothTimeArray [ToothSumm]; //массив с таймингами зубьев




//********** Кнопки:
#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; //Для хранения номера ранее нажатой кнопки
#if defined(Razr)  //Мне для отладки
    #define ButtonPin A7 //Сюда подключены кнопки
#else
  #define ButtonPin A1 //Сюда подключены кнопки
#endif
//************

/*
//структура под меню
typedef struct
{
     char* nam;
    byte posX;
    byte posY;
} menu;
//typedef struct menu menuEl;

menu menus[3] ={{"Mm1",0,0},
{"Mm2",1,1},
{"Mm3",3,3}};
*/



byte ControlPos = 0; //Переменная определяет элемент в строке управления. 1 - коэффициент. 0 - частота протяжки
byte ControlMode = 0; //Переменная определяет режим управления. 0 - выбор, 1 - редактирование
int ScreenPass =100; //Для пропуска циклов, чтоб экран не мерцал.


volatile unsigned char FullTimer0; //Переменная для остатка значения таймера
volatile unsigned int FullTimer256;//Переменная для количества холостых 256циклов таймера
volatile unsigned int FullTimer256Count; //внутренный счетчик таймера


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


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

void setup() {               
  pinMode(Step_pin,OUTPUT);  // Конфигурим вывод Step_pin как выход
  pinMode(Dir_pin,OUTPUT);  // Конфигурим вывод Dir_pin как выход
//  pinMode(Resistor_pin,INPUT);  // Конфигурим вывод Dir_pin как вход

  pinMode(OptoSensor_pin,INPUT);  // Конфигурим вывод OptoSensor_pin как вход
  attachInterrupt(0, OptoSensor, CHANGE); // привязываем 0-е прерывание к функции OptoSensor(). На изменение состояния. Да, из-за разницы между шириной самого зуба и межзубного расстояния - будут различия, усредним.
 
  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); 
 
  //Запускает таймер и получает загружаемое значение таймера.
  //Параметр - желаемая частота в герцах.
 
   FullTimer0=SetupTimer2(OutFreq);
   
  //Установки Таймер2: Делитель частоты /64, режим 0
  //Частота = 16MHz/32 = 500000 герц или
  //Делитель /32 дает нам лучший рабочий диапазон в районе 1 кгц
  //так что сейчас мы просто жестко запрограммируем это.
  TCCR2A = 0;
  TCCR2B = 0<<CS22 | 1<<CS21 | 1<<CS20; //это на 32
  //TCCR2B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 64
  //TCCR2B = 1<<CS22 | 0<<CS21 | 1<<CS20; //это на 128
  //Подключение прерывания по переполнению Timer2
  TIMSK2 = 1<<TOIE2;

  //Установки Таймер1: Делитель частоты /64, режим 0
  //Частота = 16MHz/64 = 250000 герц или
  //Делитель /64 дает нам хороший рабочий диапазон
  //так что сейчас мы просто жестко запрограммируем это.
  TCCR1A = 0;
  TCCR1B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 64
  //Подключение прерывания по переполнению Timer0 (для обнуления скорости)
  TIMSK1 = 1<<TOIE1;
   
 
  //Выводит загружаемое значение таймера
  Serial.print("Timer2 Load:");
  Serial.println(FullTimer0,HEX);
 
  lcd.setCursor(0, 0); //устанавливаем курсор
  lcd.print("Stepper control"); //выводим на него  строку
  lcd.setCursor(0, 0); //устанавливаем курсор
  lcd.print("#St  Div  Ext"); //выводим на него  строку
  lcd.setCursor(0, 0); //устанавливаем курсор
//  lcd.cursor(); //Включим курсор
//  lcd.blink(); //Пусть мигает
 
  delay(10);
}

void loop() {
OptoSensorTicks=0;
//Один тик таймера - это 4 микросекунды (.000004) Зубъев у нас 70, причем реагируем на вход зуба а оптосенсор и на выход. Значит - 140 событий на оборот экструдера.
//Складывая время
for (int i=0; i<ToothSumm; i++)   {OptoSensorTicks+=OptoToothTimeArray[i];}
ScreenPass++; //Инкремент счетчика
if (ScreenPass>1000)
{
  ScreenPass=0; //Обнуляем счетчик
 
        lcd_key=read_LCD_buttons(); //прочитаем нажатую кнопку
      //0   4   8   12  |
      // St  Div  Ext
      //000  00000 00000
       
        if (lcd_key) //Нажата какая-то кнопка
        {
           if (btnSELECT==lcd_key) //Если нажата кнопка Select
             {
               ControlMode=!ControlMode;
               if (ControlMode)
               {
                 if (ControlPos==0)
                     {
                       lcd.setCursor(0, 0);
                        lcd.print("*");
                        lcd.setCursor(4, 0);
                        lcd.print(" ");
                     }
                 if (ControlPos==1)
                     {
                        lcd.setCursor(0, 0);
                        lcd.print(" ");
                        lcd.setCursor(4, 0);
                        lcd.print("*");
                     }
                 }
                 else
                 {
                   lcd.setCursor(0, 0);
                   lcd.print(" ");
                   lcd.setCursor(4, 0);
                   lcd.print(" ");
                   if (ControlPos==1){lcd.setCursor(4, 0); lcd.print("#"); }
                   if (ControlPos==0){lcd.setCursor(0, 0); lcd.print("#"); }
                 }
              } //Меняем режим на другой :)
           if (ControlMode) //Если режим - "редактирование"
             {
               if (btnUP==lcd_key) //Если нажата кнопка "Больше"
                 {
                       if (ControlPos==0) //Меняем частоту протяжки шагами
                         {
                           OutFreq+=10;
                           SetupTimer2(OutFreq); //устанавливаем таймер
                          }
                       if (ControlPos==1) //Меняем коэффициент шагами
                         {DivK+=1;}
                  }
               if (btnDOWN==lcd_key) //Если нажата кнопка "Меньше"
                 {
                       if (ControlPos==0) //Меняем частоту протяжки шагами
                         {
                           OutFreq-=10;
                           SetupTimer2(OutFreq); //устанавливаем таймер
                          }
                       if (ControlPos==1) //Меняем коэффициент шагами
                         {DivK-=1;}
                  }
               if (btnRIGHT==lcd_key) //Если нажата кнопка "ВПРАВО"
                 {
                       if (ControlPos==0) //Меняем частоту протяжки единицами
                         {
                           OutFreq+=1;
                           SetupTimer2(OutFreq); //устанавливаем таймер
                          }
                       if (ControlPos==1) //Меняем коэффициент единицами
                         {DivK+=.01;}
                  }
               if (btnLEFT==lcd_key) //Если нажата кнопка "ВЛЕВО"
                 {
                       if (ControlPos==0) //Меняем частоту протяжки единицами
                         {
                           OutFreq-=1;
                           SetupTimer2(OutFreq); //устанавливаем таймер
                         }
                       if (ControlPos==1) //Меняем коэффициент единицами
                         {DivK-=.01;}
                  }
             }
            else //режим "выбор"
             {
                if (btnRIGHT==lcd_key) //нажата кнопка ВПРАВО
                  {
                    lcd.setCursor(0, 0);
                    lcd.print(" ");
                    lcd.setCursor(4, 0);
                    lcd.print("#");
                    ControlPos = 1;
                  }
                if (btnLEFT==lcd_key) //нажата кнопка ВЛЕВО   
                {
                    lcd.setCursor(4, 0);
                    lcd.print(" ");
                    lcd.setCursor(0, 0);
                    lcd.print("#");
                    ControlPos = 0;
                }
             }
        }
             
             
      //Теперь в зависимости от режима нужно...
      //Либо считать частоту шаговика от коэффициента при ControlMode==1 и ControlPos==1
      //Либо вычислять коэффициент при ControlMode==1 и ControlPos==0
      //Либо вычислять частоту шаговика от коэффициента при ControlMode==0
      //Короче, только при ControlMode==1 и ControlPos==0 вычислять коэффициент. В остальных случаях - частоту.
       if ((ControlMode==1) && (ControlPos==0)) //Если режим - редактирование, изменение шаговика
        {
         DivK= ((float)OutFreq*(float)OptoSensorTicks)/1000;  //Вычислим коэффициент
         }
      else
        {
          OutFreq=((float)DivK*1000)/(float)OptoSensorTicks;
          if (OutFreq>HighFreq){OutFreq=HighFreq;}
          if (OutFreq<LowFreq){OutFreq=LowFreq;}
          SetupTimer2(OutFreq); //устанавливаем таймер
        }
 
      //Выведем коэффициент
         lcd.setCursor(8, 1);
         lcd.print(DivK, DEC);
     
      //выведем скорость
          lcd.setCursor(10, 0);
          lcd.print("     ");
          lcd.setCursor(10, 0);
          lcd.print(ExtruderConst/OptoSensorTicks, DEC);
         
      //    lcd.setCursor(9, 1);
      //    lcd.print("     ");
      //    lcd.setCursor(9, 1);
      //    lcd.print(OptoSensorTicks);
     
          lcd.setCursor(0, 1);
          lcd.print(OutFreq/200); //выведем частоту в оборотах в СЕКУНДУ. Коэффициент 1 секунд*200 имп.оборот = 200
     
       
          /*
            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(FullTimer0,DEC);
           
            Serial.print("ButtPressed=");
            Serial.println(ButtPressed,DEC);
            Serial.print("OutFreq=");
            Serial.println(OutFreq,DEC);
            Serial.println("***");
            Serial.println("");
         
          Serial.println("***");   
            Serial.print("OutFreq=");
            Serial.println(OutFreq,DEC);
          Serial.println(OptoSensorTicks);
          delay (200);
         
             
              Serial.println("***");   
              Serial.print(FullTimer256);
              Serial.print("===");
              Serial.println(FullTimer0);
              */
}

}

//Timer1 указатель вектора прерывания по переполнению
ISR(TIMER1_OVF_vect)
{
    OptoToothTimeArray[OptoToothCounter]=65535; //присваиваем элементу массива максимальное значение
    OptoToothCounter++; //инкрементим счетчик
    if (ToothSumm==OptoToothCounter) {OptoToothCounter=0;} //если счетчик равен количеству элементов массива (а индекс массива начинается с 0 - то обнуляем.
}

//Timer2 указатель вектора прерывания по переполнению
ISR(TIMER2_OVF_vect)
{
  noInterrupts(); //Запретили прерывания
  if (FullTimer256Count==0) // Срабатывание
        {
         //Переключение IO-вывода в HIGH
          digitalWrite(Step_pin,HIGH); //Переключение IO-вывода в HIGH (Старт импульса)
         FullTimer256Count=FullTimer256;
//         //Переключение IO-вывода в другое состояние.
//         digitalWrite(Step_pin,!digitalRead(Step_pin));
            //Перезагрузка таймера и коррекция по задержке
            if (!FullTimer256)
//                {TCNT2=0;} //Если холостые циклы есть  - максимальное значение
//            else
//                {TCNT2+=FullTimer0;}
                  {TCNT2=FullTimer0;}
          digitalWrite(Step_pin,LOW); //Переключение IO-вывода в LOW (Стоп импульса)
        }
  if (FullTimer256Count==1) //предпоследний цикл
     {
       TCNT2=FullTimer0;
       FullTimer256Count=0;
     }
  if (FullTimer256Count>1) //Обычный цикл
     {FullTimer256Count--;}
  interrupts(); //Разрешили прерывания
}


#define TIMER_CLOCK_FREQ 1000000.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
unsigned char SetupTimer2(float timeoutFrequency){
  //Подсчет начального значения таймера
  //Слегка усложним, добавив холостые просчеты
  long ticks = TIMER_CLOCK_FREQ/timeoutFrequency; // тиков счетчика для получения заданной частоты
//          #if defined(Razr)
//             lcd.setCursor(9, 0);
//             lcd.print(ticks);
//          #endif
  FullTimer256=ticks/256; //Вычисляем количество ПОЛНЫХ 256 циклов таймера
  ticks-=FullTimer256*256;
  ticks-=8;
  FullTimer0=(byte)(255.0-ticks);  //Вычисляем количество доплнительных тиков таймера
  //загружает таймер для первого цикла
  //Сейчас не надо, убираю.
//  if (FullTimer256)
//    {TCNT2=0;} //Если холостые циклы есть  - максимальное значение
//  else
//      {TCNT2=FullTimer0;}
}



// *****************************
//Чтение кнопок с антидребезгом
// 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;   // Если ничего не сработало, то ничего не возвращаем
}
//***********************************

void OptoSensor() // функция обработки прерывания. Меняет глобальные прееменные
{//Сработал - значит считаем тики. F njxytt - echtlyztv pf
  OptoToothTimeArray[OptoToothCounter]=TCNT1; //присваиваем элементу массива текущее значение таймера
  TCNT1 = 0; //сбрасываем таймер
  OptoToothCounter++; //инкрементим счетчик
  if (ToothSumm==OptoToothCounter) {OptoToothCounter=0;} //если счетчик равен количеству элементов массива (а индекс массива начинается с 0 - то обнуляем.
}



tapki1987 писал(а):
RootAdmin писал(а):Без разницы - какие пины, это в общем. А в частностях... Куда у вас подключен пин драйвера 'step'? К какому выводу ардуины?

1. Мотор подключен к оси Y а пин step к аналогову выходу А6 подключен

Ну, тогда в начале скетча, там где define
Код: Выделить всёРазвернуть
#define Step_pin 6 //вывод Arduino для ноги STEP контроллера (выход)
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера (выход)
#define Resistor_pin A0 //вывод Arduino резистора 0-5вольт (аналоговый вход)

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

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

Сообщение Revenger » 02 ноя 2015, 17:46

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

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

Сообщение RootAdmin » 02 ноя 2015, 17:52

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

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

Сообщение Revenger » 02 ноя 2015, 17:59

Ну в стандартном скетче используются 4 цифровых выхода 8-11. А датчик.. х.з. просто кучку фоторезисторов купил, сопротивление можно померить (что написано указал ниже).. или использовать можно готовый модуль с реле и фоторезистором (хотя уже излишество получится).

Описание товара
Максимальное напряжение (DC): 150
Максимальная рассеиваемая мощность (мВт): 100
Температура окружающей среды (?? C):-30 --- + 70
Спектральный пик (нм): 540

В Пакет включено:
20 шт. фоторезистор GL5528
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение Revenger » 04 ноя 2015, 03:14

Блин.. не могу прошить с помощью приехавшего ТТЛ адаптора. Вроде дрова стали, а не грузится ничего. Ошибка stk500_getsync() attempt 10 of 10: not in sync: resp=0x86
Как когда-то у меня было. А что я делал уже не помню (( Новая задачка ))
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение RootAdmin » 04 ноя 2015, 13:44

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

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

Сообщение Revenger » 04 ноя 2015, 16:20

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

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

Сообщение Revenger » 06 ноя 2015, 19:27

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

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

Сообщение Revenger » 07 ноя 2015, 10:28

Проверил на экструдере - работает вроде как надо! Т.е. обороты падают при выключении экструдера. Единственно, они падают как-то ступенями, т.е. идут падение импульса в зоне оптодатчика с задержками "лесенкой", не сразу на ноль. Но думаю это не принципиально.
Будет сегодня время, хочу попробовать пластика подавить. Если успею протяжку переделать на ШД, а то паутина по всем углам будет ))
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

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

Сообщение RootAdmin » 09 ноя 2015, 12:49

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

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

Сообщение Revenger » 09 ноя 2015, 13:49

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

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

Сообщение Revenger » 10 ноя 2015, 21:41

Блин, получил сегодня еще несколько посланий из чины, и в общем списке, вместо ардуино нано прислали снова прошку, разве что на атмеге 328, а не как ранее я брал 168-е. Теперь "жги не хочу" ))) Осталось еще уно дождаться и будет почти полный набор девайсов ))

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

Пред.След.

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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 2

Mail.ru counter