Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31

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

18.02.2021, 08:39. Показов 1119. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2021, 08:39
Ответы с готовыми решениями:

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

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

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

2
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
18.02.2021, 09:02
Цитата Сообщение от alsu-24 Посмотреть сообщение
как организовать решение моей задачки?
использовать глобальные флаги направления. считали команду - установили флаг, далее проверяете этот флаг, и взависимости от его значения вызывать процедуру вращения.
1
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31
27.02.2021, 15:47  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
использовать глобальные флаги направления. считали команду - установили флаг, далее проверяете этот флаг, и взависимости от его значения вызывать процедуру вращения.
Последовал совету Почтальона, разобрался с совершенно несложным принципом организации кода 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2021, 15:47
Помогаю со студенческими работами здесь

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

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

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

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

ATMega и шаговый двигатель
есть ли какие-нибудь библиотеки для ATMega, для шаговых двигателей надо запустить три движка от одного контроллера необходимо...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru