ШД и библиотека Stepper

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Решил в первые вжизни добраться до ШД. Надыбал из старого принетера биполярный ШД на 6-24в, 48 шагов. Собрал контроллер:

 

Проще кажется некуда. Но вот делема. При тестировании выяснилось что управляется только правая часть а на левой вообще ноль эмоций. сигналы с ардуино идут с обоих выходов. при подключениии светодиодов вместо обмоток ШД моргает только правая часть.

Вот я понять не могу в чем причина. 

Код программы использовал этот: 

#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 48

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 11, 12);

void setup()
{
  // Initialize random number generator
  randomSeed(analogRead(5));
}

void loop()
{
  // Pick a random direction and distance to move
  int rand = random(-48, 48);
  
  // Pick a random speed
  int spd = random(25, 100);
  
  // Go
  stepper.setSpeed(spd);
  stepper.step(rand);
  
  delay(1000); 
}

Всеже грешу на схему. Сам что то уже в замешательстве, так как реально все проверил, все работать должно. Микросхема рабочая, все рабочее.

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Грешить можно на схему. Собрать можно без транзисторов. И опять же проверить все контакты. 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Проверьте развязку земли многие и я в том числе её плохо развязывают с ардуино.  Связан ли блок питания землей с землей ардуино? 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Ага я вот тоже так думал, сначало у мну сразу земля была приконекчена к арде, нифига, потом оторвал все равно нифига, напругу поднимал и т.д. Вот думаю попробовать законектить как для управления по 4ем управляющим входам. Вобщем буду пытать до талава. Правда уже одну микруху спалил. )) 

По коду я так понимаю претензий нет да?

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

Modular
Offline
Зарегистрирован: 05.03.2011

 Может в моторчике чего-нить коротит?

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Собираете на макетке? Если на печатке то фото в студию, проверим схему. Еще что за мотор фирма модель? Может он униполярный или еще чего 3х фазный;)) 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Собираю на "печатной макетке"))). Мотор из принтера 4 вывода, 2е обмотки. Идентифицировать не удалось. Опытным путем выяснил что шаг 7.5' колво шагов 48, питание по заводской схеме подается от 6в до 24в, в зависимости от режима работы. Фирма двигла похоже Mitsumi - так как основной шаговик 24в, 48 шагов, именно этой фирмы. Но он униполярный (подключен по биполярной схеме) и довольно мощный. Думаю в итоге проще все же использовать униполярники. ПРосто хотелось бы разобраться со схемой. 

Транзисторы я взял BC547 - вот щас думаю достаточно ли открытия транзистора для появления лог 1.

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Униполярник действительно проще и дешевле реализовать на одной ULN2003(2004)

Нужно тестером померять сопротивления катушек. И покрутить сам мотор нет ли где короткого.

Фото "макетной печатки" в студию.  Среди сотен соплей я тоже часто ищу ошибки в своих схемах на "печатных макетках". Где-то может быть КоЗа;)

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

да вот я все разобрал уже. Щас пока готовлюсь к поездке за деталями новыми. 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Все заного )) ПРиобрел вчера 3 ШД за 100р от 5-ти дюймового флопа.

они униполярные. Те которые с 6-ю выводами можно подключать по биполярной схеме. Вот с ним то и по эксперементирую. А остальные буду пока мастрячить для своих основных нужд.

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Наконец добыл новые запчастюли. Собрал схему все заработало, проблема была в бракованных микрухах. 

Также приобрел ULN 2003, собрал на ней схемку для униполярного - тоже работает. Но вот теперь есть несколько вопросов:

1 некоторые из двигателей греются (местами выводы менял), так и должно быть?

2 если задать в программе скорость более 150 то ШД дергается но не крутится, как это обяснить.?

Koldune
Offline
Зарегистрирован: 07.04.2011

1. Нагрев при работе - вполне обычное явление, мотор крутится вхолостую, без нагрузки, поэтому обмотки и греются

2. ШД не может мгновенно разогнаться до своей максимальной скорости, поэтому для использования его на полную катушку необходимо разгонять его с определённым ускорением.

 

От себя советую отличную библиотеку AccelStepper http://www.open.com.au/mikem/arduino/AccelStepper/ . Стандартная библиотека Stepper не позволила мне нормально управлять шаговым стрелочным индикатором, а с этой - просто сказка: и программируемое ускорение/замедление, и автоматическое определение 1-2-4-обмоточного шаговика, и несколько шаговиков сразу, и прочие вкусности.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Блин там на японском все написано

Koldune
Offline
Зарегистрирован: 07.04.2011

Вот прямая ссылка на файлы - http://www.open.com.au/mikem/arduino/AccelStepper/AccelStepper-1.5.zip

Разобраться несложно, там в архиве есть несколько Examlpe`ов, по ним можно легко разобраться в основных командах

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Огромное спосибо поюзаю, отпишусь. 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Да замечательная библиотека, тока я не понял к каким пинам подключается

Koldune
Offline
Зарегистрирован: 07.04.2011

По умолчанию это пины 2,3,4 и 5. У меня одна обмотка биполярного ШД подключена ко 2 и 3 пину, а вторая - к 3 и 4. Пины меняются то ли в *.h, то ли в *.cpp файле, точно не помню

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

а если надор другие то просто прописать в скобках через запятую, да? 

Koldune
Offline
Зарегистрирован: 07.04.2011

По-видимому, да, в файле AccelStepper.h нужно править строчку:

AccelStepper(uint8_t pins = 4, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5);

Константы uint8_t pin1 - uint8_pin4 определяют номера портов ардуино, к которым подключаются контакты, а в константе uint8_t pins указано число этих контактов.

juniorluck
Offline
Зарегистрирован: 20.05.2011

Добрый день! Я так понимаю - это ШД ИЗОТ СДХ 1,8\40 ??? С 6 выводами (2 из них коричневые). Если это так, да даже если и не так,  подскажите по этому движку распиновку? Всю голову сломал что куда подключать, если можно прям по пунктам. Кстати - использую микруху L293D. Хотелось бы увидеть ответ так:

1. Красный - куда подключаем? (например, к 1му out на микросхеме) 

2. Белый - и т.д.  

3. Желтый - и т.д.

4. Синий -и т.д.

5. Коричневый_1 - и т.д.

6. Коричневый_2  - и т.д.

Буду Вам очень признателен...

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

О! Это та библа, которую мне надо! Чуть сам не сел за ее написание! Извините, что поднял старую тему, просто мне актуально, чтобы 3 шаговика одновременно с разными скоростями шагали :)

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 juniorluck я щас занимаюсь чпу на этих шаговиках. Но применяю ULN 2003. Причем у меня подобных шаговика 3 шт, но у всех цветовая маркировка разная, выявлял опытным путем.  Тупо мерил сопративления соответственно получалось например 100 ом и по 50 соответственно где 100 это большой круг а где 50 это отвод с малого круга.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Я тоже делаю чпу. Но у меня в управлении "EasyDriver" - на входе нужно Step+Dir, эта библа как раз умеет :)

leshak
Offline
Зарегистрирован: 29.09.2011

Koldune пишет:

 По умолчанию это пины 2,3,4 и 5. У меня одна обмотка биполярного ШД подключена ко 2 и 3 пину, а вторая - к 3 и 4. Пины меняются то ли в *.h, то ли в *.cpp файле, точно не помню

По-видимому, да, в файле AccelStepper.h нужно править строчку:

AccelStepper(uint8_t pins = 4, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5);

Константы uint8_t pin1 - uint8_pin4 определяют номера портов ардуино, к которым подключаются контакты, а в константе uint8_t pins указано число этих контактов.

не, не, не...

"По умолчанию" это значит "если вы не указали", но указать-то можно. Править библиотеку не нужно. А если у вас будет два степера, так что две библиотеки делать?

Предположим вам нужно один степер повесить на ноги 4,5,6,7 а другой на 8,9,10,11

Значит вы пишете, прямо в скетче, ну мучая библиотеку, вместо

AccelStepper stepper; // Defaults to 4 pins on 2, 3, 4, 5

 

Примерно так:

AccelStepper stepper(4,4,5,6,7); // 4 pins on 4, 5, 6, 7
AccelStepper stepper2(4,8,9,10,11); // 4 pins on 8, 9, 10, 11

 

valeross
Offline
Зарегистрирован: 01.05.2012

Привет

подскажите пожалуйста как подключить шаговые биполярные движки с родными драйверами к Ардуино (ваще просто дуб)

на выходе драйвера

STEP — Тактирующий сигнал, сигнал шага. Один импульс приводит к повороту
ротора ШД на один шаг (не физический шаг ШД, а шаг выставленный на драйвере — 1:1, 1:8, 1:16
и т.д.). Обычно драйвер отрабатывает шаг по переднему или заднему фронту импульса.
DIR — Потенциальный сигнал, сигнал направления. Логическая единица — ШД
вращается по часовой стрелке, ноль — ШД вращается против часовой стрелки, или наоборот.
Инвертировать сигнал DIR обычно можно либо из программы управления или поменять местами
подключение фаз ШД в разъеме подключения в драйвере.
ENABLE — Потенциальный сигнал, сигнал включения/выключения драйвера.
Обычно логика работы такая: логическая единица (подано 5В на вход) — драйвер ШД
выключен и обмотки ШД обесточены, ноль (ничего не подано или 0В на вход) — драйвер ШД
включен и обмотки ШД запитаны.
Vcc+2,5....5v

и как использовать библиотеку,... по пунктам пж, ваще тяж. дается

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Просто.

Если, скажем, Step подключим к 4, Dir к 5, то иницилизация будет:

AccelStepper MyStep(1,4,5);

С сигналом ENABLE нужно разбираться отдельно - библиотека его не поддерживает. Есть пример: www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html

valeross
Offline
Зарегистрирован: 01.05.2012

Огромное пасиба

C enable думаю что тоже не проблема судя по схеме (и назначению) GND и +5 -просто включение (активация) драйвера шагового движка

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

AlexFisher пишет:

С сигналом ENABLE нужно разбираться отдельно - библиотека его не поддерживает. 

Извините за дезу! Библа поддерживает ENUBLE, после инициализации нужно вызвать метод setEnablePin. Cкажем, ENUBLE подключен к 6:

AccelStepper MyStep(1,4,5);
MyStep.setEnablePin(6);

 

Sergo1st
Offline
Зарегистрирован: 10.05.2012

AlexFisher пишет:

AccelStepper MyStep(1,4,5); 

А не подскажете почему при компиляции кода с такой строкой

AccelStepper stepper(2, 4, 5);

выдает это:

"no matching function for call to 'AccelStepper::AccelStepper(int,int,int)'"

Sergo1st
Offline
Зарегистрирован: 10.05.2012

Sergo1st пишет:

AlexFisher пишет:

AccelStepper MyStep(1,4,5); 

А не подскажете почему при компиляции кода с такой строкой

AccelStepper stepper(2, 4, 5);

выдает это:

"no matching function for call to 'AccelStepper::AccelStepper(int,int,int)'"

Сам разобрался, была кривая версия библиотеки.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Ребят а подскажите есть ли описание этой библиотеки на русском, или где посмотреть примеры использования этой библиотеки

 

Sergo1st
Offline
Зарегистрирован: 10.05.2012

Тут же есть примеры:

http://www.open.com.au/mikem/arduino/AccelStepper/examples.html

А про саму библиотеку текст можно и гуглом перевести для начала, понять можно уже будет.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 ссылка не открывается. Да я понимаю что можно перевести - просто все равно ни че не понятно после гавенного перевода.

leshak
Offline
Зарегистрирован: 29.09.2011

 >ссылка не открывается.

Уберите лишний пробел в конце.

> Да я понимаю что можно перевести

Ну вот и сделайте это. Только не переводчиком, а словариком. Словарный запас там - не шибко большой. Через пару дней, максимум неделя, - будете уже без словаря читать.

Если не хотите это делать - тогда плюнте на ардуину. Без минимальной способоности прочитать технический текст, help, даташит существуют только один способ завершить проект: нанять кого-нибудь.

Заниматся программированием без хотя бы "самого базового english" - не возможно. Благо, если есть желание, выйти на этот уровень может любой человек за считанные дни (и наверное даже быстрее это произойдет, чем если бы он пытался учить язык "с учителем").

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Подтверждаю!

Я в свое время технический англиский выучил на базе школьного (то есть никакого) по help-у от с++, потому что с++ нужно было освоить за неделю имея базовые знания pascal. Все дело в мотивации. Если чувствуешь (не знаешь, а именно чувствуешь), что надо - язык учится "на ура"

Извините за оффтоп

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Да дело в том что технический английский у меня по профессии неотъемлемая часть, но когда он касается программирования, а так как первый язык программирования это ардуино скетч, то для меня становится просто невооброзимо некоторое понятийное согласование некоторых слов и сочетаний. Но если мне показать кусок программы например - вот программка заставляет шд крутиться на 200 шагов с таким то ускорением, а вот обратно то все сразу становится понятно. Както даже processing проще дался - потому что в референсе приведены примеры на каждую функцию и т.д.

leshak
Offline
Зарегистрирован: 29.09.2011

Nikelbak пишет:

 Но если мне показать кусок программы например - вот программка заставляет шд крутиться на 200 шагов с таким то ускорением, а вот обратно то все сразу становится понятно. 

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

Sergo1st
Offline
Зарегистрирован: 10.05.2012

leshak пишет:

Nikelbak пишет:

 Но если мне показать кусок программы например - вот программка заставляет шд крутиться на 200 шагов с таким то ускорением, а вот обратно то все сразу становится понятно. 

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

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Ну да все верно, вроде начал разбираться потихоньку, просто сразу ссылка не открывалась.))

vov4ik
Offline
Зарегистрирован: 10.09.2013

Валялся у меня ДШГ 5618А1-07 (вроде как от советского принтера), от него шесть проводов прозвонив и подключая напрямую к блоку питания на 6.3В выяснил какие куда провода на нем ещё остался разъём распиновка получилась 1к - пустышка - общий 1к,3к - 3к - 4к -  пустышка - общий 4к,2к - 2к , общие соеденил и кинул на +, собрал схемку с UNL2003 , пробуя библиотеку Stepper.h что-то не очень пришлось писать все самому немного выбрав из библиотеки.

// програмка для работы с Stepper мотором через сом порт
int znak = 1; //куда крутим -1 по часовой, 1 против часовой
int wait = 10; //уменьшает скорость движения
int result = 0; // количество циклов в фор
byte f1 = 0; //корректор для фор от знака
byte f2 = 0; //корректор для фор от знака
int motor_pin_1 = 8; //1 пин мотора
int motor_pin_2 = 9; //2 пин мотора
int motor_pin_3 = 10; //3 пин мотора
int motor_pin_4 = 11; //4 пин мотора
void setup() {
  Serial.begin(9600);
  pinMode(motor_pin_1, OUTPUT);
  pinMode(motor_pin_2, OUTPUT); 
  pinMode(motor_pin_3, OUTPUT); 
  pinMode(motor_pin_4, OUTPUT); 
}

void loop() {
  if (Serial.available()) {
  while (Serial.available())
        result = result * 10 + (Serial.read() - '0');   
       delay (50); } // читает сом порт при в воде "-" или "+" определяем направление
       // числовое значение определяет сколько крутить.
  if (result == -3) { result = 0; znak = -1;} // определяет что введен "-"
  if (result == -5) { result = 0; znak = 1;}  // определяет что введен "+"
  if (result != 0) { Serial.println(result * znak);} 
if (result != 0 && znak == -1) { f1 = 7; f2 = 0; result--; } //уставки для фор в зависимости от знака
if (result != 0 && znak == 1) { f1 = 0; f2 = 8; result--; } //уставки для фор в зависимости от знака
// можно убрать если хотите нагружать во время покоя
if (result == 0 ) {
  // 0000
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
}
// пока result имеет какоето значение мотор крутится
if (result != 0) {
 for (int i=f1; i != f2; i = i + znak){
      switch (i) {
      case 0:    // 1000
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
      case 1:    // 1100
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
      case 2:    //0100
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
      case 3:    //0110
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
       case 4:    // 0010
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
       case 5:    // 0011
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, HIGH);
      delay(wait);
      break;
       case 6:    // 0001
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      delay(wait);
      break;
       case 7:    // 1001
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      delay(wait);
      break;
      }
      }
   }
}
 

работает добавил связь с сом потом

дополнительно выходы с UNL2003 подключил - конденсатора, + соответственно на + блока питания, конденсатор на 470мкф (ушол эффект трактора)

P.S. если у кого получится исправить код что-бы сразу можно было вводить -23 (к примеру), у меня не вышло поэтому сначало - или + а потом значение.

leshak
Offline
Зарегистрирован: 29.09.2011

vov4ik пишет:

P.S. если у кого получится исправить код что-бы сразу можно было вводить -23 (к примеру), у меня не вышло поэтому сначало - или + а потом значение.

Если я правильно понял че вы хотите, то вот как-то так:

void setup(){
  Serial.begin(57600);
}

void loop(){
  
  if(Serial.available()){
      int result=Serial.parseInt(); // читам

     // выводим что прочитали
      Serial.print("Readed=");
      Serial.println(result); 
      
      while(Serial.available())Serial.read();// очищаем входящий буффер Serial (перевод каретки и проч. мусор)
  }
}

P.S. Только что-бы работало, не забудти в Serial Monitor поставить Line Ending в любом значение кроме "No line ending" (справа, внизу, чуть левее скорости порта выставляется)

leshak
Offline
Зарегистрирован: 29.09.2011

А еще, рекоменду, почитать Прямое управления выходами через регистры микроконтроллера Atmega

и отказаться от digitalWrite

так как, какое-никакое а время исполнения он имеет. И выставить ОДНОВРЕМЕННО четыре ноги в нужноное состояние - вы не можете.

В данном случае эта одновременность не столь критична (на чуть-чуть может сбиваться время шагов, скорее всего - не заметите), но иногда это критично бывает. 

Да и код, можно будет сократить в несколько раз. Правда "переехать на другие пины" будет уже чуток сложней.

vov4ik
Offline
Зарегистрирован: 10.09.2013

Спасибо поправил

// програмка для работы с Stepper мотором через сом порт
int znak = 1; //куда крутим -1 по часовой, 1 против часовой
int wait = 5; //уменьшает скорость движения
int result = 0; // количество циклов в фор
int com = 0; // чтение сом порта
byte f1 = 0; //корректор для фор от знака
byte f2 = 0; //корректор для фор от знака
int motor_pin_1 = 8; //1 пин мотора
int motor_pin_2 = 9; //2 пин мотора
int motor_pin_3 = 10; //3 пин мотора
int motor_pin_4 = 11; //4 пин мотора
void setup() {
  Serial.begin(9600);
  pinMode(motor_pin_1, OUTPUT);
  pinMode(motor_pin_2, OUTPUT); 
  pinMode(motor_pin_3, OUTPUT); 
  pinMode(motor_pin_4, OUTPUT); 
}

void loop() {
   if (Serial.available()) {
  int com=Serial.parseInt(); // читам
     // выводим что прочитали
      Serial.print("Readed=");
      Serial.println(com);
 result = com;     
      while(Serial.available())Serial.read();// очищаем входящий буффер Serial (перевод каретки и проч. мусор)
  }  
if (result > 0) { f1 = 0; f2 = 8; znak = 1;} //уставки для фор в зависимости от знака
if (result < 0) { f1 = 7; f2 = 0; znak = -1; result = abs(result);} //уставки для фор в зависимости от знака
label:
  if (result != 0) { Serial.println(result * znak);} 
// можно убрать если хотите нагружать во время покоя
if (result == 0 ) {
  // 0000
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
}
// пока result имеет какоето значение мотор крутится
if (result != 0) {
 for (int i=f1; i != f2; i = i + znak){
      switch (i) {
      case 0:    // 1000
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
      case 1:    // 1100
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
      case 2:    //0100
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
      case 3:    //0110
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
       case 4:    // 0010
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      delay(wait);
      break;
       case 5:    // 0011
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, HIGH);
      delay(wait);
      break;
       case 6:    // 0001
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      delay(wait);
      break;
       case 7:    // 1001
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      delay(wait);
      break;
        }
      }
   }
   if (result != 0) {result--; goto label;}
}

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

byte m1 = 0; byte m2 = 0; byte m3 = 0; byte m4 = 0;
void motor(byte m1, byte m2, byte m3, byte m4)
{digitalWrite(8,m1);digitalWrite(9,m2);digitalWrite(10,m3);digitalWrite(11,m4);}
void setup(){
pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT);
}
void loop(){
  // присваиваем значения m1 m2 m3 m4 истина или лож
  motor(m1,m2,m3,m4); //просто одновременно вкидываются значения
}

я заморачиватся не стал просто из библиотеки выдернул и немного подправил под свои нужды.

leshak
Offline
Зарегистрирован: 29.09.2011

vov4ik пишет:

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

byte m1 = 0; byte m2 = 0; byte m3 = 0; byte m4 = 0;
void motor(byte m1, byte m2, byte m3, byte m4)
{digitalWrite(8,m1);digitalWrite(9,m2);digitalWrite(10,m3);digitalWrite(11,m4);}
void setup(){
pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT);
}
void loop(){
  // присваиваем значения m1 m2 m3 m4 истина или лож
  motor(m1,m2,m3,m4); //просто одновременно вкидываются значения
}

я заморачиватся не стал просто из библиотеки выдернул и немного подправил под свои нужды.

1. Так, конечно, симпатичней... только к "прямому управлению" это нифига не имеет отношения. 
По прежднему - каждая нога выставляется отдельно и медленно (по сравнению с прямым доступом).
2. Нужно больше память для хранения состояний, нельзя одно состояние записать в виде байта (а следовательно и записать все это ввиде массива - что-бы еще более компактый код сделать).
3. "Компилятор" тут нифига за вас не делает. Код, конечно, уже более приличный, только вызов функции тоже имеет свои накладные расходы. Что-бы он был "и красивый" и работал не медленее вышей изначальной версии - почитайте про ключевое слово "inline"

Ну а вообще - как хотите, конечно :)  Тут прямой вывод не есть "обязательно нужно", но как повод разобратся с ним и освоить битовые операции - вполне себе. А уж осваивать или нет - ваш выбор. 

DAD
Offline
Зарегистрирован: 23.06.2014

Вопрос может и не к этой теме, но попробую. Чтобы подключить двухфазный шаговик по схеме обычного с шестью проводками, нужно два мостовых драйвера, как например L6203? И можно пользоваться стандартной библиотекой?

art100
Offline
Зарегистрирован: 09.03.2014

DAD пишет:

Вопрос может и не к этой теме, но попробую. Чтобы подключить двухфазный шаговик по схеме обычного с шестью проводками, нужно два мостовых драйвера, как например L6203? И можно пользоваться стандартной библиотекой?

вызваниваешь средние провода

выкусываешь

получаешь хорошо расписанный биполярник

и можно пользоватся всем что найдешь

 

с появлением извращенных драйверов мотать лишние провода становится не актуально

мы всем миром переходим на биполярники потихоньку

сколько у меня таких покусанных работает

щас обернусь попробую посчитать

вроде 9 штук сейчас

 

и где это ты схему 6 проводного униполярника увидель

выбрось

забудь

глупость это уже

лишнее

и не правильнее взять всего 1-один корпус L298 для мотора типового NEMA17

есть даже ардуиновский шилд и не изобретать велосипеды

вы на сайт http://arduino.cc/en/Main/Products ходили?

 

DAD
Offline
Зарегистрирован: 23.06.2014

Я немного неправильно вопрос поставил) Для того, чтобы использовать стандартную библиотеку степпер для управления двухфазным ШД, необходимо взять два мостовых драйвера, кстати, действительно L298 дешевле, чем L6203, и тогда при стандартном управлении через степпер по 4 входам диаграмма на обмотках будет такая:

Что соответствует порядку свечения диодов на драйвере униполярного ШД. Но надо, получается, два мостовых драйвера, а не один? 

На ардуино.цц был, перешерстил алиэкспресс в поисках приемлемого решения. С одной стороны, конечно проще взять готовое решение. Но хочется и свое иметь, на случай компактного встраивания.

art100
Offline
Зарегистрирован: 09.03.2014

DAD пишет:

Я немного неправильно вопрос поставил) Для того, чтобы использовать стандартную библиотеку степпер для управления двухфазным ШД, необходимо взять два мостовых драйвера, кстати, действительно L298 дешевле, чем L6203, и тогда при стандартном управлении через степпер по 4 входам диаграмма на обмотках будет такая:

 

Что соответствует порядку свечения диодов на драйвере униполярного ШД. Но надо, получается, два мостовых драйвера, а не один? 

На ардуино.цц был, перешерстил алиэкспресс в поисках приемлемого решения. С одной стороны, конечно проще взять готовое решение. Но хочется и свое иметь, на случай компактного встраивания.

вроде уже третий станок с ЧПУ поднимаю а вас понять не могу

мне не известны термины "двухфазные" моторы где-то c 1980-ых

биполярные и тут же произносится униполярние как архаизм и забывается как только произносится

поищите тут на форуме я кода на самые различные драйверы я накидал

готовое бери не хачу

никаких библиотек все подпрограмками решается

какие неперенносимости кода я постич не могу

компактное без микрухи с H-мостом для шаговика на рассыпухе это круто

вы типа не хотите красненькие и зелененкие а хотите черненькие

осцилограммы спионерили откуда-то

давайте еще уровни ферме будем анализировать

можно я буду сразу жидкости наливать твердости двигать шаговыми моторами

мне как-то глубоко начхать на каком соотношении фаз удерживается якорь в EM-34 13430 STH-39DI50-01 A4988 в зависимосьти от коэфициента который я высчитал если тока мало я буду добавлять если греется я буду уменьшать а в режиме простоя как нибудь digitalWrite(motor3enablе,LOW); обойдусь


//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 200.0*8/3, 760*1.1}  // d
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 200*16/1.25, 638.23}  // 
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 2560, 612}  // steps per 
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 200.0*8/3, 612}  // steps
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 533, 612}  // steps per u
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 2132, 612}  // steps per 
#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 2560, 612}  // steps per un
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 1066, 612}  // steps per 
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 1280, 612}  // steps per 
//#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402, 78.7402, 200*16/1.25, 600}  // ste

может с утра смогу понять

 

 

DAD
Offline
Зарегистрирован: 23.06.2014

1 Униполярные и биполярные. Это понял.

2 По поводу библиотек тоже ясно. Не панацея.

3 На фото к одной L298 подцеплен один ШД, или это не L298? 

4 Не спионерил, а процитировал) Прежде чем к коду переходить, хотелось бы досконально в принципах работы ШД разобраться, а тут я еще не волшебник. Но учусь)))

Все остальное не очень пока понятно, т.к. до кода я еще не добрался, это самая легкая часть. А за подсказки спасибо. Если бы еще комментарии к фотке были, то вообще респект) Буду искать.

art100
Offline
Зарегистрирован: 09.03.2014

DAD пишет:

1 Униполярные и биполярные. Это понял.

2 По поводу библиотек тоже ясно. Не панацея.

3 На фото к одной L298 подцеплен один ШД, или это не L298? 

4 Не спионерил, а процитировал) Прежде чем к коду переходить, хотелось бы досконально в принципах работы ШД разобраться, а тут я еще не волшебник. Но учусь)))

Все остальное не очень пока понятно, т.к. до кода я еще не добрался, это самая легкая часть. А за подсказки спасибо. Если бы еще комментарии к фотке были, то вообще респект) Буду искать.

а вам теория вращения шагового мотора щас поищу

устроит? 

а теперь забудьте

1 шаг "полношаговый режим" модно

щас народ не полу(1/2)

1/4 не модно  

1/8 распространнено

1/16 нередко

1/32 в будущую моду может прийти но все таки экзотика

1/10000000 совсем не держит визжит дрожит греется а толком не крутится это часто

шагает

берете готовый микрушку драйвер подходящую шагового мотора и шагаете

если микрошаги фигня неустойчивая редуктор прикручиваете

моды сейчас вижу две просто H-мост и вы сами шагаете 4-мя ногами L293 L298 и в моду пришел стиль DIR STEP вы направление выбрали 1нога и сами шагаете 2 нога спец дравер какой-нибудь

на arduino тоже не исключение такие же моды

а так все как из 20 лет назад ничего нового

только вместо движков 2-ух проводных постоянного тока появились 4-ех проводные движки постоянного тока

6 8 проводов движки постоянного тока из моды вышли потому как микрушки-фигнюшки наваяли тоннами

все из кАрОпки

вам шашечки или ехать

Все курс шаговых двигателей закончен.

Зачет завтра.

Задание:

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

Можете использовать arduino

Подсказка ключевое слово ищем на вашем диске C:\... stepper_oneRevolution.ino

L298 ищем на секретнейшем http://alldatasheet.com