Управление шаговым двигателем от DVD

turbo42
Offline
Зарегистрирован: 30.01.2015

Привет!
Ребят, помогите со скетчем.

Задача: управление ШД от DVD с ардуины.

Управление мотором:
шаг 1: - + + -
шаг 2: - + - +
шаг 3: + - - +
шаг 4: + - + -
При выполнении сверху - вниз, шд крутится в одну сторону.
При выполнении снизу - вверх, шд крутится в обратныю сторону.
Всего 259 шагов
Ссылка на даташит

Подключение: ардуино - L293d - ШД

firstbot.gif

L293d подключал по такому принципу. Вместо моторов - катушки моего ШД. Ну, и ардуино, соответственно.

Для теста написал простейший скетч. Сначала в одну сторону до 259 шага, потом задержка в секунду и в обратную сторону. Все работает.

Задача:
С компьютера ( через COM потр (терминал) отправить в ардуину координту (0-259) и мотор должен повернуться в это положение.

Как это сделать? Чет я понять не могу (неверное массив использовать нужно, но для меня, пока, это тяжело). Помогите, пожалуйста. Заранее спасибо.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1. запоминать текущую позицию, чтобы можно было отправлять на нужное количество шагов

2. считываем из uart

3. если число меньше текущей позиции, то (позиция-число)=количество шагов в одну сторону

    если больше, то (число - позиция)=количество шагов в другую сторону

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

5. если все сделали запоминаем новую позицию и отправляем шаговик шагать

turbo42
Offline
Зарегистрирован: 30.01.2015

а как засунуть в процедуру, или еще как-то сделать последовательность шагов.

т.е. как грамотно организовать движение по:

шаг 1: - + + -

шаг 2: - + - +

шаг 3: + - - +

шаг 4: + - + -

Учитывая, что двигаться нужно то сверху-в низ, то наоборот

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

turbo42
Offline
Зарегистрирован: 30.01.2015

ок. Спасибо. Буду гуглить. Я только начинаю с ардуной разбиратьс. Учусь) С массивами пока все сложно...

turbo42
Offline
Зарегистрирован: 30.01.2015

Нашел в интернете тако код:

#include <Stepper.h>
#define STEPS 259 //Количество шагов
int inSize=0; // Переменная которая будет содержать размер буфера
char str[128]; // Так как типа string тут нет, будем использовать массив символов
//stepper stepper(STEPS, 2, 3, 4, 5);
stepper stepper(STEPS, 7, 8, 9, 10);
 
void setup()
{
stepper.setSpeed(50);
Serial.begin(9600); // Открываем порт с скоростью передачи в 9600 бод(бит/с)
}
 
 
void foward()
{
  stepper.step(1*STEPS);
  delay(1000);
}
void back()
{
  stepper.step(-1*STEPS);
  delay(1000);
}
void loop()
{
   inSize=0; // Сбрасываем переменную
memset(str, '\0', 128); // Очищаем массив
 if(Serial.available() > 0)
 {
   delay(200); // Ждем, для того, чтобы пришли все данные
   inSize = Serial.available(); // Получаем длину строки и записываем ее в переменную
   for (int i = 0; i < inSize; i++)
   {
     str[i] = Serial.read(); // Читаем каждый символ, и пишем его в массив
   }
  
   // Сравнять массив с строкой будем используя функцию strcmp
   if (strcmp(str, "foward") == 0) // Если было передано строку "foward" - вращаем вперед
   {
     Serial.println("roll foward"); // Отправляем сообщение компьютеру
     foward();
  }
  else if (strcmp(str, "back") == 0) // Если было передано строку "back" - вращаем назад
  {
     Serial.println("roll back");
     back();
  }
    else
  {
     Serial.println("Error command!");
  }
 }
}

Будет ли он работать так, как мне нужно? Проверить пока не могу, т.к. на работе, а ардуина дома...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

turbo42
Offline
Зарегистрирован: 30.01.2015

А! Я кажется понял, почему не будет работать. Тут получается, что 

stepper stepper(STEPS, 7, 8, 9, 10);

void foward()
{
  stepper.step(1*STEPS);
  delay(1000);
}
void back()
{
  stepper.step(-1*STEPS);
  delay(1000);
}

подает +5в поочереди на 7, 8, 9, 10 пины ардуины. А в моем случае нужно так:

шаг1: 

digitalWrite(7, 0);

digitalWrite(8, 1);

digitalWrite(9, 1);

digitalWrite(10, 0);

delay(5); // пауза для поворота 

шаг2: 

digitalWrite(7, 0);

digitalWrite(8, 1);

digitalWrite(9, 0);

digitalWrite(10, 1);

delay(5); // пауза для поворота 
 

шаг3: 

digitalWrite(7, 1);

digitalWrite(8, 0);

digitalWrite(9, 0);

digitalWrite(10, 1);

delay(5); // пауза для поворота 
 

шаг4: 

digitalWrite(7, 1);

digitalWrite(8, 0);

digitalWrite(9, 1);

digitalWrite(10, 0);

delay(5); // пауза для поворота 
 

Для "остановки": 

digitalWrite(7, 0);

digitalWrite(8, 0);

digitalWrite(9, 0);

digitalWrite(10, 0);

 
 
 
 
Получается, нужно как-то в строку stepper stepper(STEPS, 7, 8, 9, 10); 
всунуть мои "шаги" расписанные. 
т.е.
"7" = "шаг1"

"8" = "шаг2"

"9" = "шаг3"

"10" = "шаг4"

Я правильно рассуждаю?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

и с ней управлять тебе гораздо проще. только говорить в какую сторону насколько шагов повернуться

turbo42
Offline
Зарегистрирован: 30.01.2015

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

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

она вроде под те и другие

turbo42
Offline
Зарегистрирован: 30.01.2015

Все, доделал. Получилось так:

#include <Stepper.h>
#define STEPS 100
int pozx = 1;
int shagx = 0;
int korx =0;
Stepper stepperx(STEPS, 7, 8, 9, 10);
void setup(){
stepperx.setSpeed(90);
Serial.begin(9600);
}
void loop()
{
  korx = 0;
  Serial.print("Poz_x: ");
  Serial.println(pozx);
  Serial.println("Waiting 'kor_x'...");
  korx = Serial.parseInt();
  Serial.write(korx);
  Serial.print("Kor_x: ");
  Serial.println(korx);
  if (korx != 0 ){
   if (korx != pozx){
    if (korx < 260){
      shagx=korx-pozx;
     stepperx.step(shagx);
  pozx=korx;
  Serial.print("Poz_x: ");
  Serial.println(pozx);
   }
 }
  }

Пока так много в COM отправляет для отладки.

Сейчас буду еще один мотор приклеивать!

Спасибо за советы!!