Lightmover на Stepper Motor 28BYJ-48 – 5V

Вопросы об управлении шаговыми двигателями
Аким
Сообщения: 5
Зарегистрирован: 16 авг 2018, 10:59

Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Аким » 16 авг 2018, 12:33

День добрый!
Решил собрать такую каретку на Stepper Motor 28BYJ-48 – 5V и драйвер ULN2003.
Каретка с закрепленным к ней источником света двигается по рельсе. Доходя до конца нажимает кнопку и меняет направления движение.
Нашел даже подходящий скетч из видео -https://www.youtube.com/watch?v=etx24iFMilg.
Но как только каретка нажимает кнопку все останавливается,пока не отпустишь кнопку .Да и двигатель очень сильно греется на этом скетче.
Прошу помощи у профессионалов,сам не силен в создании программ ( это слабо сказано :oops: ).
Нужен скетч для управления кареткой с кнопкой меняющий направления движение. А если движение будет с остановками 2-5 секунд,то будет вообще прекрасно,но не обязательно.


Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Эдуард » 16 авг 2018, 13:23

Здравствуйте!
Я, так понимаю, это игрушка.
Может быть сделать такой алгоритм. Вырабатываются 3 случайных числа: число шагов, скорость движения и направление движения. Контроллер отрабатывает задание и снова получает 3 параметра по случайному закону. Таким образом каретка будет двигаться по случайному закону. Если она будет доходить до концевиков, то задание прекращается и вырабатывается новое.

Аким
Сообщения: 5
Зарегистрирован: 16 авг 2018, 10:59

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Аким » 16 авг 2018, 14:00

Эдуард спасибо за оперативный ответ.
Нет это не игрушка,по крайней мере для меня. Это искусственный источник света для домашнего выращивания растений,повторяющий движение солнца,обычное применяется для обхвата больших площадей одним источником света.
Вот видео откуда была взята идея-https://youtu.be/owBWzV7vjmQ
P.S. Сразу извиняюсь,я Вадим, вам недавно писал. Но неправильно выразился в просьбе.

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Эдуард » 16 авг 2018, 14:09

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

Аким
Сообщения: 5
Зарегистрирован: 16 авг 2018, 10:59

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Аким » 16 авг 2018, 15:26

Двигатель;
motorPin1 = 8
motorPin2 = 9
motorPin3 = 10
motorPin4 = 11
Кнопка=12 и GND
что еще есть.

Подумал что больше ничего и не надо,ардуино+драйвер+двигатель. И концевики.
Все по два и все. Покупал под этот скетч; Без переменного резистора.

Код: Выделить всё

// declare variables for the motor pins

int motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1

int motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2

int motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3

int motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4

int buttonPin = 12; // кнопку подключаем к Pin 12.

boolean q; // фиксируем нажатие на кнопку.

// установить скорость шагового двигателя.

//variable to set stepper speed.

int motorSpeed = 1200;

int lookup[8] = {

B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

/////////////////////////////////////////////////////////////////

void setup() {

// declare the motor pins as outputs.

pinMode(motorPin1, OUTPUT);

pinMode(motorPin2, OUTPUT);

pinMode(motorPin3, OUTPUT);

pinMode(motorPin4, OUTPUT);

// Одна нога кнопки подключается к GND, другая к Pin № 12

// (никаких внешних резисторов не нужно).

pinMode(buttonPin, INPUT);

digitalWrite(buttonPin, HIGH);

// Serial.begin(9600);

}

void loop(){

// переменный резистор, крутим резистор меняем скорость вращения.

// раскомментируйте две строки.

// int VariableResistor = analogRead(A0);

// motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);

if (digitalRead(buttonPin) == LOW) // если кнопка нажата.

{

q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.

delay(1000); // защита от дребезга кнопки.

}

if (q == 1)anticlockwise(); // крутим влево.

else clockwise(); // крутим вправо.

}

// --------------------------------

//set pins to ULN2003 high in sequence from 1 to 4

//delay "motorSpeed" between each pin setting (to determine speed)

// функция поворачивает мотор против часовой стрелки.

void anticlockwise()

{

for(int i = 0; i < 8; i++)

{

setOutput(i);

delayMicroseconds(motorSpeed);

}

}

// функция поворачивает мотор по часовой стрелке.

void clockwise()

{

for(int i = 7; i >= 0; i--)

{

setOutput(i);

delayMicroseconds(motorSpeed);

}

}

void setOutput(int out)

{

digitalWrite(motorPin1, bitRead(lookup[out], 0));

digitalWrite(motorPin2, bitRead(lookup[out], 1));

digitalWrite(motorPin3, bitRead(lookup[out], 2));

digitalWrite(motorPin4, bitRead(lookup[out], 3));

}

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

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Эдуард » 17 авг 2018, 11:55

Здравствуйте!
Проверьте, мог ошибиться.
Если у вас двигатель вращается медленно, то можно попробовать останавливать двигатель после каждого шага. Потребление тогда резко уменьшится, но механика не должна оказывать воздействия на вал остановленного двигателя.
Еще я мог напутать с фазами. Я такие двигатель и драйвер никогда не подключал.

Код: Выделить всё

#include <MsTimer2.h>
#include <StepMotor.h>
#include <Button.h>

StepMotor myMotor(8, 10, 9, 12);
Button button(12, 20);  // создание объекта для кнопки

byte mode=0;  // режим

void setup() {

  MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
  MsTimer2::start();               // разрешаем прерывание по таймеру
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor.setDivider(50);     // делитель частоты 50 (при прерывании 1 мс период коммутации фаз 50 мс)
  delay(50);
}

void loop() {

  if( mode == 0 ) {
    // движение влево
    myMotor.step(1000);

    if( button.flagPress == true ) {
      myMotor.step(-20);
      mode=1;   
    }
  }

  else if( mode == 1 ) {
    // сход с датчика
    if (myMotor.readSteps() == 0) {
      mode=2;     
    }       
  }

  else if( mode == 2 ) {
    // движение вправо
    myMotor.step(-1000);

    if( button.flagPress == true ) {
      myMotor.step(20);
      mode=3;   
    }   
  } 

  else if( mode == 3 ) {
    // сход с датчика
    if (myMotor.readSteps() == 0) {
      mode=0;     
    }       
  }

  else mode=0;
}

//-------------------------------------- обработчик прерывания 1 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  button.filterAvarage();
}

Аким
Сообщения: 5
Зарегистрирован: 16 авг 2018, 10:59

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Аким » 18 авг 2018, 00:45

Добрый вечер Эдуард!
Скетч работает,но есть одно но. Как только нажимается кнопка вал делает пол оборота назад,потом пол оборота вперед. Так и работает на кнопке по пол оборота,вперед и назад. Кнопка остается в нажатом состоянии.
Этот двигатель с редуктором,извините что не предупредил.
Количество шагов ротора: 64
Коэффициент редукции: 1/63,68395

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Эдуард » 18 авг 2018, 00:51

Делает пол оборота назад, а кнопка остается в нажатом состоянии? Почему? Не хватает шагов схода с датчика?

Если так, то надо увеличить число шагов схода.
myMotor.step(-20);
myMotor.step(20);

Аким
Сообщения: 5
Зарегистрирован: 16 авг 2018, 10:59

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Аким » 24 авг 2018, 11:46

Эдуард день добрый! Извините что сразу не ответил. Увеличил число шагов схода,все заработало. Огромное и большое вам спасибо.
Один вопрос на будущие. В дальнейшим может увеличится вес светильника,есть ли такая возможность подключить второй двигатель.
Чтоб работал от этой же программы с этими же концевиками но в противоположную сторону. Это когда одно колесо крутят два двигателя установленных с обоих сторон. Еще раз вам большое спасибо.

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

Re: Lightmover на Stepper Motor 28BYJ-48 – 5V

Сообщение Эдуард » 24 авг 2018, 11:57

Здравствуйте!
Со вторым двигателем, думаю, проблем не будет. Вопрос только в сходе сдатчиков. Можно один двигатель считать ведомым, а второй будет повторять его обороты в другую сторону.
В программу надо бы добавить сторожевой таймер.
В начало:
#include <avr/wdt.h>
В setup:
wdt_enable(WDTO_15MS);
В обработчик прерывания:
wdt_reset();


Вернуться в «Шаговые двигатели и драйверы»

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

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