Код для управления биполярным шаговиком

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Здравствуйте, уважаемые ардуинщики! Опытные из вас, подскажите пожалуйста новичку что не так в коде

Схема в ссылке( источник внешнего питания не подключал, т.к. шаговик маломощный и вполне питается от ардуино), биполярный шаговик FL28STH45-0674B, Н-мост SN754410NE.

Проверял библиотечный скетч от Тома Иго, он работает, но хочется написать свой к этой схеме

в итоге от моего "кода" двигатель просто вибрирует как ненормальный и ничего не происходит

http://wikihandbk.com/wiki/Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%...

мой исходник

int A = 11;
int B = 10;
int C = 9;
int D = 8;
int i = HIGH;
void setup () {
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}
void loop () {
  i=analogRead(A0);
  
  digitalWrite(11, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, HIGH);
  Serial.println(i);
  delay(10);
  
  digitalWrite(11, HIGH);   
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);
 
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);
 
  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);
 
  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);
 
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);
 
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, HIGH);
  Serial.println(i);
  delay(10);
 
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, HIGH);
  Serial.println(i);
  delay(10);
  
}
 
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

БиШаДви пишет:

что не так в коде

Он неправильно вставлен.

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Евений, мне кажется он неправильно СОставлен) Вы можете подсказать чего не хватает и/или что и как в нем нужно исправить?

БиШаДви
Offline
Зарегистрирован: 19.02.2018
int A = 11;
int B = 10;
int C = 9;
int D = 8;
int i = HIGH;
void setup () {
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}
void loop () {
  i=analogRead(A0);
  
  digitalWrite(11, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, HIGH);
  Serial.println(i);
  delay(10);
  
  digitalWrite(11, HIGH);   
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, HIGH);
  Serial.println(i);
  delay(10);

  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, HIGH);
  Serial.println(i);
  delay(10);
  
}

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Могу.

До тех пор, пока Вы не вставите его как положено, его, с высокой вероятностью, просто никто не будет читать (я, например, не буду).

Это не "эстетика", а чистая прагматика. Вот как прикажете Ваш код обсуждать, если в нём нет номеров строк? Мне Вам писать, "а вот в строке № ХЗ лучше написать то-то"? Так что ли?

Вставляйте.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Так-то лучше.

А теперь прокомментируйте, что за пины 8-11 (какой куда подключён). И заодно вначале каждого блока напишите комментарий какой именно режим Вы включаете.

-------------

Но в любом случае, как бы они не были подключены, Вы что в этом коде делаете? Меняете режимы, так? Каждые 10 мс. Ну, отлично, 10 мс едем вперёд, 10 мс - назад, он и будет дрожать на месте, а чего Вы ждали?

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Евений, вставил

БиШаДви
Offline
Зарегистрирован: 19.02.2018
sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Но в любом случае, как бы они не были подключены, Вы что в этом коде делаете? Меняете режимы, так? Каждые 10 мс. Ну, отлично, 10 мс едем вперёд, 10 мс - назад, он и будет дрожать на месте, а чего Вы ждали?

Нет, он гонит ток по обмоткам по полушаговой схеме с паузами в 10мс между шагами.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, вот пусть это прокомментирует.

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Хочется добиться регулировки скорости вращения ротора, посредством вращения ручки потенциометра. Аппаратно схема собрана правильно, потому что на бибилиотечном скетче работает прекрасно, а вот на моем ничего хорошего

vvadim
Offline
Зарегистрирован: 23.05.2012

а примеры из библиотеки Stepper вам не подходят ?

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Ну тут дело не в том что он подходит или нет. Работает то он прекрасно, но мне хочется увидеть и понять как работает не библиотечный скетч. Я вроде как продумал алгоритм, попытался реализовать его в коде, но не работает. Хотя при написании подобного кода, в интернете много где говорят о том что достаточно оперировать только digitalWrite и задержкой

b707
Offline
Зарегистрирован: 26.05.2017

если подключено правильно - значит ошибка в последовательности шагов. Если я правильно понимаю работу биполярника - на двух концах одной обмотки одновременно HIGH быть не может. У вас по обмоткам должна бежать "круговая волна" за которой будет следовать ротор - а у вас не так.

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Покажите пожалуйста, как нужно распеределить состояния в каждом блоке! Попробовал сам, ничего не изменилось(

b707
Offline
Зарегистрирован: 26.05.2017

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

а) бегущая единица - 1000 -0100 - 0010 - 0001 - 1000 ...

б) и инверсия - 0101 - 1010 - 0101 -

А откуда вы свою последовательность взяли - не ясно.

sadman41
Offline
Зарегистрирован: 19.10.2016

Мне показалось, что эта схема для униполярника.

БиШаДви
Offline
Зарегистрирован: 19.02.2018

что я не так делаю??

int A = 8;
int B = 9;
int C = 10;
int D = 11;
int i = 1;
void setup () {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}
void loop () {
  i=analogRead(A0);
  
  digitalWrite(8, i);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  Serial.println(i);
  delay(10);
  
  digitalWrite(8, LOW);   
  digitalWrite(9, i);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, i);
  digitalWrite(11, LOW);
  Serial.println(i);
  delay(10);

  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, i);
  Serial.println(i);
  delay(10);


  
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

БиШаДви пишет:

что я не так делаю??

Суете переменные куда попало, не понимая к чему это приводит.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

digitalWrite(8, i);

есть маразм, т.к. вторым параметром digitalWriteможет быть только 0 или "не 0". И какой смысл пихать туда что-то от 0 до 1023, если всё, что не 0 срабатывает одинаково?

inspiritus
Offline
Зарегистрирован: 17.12.2012

а попробуйте поработать портами типа PIND PINB и операцией сдвига :) и шаговик для этого не обязателен, поставьте 4 светодиода и сделайте бегущий огонек, пором бегущий НЕогонек. потом еще 4 светодиода на остаток порта и поупражняйтесь с двума бегущими огоньками по 4+4 (вдогонку и навстречу).

b707
Offline
Зарегистрирован: 26.05.2017

БиШаДви пишет:

что я не так делаю??

если в этом коде выкинуть строчку 15 - мотор крутится?

БиШаДви
Offline
Зарегистрирован: 19.02.2018
int A = 8;
int B = 9;
int C = 10;
int D = 11;

void setup () {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}
void loop () {
  
  
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  
  delay(10);
  
  digitalWrite(8, LOW);   
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  
  delay(10);

  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  
  delay(10);

  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
 
  delay(10);


  
}
БиШаДви
Offline
Зарегистрирован: 19.02.2018

использую сейчас эту версию ↑ . Крутится стабильно, нет этих бешенных вибраций. Не знаю как привязать к коду управление потенциометром скорости. Если подскажете, будет здорово =)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Определите при каких делаях Ваша скорость минимальна , максимальна наверно при теперешних.

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

b707
Offline
Зарегистрирован: 26.05.2017

БиШаДви пишет:

использую сейчас эту версию ↑ . Крутится стабильно, нет этих бешенных вибраций. Не знаю как привязать к коду управление потенциометром скорости. Если подскажете, будет здорово =)

а второй и трети шаг не перепутан?

Скорость меняется изменением задержек между шагами.

xDriver
xDriver аватар
Онлайн
Зарегистрирован: 14.08.2015

b707 пишет:

а второй и трети шаг не перепутан?

заработало на удачу, или методом перебора

видимо обмотки так подключены. 

БиШаДви
Offline
Зарегистрирован: 19.02.2018
int A = 8;
int B = 9;
int C = 10;
int D = 11;
int potPin = A0;


void setup () {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(9600);
}
void loop () {

  int val = analogRead(potPin);
  
  val = map(val, 0, 1023, 5, 100);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(val);

  
  val = map(val, 0, 1023, 5, 100);
  digitalWrite(8, LOW);   
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  delay(val);

 
  val = map(val, 0, 1023, 5, 100);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(val);

  
  val = map(val, 0, 1023, 5, 100);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  delay(val);


  
}

 

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Большое спасибо вам за совет! Сделал в итоге так. Но нет ПЛАВНОЙ регулировки скорости, при повороте ручки скорости обрывисто переходят от одной к другой. Всего их три, максимум четыре. Движок начал вибрировать, а светодиоды которые я поставил для индикации обмоток почти не горят. Подскажите пожалуйста, что я не так сделал на этот раз, в аналогриде и/или мапе? Я думаю плохо выбрал диапазон мапа, но тогда как его высчитать чтобы движок так не гудел, и была плавная регулировка скорости?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Плавной регулировки нет потому что  двигатель шагает слишком широко, на полный шаг (Full-step pattern). Раз он у вас таки закрутился, то самое время прочитать про Half-step pattern - c ним шаг будет вдвое мельче, т.е. движение станет плавнее. 

map можно высчитывать только один раз, после того, как считали показания с A0. И лучше заменить сразу цифровые обозначения пинов в digitalWrite на переменные A, B, C, D - так будет проще искать куда какая обмотка подсоединена.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

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

а то мап каждый раз мапирует и вал превращается неизвестно во что. Кстати выведите мап в сериал и посмотрите для интереса : во что превращается первоначальное значение из аналогрида после четырех последовательных мапов :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Если Вы в начале объявили переменные абсд , то их и прменяйте. Это делается для понятности , и чтобы если порты перепаяли менять номера в одном месте, а не по всему коду. Кстати! В Вашем случае их не надо объявлять как переменные. Достаточно дефайна.

#define A 8

#define B 9 

и тд и тп компилятор сам будет подставлять по тексту вместо А - 8 .....

 

БиШаДви
Offline
Зарегистрирован: 19.02.2018

Большое спасибо всем, и особенно вам за помощь! Разобрался ;)