0 / 0 / 0
Регистрация: 15.05.2020
Сообщений: 4

Сервопривод и кнопки

15.05.2020, 22:56. Показов 1766. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, можете помочь с программой? В чем суть есть сервопривод, Ардуино и 4 кнопки. При нажатии на 1 кнопку сервопривод поворачивается в положение 110° , при нажатии на 2 - 45°, при нажатии на 3 - 180°. И при нажатии на 4 кнопку, Сервопривод поворачивается в
положение 180°, затем раз в 1секунду уменьшает угол на 15° до тех пор, пока угол поворота не будет меньше 60°
Спасибо, огромное если поможете!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2020, 22:56
Ответы с готовыми решениями:

сервопривод + 2 кнопки
Помогите исправить ардуино скетч.. Создавал скетч из несколько готовых скетчов... Но обьеденить не совсем получилоcь.... (Использую...

Сервопривод
Посоветуйте сервопривод, чтобы мог провернуть 1кг. С плечем 1м.

Сервопривод и PinBoard 2
Подскажите, для того чтобы запитать PB2, с подключёнными сервоприводами MG996R и SG90, от зарядки для мобильника 5В 2А, нужно переключить...

5
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
16.05.2020, 03:29
От нечего делать сделал набросок:

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
#include <Servo.h>
 
struct Worker
{
    int get_angle(uint8_t key_state)
    {
      new_time = millis();
      mode = select_mode(key_state);
      set_angle(mode);
      
      return angle;
    }
    Worker():angle(0), mode(0), prev_time(0), new_time(0)
    {}
  private:
    int angle;
    int mode;
    unsigned int prev_time, new_time;
    
  
    int select_mode(uint8_t key_state)
    {
      switch(key_state)
      {
        case 1 << 0:
        case 1 << 1:
        case 1 << 2:
        case 1 << 3: return key_state;
      }
      
      return mode;
    }
  
    void set_angle(int mode)
    {
      switch(mode)
      {
        case 1 << 0:
            angle = 110; return;
        case 1 << 1:
            angle =  45; return;
        case 1 << 2:
            angle = 180; return;
        case 1 << 3:
            let_dance(mode); return;
      }
    }
  
    void let_dance(int mode)
    {
      if(this->mode != mode)
      {
        start_dance(); // run once
      }
      else if (wait_done())
      {
        if (angle > 60)
        {
          angle -= 15;
        }
      }
    }
  
    void reset_timer()
    {
      prev_time = new_time;
    }
  
    void start_dance()
    {
      reset_timer();
      angle = 180;
    }
  
    bool wait_done()
    {
      if (new_time - prev_time >= 1000) // 1 sec
      {
        reset_timer();
        return true;
      }
      return false;
    }
};
 
struct Keyboard
{
  uint8_t get_keys()
  {
    uint8_t state = 0; // = PINB;
    uint8_t btn_no = 0;
    for(uint8_t pin_no = m_first_pin; pin_no < m_first_pin + m_num_btns; ++pin_no)
    {
      bool btn_pressed = digitalRead(pin_no) == LOW;
      if (btn_pressed)
      {
        state |= 1 << btn_no;
      }
      ++btn_no;
    }
    return state;
  }
  
  Keyboard()
  {
    for(uint8_t pin_no = m_first_pin; pin_no < m_first_pin + m_num_btns; ++pin_no)
    {
      pinMode(pin_no, INPUT_PULLUP);
    }
  }
  private:
    const uint8_t m_first_pin = 8;
    const uint8_t m_num_btns = 4;
};
 
Servo servo;
 
void setup()
{
  servo.attach(3);
}
 
void loop()
{
  static Keyboard keyboard;
  static Worker worker;
  
  uint8_t keys = keyboard.get_keys();
  int angle = worker.get_angle(keys);
  
  servo.write(angle);
}
потыкать палочкой в кнопки в симуляторе
Миниатюры
Сервопривод и кнопки  
0
0 / 0 / 0
Регистрация: 15.05.2020
Сообщений: 4
16.05.2020, 09:51  [ТС]
Max Dark, Спасибо, огромное. Вот только, можно как то это сделать более просто? Это я просто только учусь и половину не понимаю)

Добавлено через 1 час 15 минут
Max Dark, Вот я пытался вчера сделать, но ничего не получается https://www.tinkercad.com/thin... vod/editel
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
16.05.2020, 19:09
Shenado, что именно не понятно?
0
0 / 0 / 0
Регистрация: 15.05.2020
Сообщений: 4
16.05.2020, 19:44  [ТС]
Max Dark, А все я разобрался уже, спасибо огромное.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
16.05.2020, 21:00
немного подправил код. схема та же.
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <Servo.h>
 
/** структура "рабочий"
    управляет углом поворота сервопривода
*/
struct Worker
{
    // список режимов
    enum Mode
    {
      MODE_WAIT =      0, // режим ожидания команды
      MODE_A110 = 1 << 0, // установить угол в 110
      MODE_A045 = 1 << 1, // установить угол в 45
      MODE_A180 = 1 << 2, // установить угол в 180
      MODE_WORK = 1 << 3, // уменьшать угол 
    };
    
    // получить угол по состоянию кнопок
    int get_angle(uint8_t key_state)
    {
      // для таймера MODE_WORK
      new_time = millis();
      // выбрать режим работы
      int new_mode = select_mode(key_state);
      // установить угол согласно режиму
      this->mode = run_mode(new_mode);
      
      return angle;
    }
  
    // инициализация
    Worker():angle(0), mode(MODE_WAIT), prev_time(0), new_time(0)
    {}
  private:
    int angle; // текущий угол
    int mode; // режим
    // для таймера MODE_WORK
    unsigned int prev_time, new_time;
    
    // выбрать режим по состоянию кнопок
    int select_mode(uint8_t key_state)
    {
      // нас интересуют только первые 4 кнопки(нумерация с 0)
      // при этом должна быть нажата только одна
      switch(key_state)
      {
        case 1 << 0:
        case 1 << 1:
        case 1 << 2:
        case 1 << 3: return key_state;
      }
      
      // иначе вернем текущий режим
      return mode;
    }
  
    // установить угол согласно режиму
    int run_mode(int new_mode)
    {
      switch(new_mode)
      {
        case MODE_A110:
            angle = 110; return new_mode;
        case MODE_A045:
            angle =  45; return new_mode;
        case MODE_A180:
            angle = 180; return new_mode;
        case MODE_WORK:
            let_dance(new_mode); return new_mode;
      }
      return this->mode;
    }
  
    void let_dance(int new_mode)
    {
      if(this->mode != new_mode)
      {
        // запустить один раз при переходе в режим MODE_WORK
        start_dance();
      }
      else if (wait_done())
      {
        if (angle > 60)
        {
          // уменьшить угол на 15
          angle -= 15;
        }
        else
        {
          // перейдем в режим ожидания
          this->mode = MODE_WAIT;
        }
      }
    }
  
    // сброс таймера
    void reset_timer()
    {
      prev_time = new_time;
    }
  
    // запуск режима MODE_WORK
    void start_dance()
    {
      reset_timer();
      angle = 180;
    }
  
    // ожидание без использования delay
    // 1 секунда по умолчанию
    // если ожидание окончено, то сбрасывает таймер и возвращяет "истина"
    bool wait_done(unsigned int interval = 1000u)
    {
      if (new_time - prev_time >= interval)
      {
        reset_timer();
        return true;
      }
      return false;
    }
};
 
// клавиатура с паралельным подключением кнопок
struct Keyboard
{
  // получить состояние клавиатуры
  // состояние кнопки задается битовым полем в state
  uint8_t get_keys()
  {
    // состояние клавиатуры
    uint8_t state = 0; // = PINB;
    // номер провеняемой кнопки
    uint8_t btn_no = 0;
    
    // для каждой кнопки в клавиатуре
    for(uint8_t pin_no = m_first_pin; pin_no < m_first_pin + m_num_btns; ++pin_no)
    {
      // проверить нажата ли она
      bool btn_pressed = digitalRead(pin_no) == LOW;
      if (btn_pressed)
      {
        // да, нажата
        // запомним это
        state |= 1 << btn_no;
      }
      ++btn_no;
    }
    return state;
  }
  
  // инициализация клавиатуры
  // кнопки должны быть подключены между пином и GND
  Keyboard()
  {
    for(uint8_t pin_no = m_first_pin; pin_no < m_first_pin + m_num_btns; ++pin_no)
    {
      pinMode(pin_no, INPUT_PULLUP);
    }
  }
  private:
    // номер пина первой кнопки
    // пины к которым подключены кнопки должны идти последовательно
    const uint8_t m_first_pin = 8;
    // количество кнопок у клавиатуры(максимум 8 штук)
    const uint8_t m_num_btns  = 4;
};
 
Servo servo;
 
void setup()
{
  // настроим серво на 3м пине
  servo.attach(3);
}
 
void loop()
{
  // создадим клавиатуру
  static Keyboard keyboard;
  //    и "рабочего"
  static Worker worker;
  
  // получить состояние кнопок
  uint8_t keys = keyboard.get_keys();
  // спросить "рабочего": "Какой угол соответствует этой комбинации?"
  int angle = worker.get_angle(keys);
  // записать ответ
  servo.write(angle);
}
Добавлено через 17 минут
вроде исправил баг с 4й кнопкой
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <Servo.h>
 
/** структура "рабочий"
    управляет углом поворота сервопривода
*/
struct Worker
{
    // список режимов
    enum Mode
    {
      MODE_WAIT =      0, // режим ожидания команды
      MODE_A110 = 1 << 0, // установить угол в 110
      MODE_A045 = 1 << 1, // установить угол в 45
      MODE_A180 = 1 << 2, // установить угол в 180
      MODE_WORK = 1 << 3, // уменьшать угол 
    };
    
    // получить угол по состоянию кнопок
    int get_angle(uint8_t key_state)
    {
      // для таймера MODE_WORK
      new_time = millis();
      // выбрать режим работы
      int new_mode = select_mode(key_state);
      // установить угол согласно режиму
      this->mode = run_mode(new_mode);
      
      return angle;
    }
  
    // инициализация
    Worker():angle(0), mode(MODE_WAIT), prev_time(0), new_time(0)
    {}
  private:
    int angle; // текущий угол
    int mode; // режим
    // для таймера MODE_WORK
    unsigned int prev_time, new_time;
    
    // выбрать режим по состоянию кнопок
    int select_mode(uint8_t key_state)
    {
      // нас интересуют только первые 4 кнопки(нумерация с 0)
      // при этом должна быть нажата только одна
      switch(key_state)
      {
        case 1 << 0:
        case 1 << 1:
        case 1 << 2:
        case 1 << 3: return key_state;
      }
      
      // иначе вернем текущий режим
      return mode;
    }
  
    // установить угол согласно режиму
    int run_mode(int new_mode)
    {
      switch(new_mode)
      {
        case MODE_A110:
            angle = 110; return MODE_WAIT;
        case MODE_A045:
            angle =  45; return MODE_WAIT;
        case MODE_A180:
            angle = 180; return MODE_WAIT;
        case MODE_WORK:
            return let_dance(new_mode);
      }
      return this->mode;
    }
  
    int let_dance(int new_mode)
    {
      if(this->mode != new_mode)
      {
        // запустить один раз при переходе в режим MODE_WORK
        start_dance();
      }
      else if (wait_done())
      {
        if (angle > 60)
        {
          // уменьшить угол на 15
          angle -= 15;
        }
        else
        {
          // перейдем в режим ожидания
          return MODE_WAIT;
        }
      }
      // продолжим работу
      return MODE_WORK;
    }
  
    // сброс таймера
    void reset_timer()
    {
      prev_time = new_time;
    }
  
    // запуск режима MODE_WORK
    void start_dance()
    {
      reset_timer();
      angle = 180;
    }
  
    // ожидание без использования delay
    // 1 секунда по умолчанию
    // если ожидание окончено, то сбрасывает таймер и возвращяет "истина"
    bool wait_done(unsigned int interval = 1000u)
    {
      if (new_time - prev_time >= interval)
      {
        reset_timer();
        return true;
      }
      return false;
    }
};
 
// клавиатура с паралельным подключением кнопок
struct Keyboard
{
  // получить состояние клавиатуры
  // состояние кнопки задается битовым полем в state
  uint8_t get_keys()
  {
    // состояние клавиатуры
    uint8_t state = 0; // = PINB;
    // номер провеняемой кнопки
    uint8_t btn_no = 0;
    
    // для каждой кнопки в клавиатуре
    for(uint8_t pin_no = m_first_pin; pin_no < m_first_pin + m_num_btns; ++pin_no)
    {
      // проверить нажата ли она
      bool btn_pressed = digitalRead(pin_no) == LOW;
      if (btn_pressed)
      {
        // да, нажата
        // запомним это
        state |= 1 << btn_no;
      }
      ++btn_no;
    }
    return state;
  }
  
  // инициализация клавиатуры
  // кнопки должны быть подключены между пином и GND
  Keyboard()
  {
    for(uint8_t pin_no = m_first_pin; pin_no < m_first_pin + m_num_btns; ++pin_no)
    {
      pinMode(pin_no, INPUT_PULLUP);
    }
  }
  private:
    // номер пина первой кнопки
    // пины к которым подключены кнопки должны идти последовательно
    const uint8_t m_first_pin = 8;
    // количество кнопок у клавиатуры(максимум 8 штук)
    const uint8_t m_num_btns  = 4;
};
 
Servo servo;
 
void setup()
{
  // настроим серво на 3м пине
  servo.attach(3);
}
 
void loop()
{
  // создадим клавиатуру
  static Keyboard keyboard;
  //    и "рабочего"
  static Worker worker;
  
  // получить состояние кнопок
  uint8_t keys = keyboard.get_keys();
  // спросить "рабочего": "Какой угол соответствует этой комбинации?"
  int angle = worker.get_angle(keys);
  // записать ответ
  servo.write(angle);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2020, 21:00
Помогаю со студенческими работами здесь

Сервопривод и блютуз
Всем доброго времени суток! Решил заняться проектом, где необходимо использовать ардуино. Долго изучал и лазал по сайтам, но никак не могу...

пятиконтактный сервопривод
Привет. Нашел пятиконтактный сервопривод. Можно ли подключить к ардуино. Буду очень благодарен:friends:.

Дергается сервопривод
Всем привет. Я подключил 4 сервопривода SG90 и Bluetooth модуль к Arduino Uno. Когда я подключаюсь к ардуинке через телефон серво начинает...

Не работает сервопривод
https://usamodelkina.ru/10038-robot-hudozhnik-iz-staryh-sd-privodov.html Не работает сервопривод... помогите с программой, пожалуйста

Сервопривод на PIC-е...
Привет старожилам робо-форума! Я из смежной области - авиамодельной. Хочу заменить сервоэлектронику аналоговую на цифровую-например на...


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

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

Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru