Шаговый двигатель 28BYJ-48 + модуль ULN2003A
- Войдите на сайт для отправки комментариев
Вс, 11/12/2016 - 19:39
Здравствуйте.Интересует управление этого шаговика при помощи двух кнопок(нажал первую двигатель крутится в одну сторону и соответственно другая кнопка крутит в другую).Нашол вот этот скетч но при заливке двигатель начинает крутиться сразу на кнопки не реагирует.Может кто занимался подобным и есть готовый скетч.Помогите плыыыыыз.
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);
}
}
Схема по которой подключал
На левой кнопке всегда +5в. Подключение неправильное.
На левой кнопке всегда +5в. Подключение неправильное.
Поясните пожалуйста? Поменять 2 и 3 вывод кнопок местами?
Нет, желтый провод к левой кнопке подключён неправильно. Сравни с правой кнопкой.
/* #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 нажата, то вращать в - } }ПС Вот только кнопки придется повесить на землю
Вот точно рабочий код
#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); }Спасибо всем за помощь.Левая кнопка должна быть подключенна как правая - всё работает.Ещё раз всем спасибо.