1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 29
1

Шаговый двигатель и пульт

18.02.2021, 08:39. Показов 412. Ответов 2
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане!

Есть двигатель 28-BYJ48 с драйвером, ИК-приёмник и пульт. И Arduino Uno всем этим делом руководит.
Хочу сделать так, чтобы при нажатии на кнопку пульта '+' ротор двигателя вращался против часовой стрелки, а при нажатии на кнопку пульта '-' - по часовой стрелке.
На роторе двигателя находится шестерёнка D, ведущая шестерёнку A. Соответственно, когда ротор вращается против часовой стрелки, шестерёнка A идёт по часовой стрелке, т.е. "направо". Именно поэтому соответствующая процедура называется right, а не left. Это лишь дополнительное пояснение.

Привожу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <IRremote.h>
 
IRrecv irrecv(12);
decode_results results;
 
int IN1 = 8;
int IN2 = 9; 
int IN3 = 10;
int IN4 = 11; 
 
int time_del = 3000; 
 
void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();  
}
 
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value) {
      case 0x1689D827: // кнопка +
        right ();
        break;
      case 0x1689E01F: // кнопка -
        left ();
        break;
    }
  }
}
 
void right() {
  
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, HIGH); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, HIGH); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, HIGH); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, HIGH); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);  
 
}
 
void left() {
 
  digitalWrite(IN1, HIGH); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);  
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, HIGH); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, HIGH); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, HIGH); 
  delayMicroseconds(time_del);
  
}
Данный скетч позволяет только один раз нажать на кнопку '+' или '-' и привести в движение мой механизм. Однако при нажатии на '-' или '+' соответственно двигатель направление вращения ротора не меняет. Если я ставлю irrecv.resume(); в loop, то вращения нет (делается одиночный проход по процедуре). Хотя, как я понимаю, эта строка отвечает за приём очередной команды, что мне необходимо сделать.

Посоветуйте, пожалуйста, как организовать решение моей задачки?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2021, 08:39
Ответы с готовыми решениями:

Шаговый двигатель: как управлять?
Парни, наставьте на путь истинный, научите, как управлять шаговиком? В какой последовательности...

Дешифровка сигналов на шаговый двигатель
Добрый день, Подскажите, как сделать &quot;дешифровку&quot; сигналов на шаговый двигатель, чтобы понять на...

Шаговый двигатель работает с вибрацией
Прошу помощи. В данном скетче работает шаговый двигатель крутя диск, только диск начинает крутится...

Шаговый двигатель и аналоговые входы не работают
Всем здравствуйте. Купил на Али ардуину. Стартер кит. Столкнулся со следующими проблемами:...

2
управление сложностью
1677 / 1289 / 260
Регистрация: 22.03.2015
Сообщений: 7,543
Записей в блоге: 5
18.02.2021, 09:02 2
Цитата Сообщение от alsu-24 Посмотреть сообщение
как организовать решение моей задачки?
использовать глобальные флаги направления. считали команду - установили флаг, далее проверяете этот флаг, и взависимости от его значения вызывать процедуру вращения.
1
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 29
27.02.2021, 15:47  [ТС] 3
Цитата Сообщение от Почтальон Посмотреть сообщение
использовать глобальные флаги направления. считали команду - установили флаг, далее проверяете этот флаг, и взависимости от его значения вызывать процедуру вращения.
Последовал совету Почтальона, разобрался с совершенно несложным принципом организации кода Arduino и составил программу, реализующую:
- вращение ротора в одну сторону при нажатии на кнопку '+' или при предшествующем всему нажатии на кнопку 'вкл./выкл';
- вращение ротора в другую сторону при нажатии на кнопку '-';
- остановку вращения или возобновление вращения (в ранее задействованном направлении) после его остановки при нажатии на кнопку 'вкл./выкл.'.

Прилагаю код с подробными комментариями ниже. Всем спасибо за помощь и внимание!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <IRremote.h>
 
IRrecv irrecv(12); // номер пина на плате, к которому идёт провод от выхода 'S' ИК-приёмника 
decode_results results;
 
//номера пинов на плате, к которым идут провода от драйвера мотора
int IN1 = 2; 
int IN2 = 3; 
int IN3 = 4;
int IN4 = 5; 
 
int time_del = 5571.962216; 
int pastkey, // идентификатор последней нажатой клавиши 
rotation = 1, // идентификатор вращения (1 - в одну сторону, -1 - в другую сторону)
stst_i = 0; // идентификатор режима работы (1 - активный, 0 - пассивный)
 
void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  //Serial.begin(9600); // для вывода на монитор
  irrecv.enableIRIn();  
}
 
void loop() {
  if (irrecv.decode(&results)) { // если получен сигнал
    //Serial.println(results.value, HEX); // вывести код кнопки на монитор
    switch (results.value) {
      case 0x1689D827: // кнопка +
        right(); 
        stst_i = 1; // установка активного режима работы
        pastkey = 0x1689D827; // последняя нажатая кнопка: +
        break;
      case 0x1689E01F: // кнопка -
        left ();
        stst_i = 1; // установка активного режима работы
        pastkey = 0x1689E01F; // последняя нажатая кнопка: -
        break;
      case 0x1689D02F: // кнопка вкл./выкл.
        if (stst_i == 1) stst_i = 0; else stst_i = 1; // смена режима работы
        pastkey = 0x1689D02F; // последняя нажатая кнопка: вкл./выкл.
        stst();
        break;
    } 
    irrecv.resume(); // обнуление информации о прошлом сигнале и ожидание очередного сигнала
  }
  else { // если очередного сигнала нет, то продолжить действие, вызванной последней надатой кнопкой 
    switch (pastkey) {
      case 0x1689D827: // кнопка +
        right();
        break;
      case 0x1689E01F: // кнопка -
        left();
        break;
    }
  }
}
 
void right() { // функция вращения в одну сторону
 
  rotation = 1;
  
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, HIGH); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, HIGH); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, HIGH); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, HIGH); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);  
 
}
 
void left() { // функция вращения в другую сторону
 
  rotation = -1;
 
  digitalWrite(IN1, HIGH); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);  
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, HIGH); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, HIGH); 
  digitalWrite(IN4, LOW); 
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW); 
  digitalWrite(IN2, LOW); 
  digitalWrite(IN3, LOW); 
  digitalWrite(IN4, HIGH); 
  delayMicroseconds(time_del);
  
}
 
void stst() { // функция включения/выключения
  if (stst_i == 0) { // если задаётся пассивный режим работы, но не подавать напряжение
    digitalWrite(IN1, LOW); 
    digitalWrite(IN2, LOW); 
    digitalWrite(IN3, LOW); 
    digitalWrite(IN4, LOW);   
  }
  if (stst_i == 1) { // если задаётся активный режим работы
    if (rotation == 1) {
      right();
      pastkey = 0x1689D827;
    }
    else {
      left ();
      pastkey = 0x1689E01F;
    }
  }
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2021, 15:47

Перемещение платы по оси X вращая шаговый двигатель
Добрый день. Ничего подобного в сети ненашел поэтому обращаюсь к Вам.Возможно ли реализовать такое...

шаговый двигатель
Привет. Как можно поднять обороты шагового двигателя? Напряжения питания 12В, модель шагового...

Шаговый двигатель
Здравствуйте у меня вопрос по шаговому двигателю, а точнее по программе программа дожна следить...

2-фазный шаговый двигатель
42BYG008G. не подскажете, как должны выглядеть диаграмма сигналов на фазы? сдуру пробовал обычным...

Шаговый двигатель + PBII
Доброго времени суток! Заимел такую штуку - ...

Проседает шаговый двигатель
То есть он вертится.Но без усилия.В чем может быть причина?В обмотке?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.