реверс шагового двигателя

kmk
Offline
Зарегистрирован: 22.09.2015

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



#include <Stepper.h>
#define steps 720

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 button1= A2;
int button2= A3;

Stepper stepper(steps, 8, 9, 10, 11);
int stepCount = 0;  // number of steps the motor has taken

int lookup[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}

void loop() {
 if (digitalRead(button1) == HIGH)
 {
  stepper.setSpeed(3);
  stepper.step(1);    
 
 } 
 if (digitalRead(button2) == HIGH)
 {
  stepper.setSpeed(3);
  stepper.step(-1);  
 } 

}

 

kmk
Offline
Зарегистрирован: 22.09.2015

Кто может,

#include <Stepper.h>
int steps = 630;
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 button1= A2;
int button2= A3;
Stepper stepper(steps, 8, 9, 10, 11);
int stepCount;  // number of steps the motor has taken
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
Serial.begin(9600);
}
void loop() {  Serial.println(stepCount);
 if (digitalRead(button1) == HIGH)
 {
  stepper.setSpeed(10);
  stepper.step(+1); 
  stepCount++;    
 } 
 if (digitalRead(button2) == HIGH)
 {
  stepper.setSpeed(10);
  stepper.step(-1);
  stepCount--;  
 } }

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

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

для начала разберись как подключаются кнопки и что такое дребезг

потом попробуй двумя кнопками светик вкл - выкл.

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

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
kmk
Offline
Зарегистрирован: 22.09.2015

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

Добавил в свой скэтч - delay, с любой кнопки продолжает крутиться только в одну сторону, назад крутится не хочет.

void loop() {  Serial.println(stepCount);
 if (digitalRead(button1) == HIGH)
 {
  stepper.setSpeed(10);
  stepper.step(2048); 
  delay(1000);
  stepCount++;    
 } 
 if (digitalRead(button2) == HIGH)
 {
  stepper.setSpeed(10);
  stepper.step(-2048);
  delay(1000);
  stepCount--;  
 } }

 

kmk
Offline
Зарегистрирован: 22.09.2015

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

void loop() {  Serial.println(stepCount);
 if (digitalRead(button1) == HIGH)
 {
  digitalWrite(led1, HIGH); 
  stepper.setSpeed(10);
  stepper.step(1); 
  delay(10);   
 } 
 if (digitalRead(button2) == HIGH)
 {
  digitalWrite(led2, HIGH);
  stepper.setSpeed(10);
  stepper.step(-1);
  delay(10);
 }
 digitalWrite(led1, LOW);  
 digitalWrite(led2, LOW);
 }

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так  https://www.arduino.cc/en/Tutorial/StepperOneRevolution

#include <Stepper.h>
#define steps 720

const int stepsPerRevolution=200; // количество шагов в полном обороте двигателя
Stepper myStepper(stepsPerRevolution,8,9,10,11);
int minangle=15; // угол поворота на 1 нажатие (шаг камеры)

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 button1= A2;
int button2= A3;

int stepCount = 0;  // number of steps the motor has taken

int lookup[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}

void loop() {
 if (digitalRead(button1) == HIGH)
 {
  myStepper.step(stepsPerRevolution*minangle/360*(-1)); 
 
 } 
 if (digitalRead(button2) == HIGH)
 {
  myStepper.step(stepsPerRevolution*minangle/360);
 } 

}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Или без библиотеки напрямую, будет крутить или нет, вперед/назад





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 button1= A2;
int button2= A3;
int sped = 5;

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}

void loop() {
 if (digitalRead(button1) == HIGH)
 {
  switch (poz) 
    {
    case 1:
      digitalWrite (motorPin1, 1 );
      delay (sped);
      digitalWrite (motorPin1, 0 );
	  delay (sped);
      poz =2;
      break;
    case 2:
      digitalWrite (motorPin2, 1 );
      delay (sped);
      digitalWrite (motorPin2, 0 );
      delay (sped);
	  poz =3;
      break;
    case 3:
      digitalWrite (motorPin3, 1 );
      delay (sped);
      digitalWrite (motorPin3, 0 );
      delay (sped);
	  poz =4;
      break;
    case 4:
      digitalWrite (motorPin4, 1 );
      delay (sped);
      digitalWrite (motorPin4, 0 );
      delay (sped);
	  poz =1;
      break;
    } 
 
 } 
 if (digitalRead(button2) == HIGH)
 {
  switch (poz) 
    {
    case 1:
      digitalWrite (motorPin4, 1 );
      delay (sped);
      digitalWrite (motorPin4, 0 );
      delay (sped);
	  poz =2;
      break;
    case 2:
      digitalWrite (motorPin3, 1 );
      delay (sped);
      digitalWrite (motorPin3, 0 );
      delay (sped);
	  poz =3;
      break;
    case 3:
      digitalWrite (motorPin2, 1 );
      delay (sped);
      digitalWrite (motorPin2, 0 );
      delay (sped);
	  poz =4;
      break;
    case 4:
      digitalWrite (motorPin1, 1 );
      delay (sped);
      digitalWrite (motorPin1, 0 );
      delay (sped);
	  poz =1;
      break;
    } 
 } 

}
kmk
Offline
Зарегистрирован: 22.09.2015

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

Но к сожалению ни один из вариантов не заработал, ротор мотора даже не крутится. Я не пойму, почему они утверждают, что если поменять значение на минус в  stepper.step(-1); мотор начинает крутится в обратную сторону, при этом это утверждение я встречал в разных скэтчах, скачивал, проверял, у меня крутится только в одну сторону. Может нужно мотор запитать через драйвер?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мне кажется, неплохо бы опубликовать схему включения.

kmk
Offline
Зарегистрирован: 22.09.2015

Всем кто отвечал ещё раз спасибо

я поменял концы на моторе голубой на оранжевый и реверс появился с помощью минуса. Есть подозрение, что китайцы перепутали цвет проводов. Мой скэтч работает можно копировать.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вы знаете вот эта последяя, без библиотеки, должна крутить чтобы проверить правильность подключения контактов. просто я копировал и забыл обьявить переменную poz ниже я выложу исправленую. 





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 button1= A2;
int button2= A3;
int sped = 5;
int poz =1 ;

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}

void loop() {
 if (digitalRead(button1) == HIGH)
 {
  switch (poz) 
    {
    case 1:
      digitalWrite (motorPin1, 1 );
      delay (sped);
      digitalWrite (motorPin1, 0 );
	  delay (sped);
      poz =2;
      break;
    case 2:
      digitalWrite (motorPin2, 1 );
      delay (sped);
      digitalWrite (motorPin2, 0 );
      delay (sped);
	  poz =3;
      break;
    case 3:
      digitalWrite (motorPin3, 1 );
      delay (sped);
      digitalWrite (motorPin3, 0 );
      delay (sped);
	  poz =4;
      break;
    case 4:
      digitalWrite (motorPin4, 1 );
      delay (sped);
      digitalWrite (motorPin4, 0 );
      delay (sped);
	  poz =1;
      break;
    } 
 
 } 
 if (digitalRead(button2) == HIGH)
 {
  switch (poz) 
    {
    case 1:
      digitalWrite (motorPin4, 1 );
      delay (sped);
      digitalWrite (motorPin4, 0 );
      delay (sped);
	  poz =2;
      break;
    case 2:
      digitalWrite (motorPin3, 1 );
      delay (sped);
      digitalWrite (motorPin3, 0 );
      delay (sped);
	  poz =3;
      break;
    case 3:
      digitalWrite (motorPin2, 1 );
      delay (sped);
      digitalWrite (motorPin2, 0 );
      delay (sped);
	  poz =4;
      break;
    case 4:
      digitalWrite (motorPin1, 1 );
      delay (sped);
      digitalWrite (motorPin1, 0 );
      delay (sped);
	  poz =1;
      break;
    } 
 } 

}

Если нет проверяйте правильность подключения!

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

mpa
Offline
Зарегистрирован: 16.09.2017

Спасибо за обсуждение темы. 

С анвлогичной проблемой справился благодаря этой теме, только при использовании драйвера ULN2003 достаточно поменять местами выыводы IN2 и IN3. Возможно, кому-то пригодится.

nick34e
Offline
Зарегистрирован: 16.08.2016

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