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

L293d подключал по такому принципу. Вместо моторов - катушки моего ШД. Ну, и ардуино, соответственно.
Для теста написал простейший скетч. Сначала в одну сторону до 259 шага, потом задержка в секунду и в обратную сторону. Все работает.
Задача:
С компьютера ( через COM потр (терминал) отправить в ардуину координту (0-259) и мотор должен повернуться в это положение.
Как это сделать? Чет я понять не могу (неверное массив использовать нужно, но для меня, пока, это тяжело). Помогите, пожалуйста. Заранее спасибо.
1. запоминать текущую позицию, чтобы можно было отправлять на нужное количество шагов
2. считываем из uart
3. если число меньше текущей позиции, то (позиция-число)=количество шагов в одну сторону
если больше, то (число - позиция)=количество шагов в другую сторону
4. проверка а не превысит ли количество шагов максимально или минимально допустимую позицию
5. если все сделали запоминаем новую позицию и отправляем шаговик шагать
а как засунуть в процедуру, или еще как-то сделать последовательность шагов.
т.е. как грамотно организовать движение по:
шаг 1: - + + -
шаг 2: - + - +
шаг 3: + - - +
шаг 4: + - + -
Учитывая, что двигаться нужно то сверху-в низ, то наоборот
сделай массив для шагов, 4х4 и например запоминай еще и текущий шаг чтобы правильно переключаться
ок. Спасибо. Буду гуглить. Я только начинаю с ардуной разбиратьс. Учусь) С массивами пока все сложно...
Нашел в интернете тако код:
#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!"); } } }Будет ли он работать так, как мне нужно? Проверить пока не могу, т.к. на работе, а ардуина дома...
не будет. надо переделывать. но ближе к тому что тебе нужно
А! Я кажется понял, почему не будет работать. Тут получается, что
stepper stepper(STEPS, 7, 8, 9, 10);
подает +5в поочереди на 7, 8, 9, 10 пины ардуины. А в моем случае нужно так:
шаг1:
digitalWrite(7, 0);
digitalWrite(8, 1);
digitalWrite(9, 1);
digitalWrite(10, 0);
шаг2:
digitalWrite(7, 0);
digitalWrite(8, 1);
digitalWrite(9, 0);
digitalWrite(10, 1);
шаг3:
digitalWrite(7, 1);
digitalWrite(8, 0);
digitalWrite(9, 0);
digitalWrite(10, 1);
шаг4:
digitalWrite(7, 1);
digitalWrite(8, 0);
digitalWrite(9, 1);
digitalWrite(10, 0);
Для "остановки":
digitalWrite(7, 0);
digitalWrite(8, 0);
digitalWrite(9, 0);
digitalWrite(10, 0);
"8" = "шаг2"
"9" = "шаг3"
"10" = "шаг4"
Я правильно рассуждаю?
почему ты думаешь что со стандартной либой не будет работать? зачем туда всовывать свои шаги. либа уже заточена под шаговики
и с ней управлять тебе гораздо проще. только говорить в какую сторону насколько шагов повернуться
думал, что стандартная заточена под другие моторы, под униполярные, которые управляются через uln2003...
она вроде под те и другие
Все, доделал. Получилось так:
#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 отправляет для отладки.
Сейчас буду еще один мотор приклеивать!
Спасибо за советы!!