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

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

15.05.2020, 22:56. Показов 1862. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru