ПРограмирование шагового двигателя

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

ПРограмирование шагового двигателя

Сообщение kabephe » 30 окт 2014, 14:32

Появилась нужда в том, чтобы понять как настраивать шаговый двигатель с помощью ардуино и uim24004. Поиск в гугле не помог разобраться. Помогите набросать простенькую программу для запуска, реверса с возможностью смены скорости шагового двигателя. Сам что-то тугодумлю. Буду очень признателен.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение Myp » 30 окт 2014, 15:28

а открыть стандартный пример управления шаговиком религия не позволяет?
http://arduino.cc/en/Reference/Stepper
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 30 окт 2014, 15:53

Открывал. Возможно просто не понимаю, как она работает. Находил скетчи с подключением двух ШД, за не имением опыта и знаний в программировании не смог разобраться, как они работают. Там программировались выходы на направления движения двигателей( вперед или реверс) меандр и значения уровней сигналов(высокий или низкий на выходы отвечающие за остановку). В примере же я такого не заметил. Если ШД поключить к уиму, а уим к ардуино с загруженным примером скетча, что произойдет?
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение Myp » 30 окт 2014, 17:40

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

какое ТЗ? просто поиграться или нужно сделать устройство?
драйвер какой-то неизвестный, похоже что обычный степ/дир, тогда лучше вот такую библиотечку использовать
http://www.airspayce.com/mikem/arduino/ ... index.html
для разных станков используется например GRBL
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 30 окт 2014, 18:14

У меня до покупки драйверов ШД одна ардуинка с GRBL командовала по степ-дир другой. А вторая - уже вертела тремя шаговиками через ключи.
Код: Выделить всё
/*
ServoStepper
Управление шаговым двигателем
*/

// ISR pinchangeint interrupt service routine
#include <C:\Work\arduino-1.5.2\libraries\PinChangeInt\PinChangeInt.h>


unsigned int latency ;
unsigned int latencySum ;
unsigned int sampleCount ;
unsigned char timerLoadValue;
// volatile int TestPerem; //Буду инкрементить в обработчике
// volatile int dir; //Направление вращения двигателя

#define Dir_X_pin 5 // Пин направления X
#define Dir_Y_pin 6 // Пин направления Y
#define Dir_Z_pin 7 // Пин направления Z


#define motor_X_pin_1 10
#define motor_X_pin_2 11
#define motor_X_pin_3 12
#define motor_X_pin_4 13


#define motor_Y_pin_1 A0
#define motor_Y_pin_2 A1
#define motor_Y_pin_3 A2
#define motor_Y_pin_4 A3

#define motor_Z_pin_1 8
#define motor_Z_pin_2 9
#define motor_Z_pin_3 A4
#define motor_Z_pin_4 A5

volatile long StepXcounter; //Шаги по X
volatile long StepYcounter; //Шаги по Y
volatile long StepZcounter; //Шаги по Z

byte locateStat; //Статус сигнал (1-есть)
volatile byte locateSensor; //Для хранения считанного
//unsigned int locatecount; //счетчик количества принятых одинаковых состояний

//Массив для моторов

int MotorPins[] = {motor_X_pin_1, motor_X_pin_2, motor_X_pin_3, motor_X_pin_4, motor_Y_pin_1, motor_Y_pin_2, motor_Y_pin_3, motor_Y_pin_4, motor_Z_pin_1, motor_Z_pin_2, motor_Z_pin_3, motor_Z_pin_4 };
//шаги для моторов
volatile byte curstep[]= {0, 0, 0}; //текущий шаг

//uint8_t latest_interrupted_pin; //для PinChangeInt
//uint8_t interrupt_count[20]={0}; // 20 possible arduino pins //для PinChangeInt
//void quicfunc() {
//  latest_interrupted_pin=PCintPort::arduinoPin;
//  interrupt_count[latest_interrupted_pin]++;
//}

void setup() {       

//Запускает последовательный порт
//Serial.begin(9600);
Serial.begin(115200);
  StepXcounter=0; //Сбросим счетчик шагов X
 
 


  pinMode(motor_X_pin_1, OUTPUT);
  pinMode(motor_X_pin_2, OUTPUT);
  pinMode(motor_X_pin_3, OUTPUT);
  pinMode(motor_X_pin_4, OUTPUT);
  pinMode(motor_Y_pin_1, OUTPUT);
  pinMode(motor_Y_pin_2, OUTPUT);
  pinMode(motor_Y_pin_3, OUTPUT);
  pinMode(motor_Y_pin_4, OUTPUT);
  pinMode(motor_Z_pin_1, OUTPUT);
  pinMode(motor_Z_pin_2, OUTPUT);
  pinMode(motor_Z_pin_3, OUTPUT);
  pinMode(motor_Z_pin_4, OUTPUT);
Serial.println("Motor setup end");
  Serial.println(motor_Y_pin_1);
    Serial.println(motor_Y_pin_2);


 
//  locateStat=0;
//  TestPerem=locateStat;
 
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  //pinMode(13, OUTPUT);

pinMode(Dir_X_pin, INPUT); digitalWrite(Dir_X_pin, LOW);  //Пин для направления по оси Х
pinMode(Dir_Y_pin, INPUT); digitalWrite(Dir_Y_pin, LOW);  //Пин для направления по оси Y
pinMode(Dir_Z_pin, INPUT); digitalWrite(Dir_Z_pin, LOW);  //Пин для направления по оси Z
//pinMode(LOC_POWER,OUTPUT);
//pinMode(LOC_INPUT,INPUT);
//digitalWrite(LOC_POWER, HIGH);
   pinMode(2, INPUT); digitalWrite(2, LOW);
attachInterrupt(0, Step_X_int, RISING);    // Разрешить прерывание по изменению состояния вывода 2
   pinMode(3, INPUT); digitalWrite(3, LOW);
attachInterrupt(1, Step_Y_int, RISING);    // Разрешить прерывание по изменению состояния вывода 3
   pinMode(4, INPUT); digitalWrite(4, LOW);
PCintPort::attachInterrupt(4, Step_Z_int, RISING);   // Разрешить прерывание по изменению состояния вывода 4


interrupts();                                 // Разрешить прерывания глобально
  Serial.println("---------------------------------------");


//Сообщение о запуске программы
Serial.println("Timer2 Test"); 

//Запускает таймер и получает загружаемое значение таймера.
timerLoadValue=SetupTimer2(10);

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

void loop() {
 
     
       
      //  digitalWrite(13, HIGH);   // set the LED on
        delay(10);              // wait
//        digitalWrite(13, LOW);    // set the LED off

      sampleCount++;
     
      //Как только наберется 10 замеров, вычисляет и выводит результат измерений
      if(sampleCount>100) {

     

      //обнуляет значения сумм
      sampleCount=0;
      latencySum=0;
     

      //Выводит инфо
  Serial.println("count:");
  Serial.print(" Int_X=");
  Serial.println (StepXcounter);     
  Serial.print(" Int_Y=");
  Serial.println (StepYcounter);
  Serial.print(" Int_Z=");
  Serial.println (StepZcounter); 
  Serial.print(" curstep[0]=");
  Serial.println (curstep[0]); 
//      Serial.println(latest_interrupted_pin);
 

    }
       
       
}



void Step_X_int()
{
//  digitalWrite(13, HIGH);
  if (digitalRead(Dir_X_pin))
    {StepXcounter++;
    stepMotor(0 ,1);}
  else
    {StepXcounter--;
    stepMotor(0 ,0);}
 

//  Serial.print(" Int_X=");
//  Serial.println (StepXcounter);
}

void Step_Y_int()
{
//  digitalWrite(13, HIGH);
  if (digitalRead(Dir_Y_pin))
    {StepYcounter--;
     stepMotor(1 ,1);}
  else
    {StepYcounter++;
     stepMotor(1 ,0);}
//  Serial.println(" Int_Y");
}

  void Step_Z_int()
{
//  latest_interrupted_pin=PCintPort::arduinoPin;
//  interrupt_count[latest_interrupted_pin]++;
//  digitalWrite(13, HIGH);
    if (digitalRead(Dir_Z_pin))
    {StepZcounter--;
      stepMotor(2 ,1);}
  else
    {StepZcounter++;
      stepMotor(2 ,0);}
//  Serial.println(" Int_Z");
}




//Timer2 указатель вектора прерывания по переполнению
ISR(TIMER2_OVF_vect) {

  //Проверим направление, если больше границ - поменяем на противоположное
// if (curstep> 6000 || curstep<0){dir=-dir;}
// curstep+=dir;

//  stepMotor(curstep);


//Захват текущего значения таймера. Это величина ошибки
//из-за задержки обработки прерывания и работы этой функции
int latency=TCNT2;

//Перезагрузка таймера и коррекция по задержке
//TCNT2=latency+timerLoadValue;
TCNT2=timerLoadValue;
}





long SetupTimer2(long Frequency){
#define TIMER_CLOCK_FREQ 15625.0 //УКАЗЫВАЕМ ПОСЛЕ делителя. Имеено ПОСЛЕ
//#define  TIMER_CLOCK_TICK 2000000.0

//2MHz for /8 prescale from 16MHz
//Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает количество тиков таймера на один период требуемой частоты
int  CountPer=((257.0-(TIMER_CLOCK_FREQ / (long)Frequency))+0.5);

//Установки Таймер2: режим 0
TCCR2A = 0;

//Частота = 16MHz/1024 = 15625 герц или 64 мкс
//Делитель /1024 дает нам хороший рабочий диапазон
//так что сейчас мы просто жестко запрограммируем это.
//в битах CS22 (2), CS21 (1), CS20 (0) регистра TCCR2B которые устанавливают режим тактирования.
// •000 - таймер остановлен
// •001 - CLK
// •010 - CLK/8
// •011 - CLK/32
// •100 - CLK/64
// •101 - CLK/128
// •110 - CLK/256
// •111 - CLK/1024

TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20; //это на 8

//Подключение прерывания по переполнению Timer2
TIMSK2 = 1<<TOIE2;
//загружает таймер для первого цикла (если меньше 255, или
//TCNT2=0;

return(CountPer);

}

void stepMotor(int Motor, int Step) //Motor - от 0 до 2 номер мотора Step 0 или +1
{
//Serial.println(curstep[Motor]);
int i; //Сдвиг для номеров пинов мотора
  if (Step)
   {
//      Serial.println("StepMotor Step=1");
     if (curstep[Motor]==7)
     {curstep[Motor]=0;}
    else
     {curstep[Motor]++;}
   }
  else
  {
//    Serial.println("StepMotor Step=0");
    if (curstep[Motor]==0)
     {curstep[Motor]=7;}
    else
      {curstep[Motor]--;}
   }
   
  i=Motor*4; //Сдвиг пинов в массиве MotorPins[]
 
//Serial.println(curstep[Motor]);
    switch (curstep[Motor]) {
      case 0:    // 1000
   //   digitalWrite(MotorPins[1], HIGH);
      digitalWrite(MotorPins[i+1], LOW);
   //   digitalWrite(MotorPins[i+2], LOW);
      digitalWrite(MotorPins[i+3], LOW);
      break;
     case 1:    // 1100
      digitalWrite(MotorPins[i], HIGH);
      digitalWrite(MotorPins[i+1], HIGH);
     // digitalWrite(MotorPins[i+2], LOW);
     // digitalWrite(MotorPins[i+3], LOW);
      break;
     case 2:    // 0100
      digitalWrite(MotorPins[i], LOW);
     // digitalWrite(MotorPins[i+1], HIGH);
      digitalWrite(MotorPins[i+2], LOW);
    //  digitalWrite(MotorPins[i+3], LOW);
      break;
     case 3:    // 0110
     // digitalWrite(MotorPins[i], LOW);
      digitalWrite(MotorPins[i+1], HIGH);
      digitalWrite(MotorPins[i+2], HIGH);
     // digitalWrite(MotorPins[i+3], LOW);
      break;
     case 4:    // 0010
     // digitalWrite(MotorPins[i], LOW);
      digitalWrite(MotorPins[i+1], LOW);
    //  digitalWrite(MotorPins[i+2], HIGH);
      digitalWrite(MotorPins[i+3], LOW);
      break;
     case 5:    // 0011
  //    digitalWrite(MotorPins[i], LOW);
  //    digitalWrite(MotorPins[i+1], LOW);
      digitalWrite(MotorPins[i+2], HIGH);
      digitalWrite(MotorPins[i+3], HIGH);
      break;
     case 6:    // 0001
      digitalWrite(MotorPins[i], LOW);
    //  digitalWrite(MotorPins[i+1], LOW);
      digitalWrite(MotorPins[i+2], LOW);
     // digitalWrite(MotorPins[i+3], HIGH);
      break;
     case 7:    // 1001
      digitalWrite(MotorPins[i], HIGH);
    //  digitalWrite(MotorPins[i+1], LOW);
    //  digitalWrite(MotorPins[i+2], LOW);
      digitalWrite(MotorPins[i+3], HIGH);
      break;
  }
}

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

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 31 окт 2014, 05:59

Полное ТЗ - сделать управление двумя шаговиками с обратной связью по температуре. Чтобы при превышении какого-то порогового значения шаговики включались и работали на открытие рамки/створки, при понижении температуры(охлаждения) работали на закрытие. Грубо говоря простенькое устройство для поддержания температуры в садовой теплице. Из устройств есть только датчик температуры DS18S20, uim24004(http://www.machmo.com/stepperdrivers/pd ... M24008.pdf) и два шаговика. Если со снятием температуры пример библиотеки OneWire очень сильно помог, то с шаговиками не могу разобраться. До того, как появилась такая необходимость, с программированием даже близко не пересекался, поэтому вникать сразу трудно. Поэтому для начала и хочу с имеющимися у меня устройствами хотя бы запустить один шаговик, покрутить, посмотреть как скорость можно программно менять и т.д.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение Myp » 31 окт 2014, 10:20

ну значит AccelStepper то что нужно
там на странице с примерами есть несколько простых действий
вот например http://www.airspayce.com/mikem/arduino/ ... ample.html
для двух драйверов тока надо скетч сконфигурить правильно
AccelStepper stepper1(AccelStepper::DRIVER, 10, 11);
AccelStepper stepper2(AccelStepper::DRIVER, 12, 13);
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 31 окт 2014, 18:26

Спасибо за совет, прежде чем ринуться подключать устройства, хотелось бы уточнить ещё один момент. У драйвера, котрый у меня есть 6 выходов. V+ и GND - это для блока питания. Vcc подключается к ардуино на выход 5 вольтовый. С этими вроде как всё понятно и они от программы не зависят. А вот оставшиеся DIR(отвечающий за направление движения), STP(отвечающий за шаги) и EN( отвечающий за разрешение на работу шаговика). В примере библиотеки они не прописаны в явном виде. В связи с этим вопрос: они заданы в самой библиотеке и не имеет разницы к каким pin их подключать и сигналы на них будут подаваться автоматически или их работу надо самому программировать?
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 31 окт 2014, 18:59

Ну так у вас степ-дир драйвер. ИМХО - библиотека не для него.
А подобным управлять крайне просто:
На EN даем активный уровень (обычно низкий). На DIR ставим уровень, определяющий напрввление шага (1- в одну сторону, 0 - в другую). И даем импульс на STEP (миллисекундный, например, хватит). Все, один шаг сделан. Сколько импульсов дадим - столько и шагов получим. После - снимаем уровень с EN, для экономии энергии и исключения перегрева.. Если обесточенный двигатель сам не провернется.

Добавлено спустя 1 минуту 26 секунд:
Ноль как получать будем? Есть какой-то датчик полного закрытия/открытия створок?

Добавлено спустя 12 минут 19 секунд:
Ну, если реалтайм не нужен - можно просто процедуру написать типа
Код: Выделить всё
void stepMotor1(int dir, int step) //dir - направление step -сколько шагов
//Motor1EN - вывод EN 1 драйвера
//Motor1dir - направление первого
//Motor1step - шаг первого
{
     digitalWrite(Motor1EN, LOW);

  if (dir)
   {
    digitalWrite(Motor1dir, HIGH);}

    else
     {    digitalWrite(Motor1dir, LOW);}
digitalWrite(Motor1step, LOW);
for (int i=0;i<step; i++)
   {
     delay(200);
     digitalWrite(Motor1step, HIGH);
     delay(200);
     digitalWrite(Motor1step, LOW);
}
    delay(200); //чтобы успел шагнуть до выключения
     digitalWrite(Motor1EN, HIGH);
  }

Задержки написал от балды.
Минус - при работе двигателя вся прочая программа будет останавливаться. Что для терморегулировки ИММХО некритично.

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

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 31 окт 2014, 19:44

Механическая модель на данный момент выглядит так: есть готовая створка, открытие будет производиться вертикально, грубо говоря таким образом - || -> |\. Угол открытия >= 45 градусов. Шаговик приделан к внутренней части створки с помощью подвижного крепления, позволяющего угловое перемещение шаговика для того, чтобы не закусывался вал. Ноль определяться будет скорее из того, сколько шагов уже было сделано шаговым двигателем, т.е. обратное его возвращение на то же количество шагов. По вашему варианту на данный момент получилось так:
Код: Выделить всё
int Motor1EN = 10;
int Motor1dir = 12;
int Motor1step = 9;

void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
}
void loop ()

{
     digitalWrite(Motor1EN, LOW);

  if (dir)
   {
    digitalWrite(Motor1dir, HIGH);}

    else
     {    digitalWrite(Motor1dir, LOW);}
digitalWrite(Motor1step, LOW);
for (int i=0;i<step; i++)
   {
     delay(200);
     digitalWrite(Motor1step, HIGH);
     delay(200);
     digitalWrite(Motor1step, LOW);
}
    delay(200);
     digitalWrite(Motor1EN, HIGH);
  }

Из непонятного пока что: как задавать начальный уровень DIR, как в данном случае осуществляется реверс? Количество шагов задаётся путем замены слова step на нужное число или же как-то подругому в строчке:
Код: Выделить всё
for (int i=0;i<step; i++)
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 31 окт 2014, 23:31

Я дал готовую процедуру. В нее передаются два параметра: дир(направление) и степ(количество шагов). То есть в основной программе надо использовать двигатель - вызываем процедуру. И передаем в нее напрвление и количество шагов. Буду за компьютером завтра - напишу пример.

Добавлено спустя 8 минут 49 секунд:
Если грубо - то код, который я приводил вставляем послеоснлвного цикла и вызываем:
Код: Выделить всё
stepMotor1(1, 240) 

То есть сделать в направлении 1 240 шагов.
Или
Код: Выделить всё
stepMotor1(0, 50) 

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

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 01 ноя 2014, 11:12

Эх, вы будете ругаться. но я действительно мало понимаю на данный момент в программировании. Я похоже всё-таки что-то делаю не так. В программе что я привел выше, я добавляю строку "stepMotor1(1, 240);", и либо я её добавляю не туда, либо не так как надо, ибо каждый раз выдает ошибки:
Код: Выделить всё
sketch_oct31a.ino: In function 'void loop()':
sketch_oct31a:16: error: 'dir' was not declared in this scope
sketch_oct31a:18: error: 'stepMotor1' was not declared in this scope
sketch_oct31a:24: error: 'step' was not declared in this scope
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение Myp » 01 ноя 2014, 12:47

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

Добавлено спустя 2 минуты 50 секунд:
RootAdmin писал(а):Ну так у вас степ-дир драйвер. ИМХО - библиотека не для него.

как раз именно для него. в описании все возможные варианты указаны, она умеет крутить даже ШД с тремя обмотками, типа шпинделя из HDD, я выше даже привёл пример как правильно сконфигурить для драйвера степ дир.
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 01 ноя 2014, 14:04

Берем пример:
Код: Выделить всё
//Определяем пины:
int Motor1EN = 10;
int Motor1dir = 12;
int Motor1step = 9;

void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
  //тут стазу поставим выводы в неактивное состояние
  digitalWrite(Motor1EN, LOW);
  digitalWrite(Motor1dir, LOW);
  digitalWrite(Motor1step, HIGH);
}
void loop ()
{
//тут пишем код, получающий с датчика температуру и прочее.
//по полученной от датчика температуре - рулим мотором так:

//тут вызываем 50 шагов двигателя вперед:
stepMotor1(1, 50);

//пауза
delay (1000);

//тут вызываем 50 шагов двигателя назад:
stepMotor1(0, 50);

//пауза
delay (1000);

//тут вызываем 200 шагов двигателя вперед:
stepMotor1(1, 200);

//пауза
delay (1000);

//тут вызываем 200 шагов двигателя назад:
stepMotor1(0, 200);

//пауза
delay (1000);



 
 
  }


//То, что дальше - процедура. Пишется ВНЕ основного цикла. Может вызываться из любого места программы.
void stepMotor1(int dir, int step) //dir - направление step -сколько шагов
//Motor1EN - вывод EN 1 драйвера
//Motor1dir - направление первого
//Motor1step - шаг первого
{
  //Сначала включим драйвер (Активный уровень ВЫСОКИЙ из даташита)
  digitalWrite(Motor1EN, HIGH);

  //потоми проверим - какое направление выбрано?
  if (dir)
   {
    //если направление "1" - ставим единицу на выводе Motor1dir
    digitalWrite(Motor1dir, HIGH);}

    else
    //иначе - ставим ноль на выводе Motor1dir
     {    digitalWrite(Motor1dir, LOW);}

for (int i=0;i<step; i++)
   {
     delay(30);
     //Поставили ноль на выводе Motor1step (начало импульса), если я верно прочел в даташите "(3) Low‐level pulse duration should > 8μs.  Maximum pulse frequency is 50 KHz"
     digitalWrite(Motor1step, LOW);
     //Пауза (длительность импульса
     delay(10);
     //Поставили единицу на выводе Motor1step (конец импульса)
     digitalWrite(Motor1step, LOW);
}
    delay(70); //Пауза чтобы успел шагнуть до выключения питания. Длинная, но... Всегда можно сократить.
     digitalWrite(Motor1EN, HIGH);
  }


Вроде ошибок нет. :)


Добавлено спустя 1 минуту 2 секунды:
И еще - 2Мур: начинающему работать с библиотеками - это не понимать что и как работает. ИМХО.

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

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 02 ноя 2014, 13:13

Как я понял, теперь при подключении и загрузки программы, двигатель должен совершить указанное количество шагов. Вместо этого происходят просто какие-то щелчки в нём и всё. Возможно неисправность в оборудовании?
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

След.

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

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

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