Шаговый двигатель 28BYJ-48 + модуль ULN2003A

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Здравствуйте.Интересует управление этого шаговика при помощи двух кнопок(нажал первую двигатель крутится в одну сторону и соответственно другая кнопка крутит в другую).Нашол вот этот скетч но при заливке двигатель начинает крутиться сразу на кнопки не реагирует.Может кто занимался подобным и есть готовый скетч.Помогите плыыыыыз.

int button_1 = 2;
int button_2 = 3;
int motorPin1 = 8;          
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;

int motor_Speed = 4;
int motor_Step; 
int val1 = 0;
int val2 = 0;

  void setup() {
  pinMode(button_1, INPUT);
  pinMode(button_2, INPUT);
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop() {
  
  val1 = digitalRead(button_1);
  if (val1 == HIGH)
  {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(motor_Speed);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(motor_Speed);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(motor_Speed);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(motor_Speed);
  
    } 

   val2 = digitalRead(button_2);
   if (val2 == HIGH)

  {
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(motor_Speed);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(motor_Speed);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delay(motor_Speed);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delay(motor_Speed);
  }
}

 

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Схема по которой подключал

Joiner
Offline
Зарегистрирован: 04.09.2014

На левой кнопке всегда +5в. Подключение неправильное.

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Joiner пишет:

На левой кнопке всегда +5в. Подключение неправильное.

Поясните пожалуйста? Поменять 2 и 3 вывод кнопок местами?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нет, желтый провод к левой кнопке подключён неправильно. Сравни с правой кнопкой.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

/*
#1
шаговый двигатель -> 8,9,10,11 (Motor_pin[4])
#2
кнопка 1 -> 2 (btn1_pin) 0 нажата /1 нет
кнопка 2 -> 3 (btn2_pin) 0 нажата /1 нет
*/
//#1
const int Motor_pin[4] = {8, 9, 10, 11};
const int motor_Speed = 10; // длительность шага ШД , мксек
int dir;// направление вращения 0 стоит / 1 в + / 2 в минус
int i; // позиция ШД
//#2
const int btn1_pin = 2; // поворот в +
const int btn2_pin = 3; // поворот в -
int btn1 = 0;
int btn2 = 0;

void Motor_Pos(int i) { // установить ШД в нужную позицию 0,1,2,3
  static const int Pos[4][4] = {
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1,
  };
  digitalWrite(Motor_pin[0], Pos[i][0]);
  digitalWrite(Motor_pin[1], Pos[i][1]);
  digitalWrite(Motor_pin[2], Pos[i][2]);
  digitalWrite(Motor_pin[3], Pos[i][3]);
}

void setup() {
  //#1
  pinMode(Motor_pin[0], OUTPUT);
  pinMode(Motor_pin[1], OUTPUT);
  pinMode(Motor_pin[2], OUTPUT);
  pinMode(Motor_pin[3], OUTPUT);
  Motor_Pos(i = 0);
  dir = 0;
  //#2
  pinMode(btn1_pin, INPUT_PULLUP);
  btn1 = digitalRead(btn1_pin);
  pinMode(btn2_pin, INPUT_PULLUP);
  btn2 = digitalRead(btn2_pin);
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 обработка шага ШД
  static uint32_t past_1 = 0 ;
  if (MILLIS - past_1 >= motor_Speed ) { // если прошло время шага
    past_1 = MILLIS ;
    if (dir == 1) {
      i = i + 1;
      if (i > 3) i = 0;
    }
    if (dir == 2) {
      i = i - 1;
      if (i < 0) i = 3;
    }
      Motor_Pos(i = 0);
  }
  //#2  200 миллисекунд обработка кнопок
  static uint32_t past_2 = 0 ;
  if (MILLIS - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = MILLIS ;
    btn1 = digitalRead(btn1_pin);
    btn2 = digitalRead(btn2_pin);
    if (btn1 && btn2) dir = 0; // если кнопки не нажаты, то не вращать
    if (! btn1 ) dir = 1; // если кнопка 1  нажата, то вращать в +
    if (! btn2 ) dir = 2; // если кнопка 2  нажата, то вращать в -
  }
}

ПС Вот только кнопки придется повесить на землю

evgta
Offline
Зарегистрирован: 02.09.2016

Вот точно рабочий код


#include <OneWire.h>
#include <DallasTemperature.h>
#include <Stepper.h>

#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


int led = 3;      // пин 3 светодиод
int temp1 = 500;
int ztemp = 200;                // температура регулирования в диапазоне 21-30 градусов
int dtemp = 20;                  // разница между макс и мин теапер
long zader = 30000;               // время между измерениями
int x = 0;
int y = 0;
int z = 0;
long f = 0;
long h = 0;
int vper=1;
int but = 2; 
int ftemp = 1;

const int IN1 = 8;              //пины шаговика
const int IN2 = 10;
const int IN3 = 9;
const int IN4 = 11;
const int stepsPerRevolution = 2800; // шагов за один оборот
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); 

//================================================================================================
void setup(void)
{
  //Serial.begin(9600);
   sensors.begin();
  

myStepper.setSpeed(5); // скорость 5 об/минуту

pinMode(led, OUTPUT);     
digitalWrite(led, LOW);
pinMode(but, INPUT);
digitalWrite(but, HIGH);
button1();
vkl();
}
//=======================================================================================================
void loop(void)
{ 


y=temp1; 
temp();
//Serial.println(temp1);
//Serial.println(y);
//Serial.println(ztemp);
//Serial.println("=====");
if (temp1>=ztemp-dtemp){x=0;} 
if (temp1>=ztemp){x=0; z=0;} else {z=1;}
if (z==1 && temp1<=y ){x=1;}
if (temp1>=ztemp){x=0;}
if (x==1){vkl();} else{otkl();}
if (digitalRead(but)==LOW){button1();}
f=millis();
while(millis()<f+zader)
{
if (digitalRead(but)==LOW){button1();}
}

 

}




//--------------------------------------------------------------------------------------------------------------------------------------------------
void button1()                  
{

digitalWrite(led, LOW);
delay(300);
while(1){if(digitalRead(but)==HIGH){break;}}  // цикл блокировки зажатой клавиши
ztemp=ztemp+10;
if (ztemp>350){ztemp=210;}
//delay(700);

ftemp=ztemp-200;
ftemp=ftemp/10;
for (int i=1; i <= ftemp; i++)
{
digitalWrite(led, HIGH);
h=millis();
while(millis()<h+50)
{
if (digitalRead(but)==LOW){goto end1;}
}
digitalWrite(led, LOW);
h=millis();
while(millis()<h+300)
{
if (digitalRead(but)==LOW){goto end1;}
}
}


end1:
if (vper=1){digitalWrite(led, HIGH);}
if (digitalRead(but)==LOW){button1();}
}

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

void temp()                   // функция измерегия температуры ds18b20
{
 sensors.requestTemperatures();
temp1=sensors.getTempCByIndex(0)*10;

  
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
void otkl()
{
if (vper==0){ digitalWrite(led, LOW); myStepper.step(stepsPerRevolution);}   //вкючение или блокировка повторного включения шаговика если до уже выполнялась эта функция
vper=1;  
digitalWrite(8,LOW);    // отключает пины из режима удержания
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);

}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------
void vkl()
{
if (vper==1){ digitalWrite(led, HIGH); myStepper.step(-stepsPerRevolution);}   //вкючение или блокировка повторного включения шаговика если до уже выполнялась эта функция
vper=0; 
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);

}

 

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Спасибо всем за помощь.Левая кнопка должна быть подключенна как правая - всё работает.Ещё раз всем спасибо.