Помогите с сервой
- Войдите на сайт для отправки комментариев
Сб, 07/03/2015 - 14:40
Привет народ, помогите со скетчем, сам не бум-бум :( Компоненты: серво мотор 180", 4кнопки, светодиод. 4 кнопки для поворота сервы на 0",45"135",180" градусов. Светодиод включается и горит пока серво находиться в одном из перечисленных положений. Что нужно: (серво на 90:) нажимаю кнопку, серво поворачивается на 0",при этом загорается св.диод и горит. Через 5 минут возвращается в положение 90" и св.диод гаснет . Или так, нажимаю кнопку, серво поворачивается на 0" (5 минут не прошло) нажимаю другую кнопку, серво поворачивается на 180", при этом св.диод горит, через 5 минут возвращается на 90" и св.диод гаснет. Проблема в том, что я незнаю как вернуть его через 5 минут после последнего действия на 90" :( Помогите плиз. Скетч который я нарисовал неподходит.
#include<Servo.h>
Servo myservo;
int led = 9;
int button_1 = 2;
int button_2 = 3;
int button_3 = 4;
int button_4 = 5;
int time = 50000;
int val=0;
void setup()
{
pinMode(led, OUTPUT);
pinMode(button_1, INPUT);
pinMode(button_2, INPUT);
pinMode(button_3, INPUT);
pinMode(button_4, INPUT);
myservo.attach(8);
}
void loop()
{
val = digitalRead(button_1);
if (val == HIGH)
{
digitalWrite(led, HIGH);
myservo.write(0);
delay(time);
myservo.write(90);
digitalWrite(led, LOW);
}
val = digitalRead(button_2);
if (val == HIGH)
{
digitalWrite(led, HIGH);
myservo.write(45);
delay(time);
myservo.write(90);
digitalWrite(led, LOW);
}
val = digitalRead(button_3);
if (val == HIGH)
{
digitalWrite(led, HIGH);
myservo.write(135);
delay(time);
myservo.write(90);
digitalWrite(led, LOW);
}
val = digitalRead(button_4);
if (val == HIGH)
{
digitalWrite(led, HIGH);
myservo.write(180);
delay(time);
myservo.write(90);
digitalWrite(led, LOW);
}
}
используй millis
Я догадываюсь что надо использовать millis, читаю, пытаюсь вникнуть, но пока некак :( я с ардуино начал работать меньше 5 дней назад, можно поподробней или пример, если не сложно конечно.
Подробнее здесь
01
#include <Servo.h>
02
#define ServoPin_1 9
03
#define ServoPin_2 10
04
boolean statusServo_1=0;
05
boolean statusServo_2=0;
06
byte
angle_1_0=0;
07
byte
angle_1_1=45;
08
byte
angle_2_0=0;
09
byte
angle_2_1=90;
10
unsigned
long
oldMillis_1;
11
unsigned
long
oldMillis_2;
12
Servo myServo1;
13
Servo myServo2;
14
//=====================================================
15
void
setup
()
16
{
17
myServo1.attach(ServoPin_1);
18
myServo1.write(angle_1_0);
19
myServo2.attach(ServoPin_2);
20
myServo2.write(angle_2_0);
21
delay(500);
// чтобы сервы успокоились
22
oldMillis_1=millis();
23
oldMillis_2=oldMillis_1;
24
}
25
//=====================================================
26
void
loop
()
27
{
28
if
((millis()-oldMillis_1)>2345)
// будет выполняться каждые 2,345 секунды
29
{
30
statusServo_1=!statusServo_1;
31
if
(statusServo_1) myServo1.write(angle_1_1);
32
else
myServo1.write(angle_1_0);
33
oldMillis_1=millis();
// перезапуск первого секундомера ( миллисекундмера )
34
}
35
36
if
((millis()-oldMillis_2)>5678)
// будет выполняться каждые 5,678 секунды
37
{
38
statusServo_2=!statusServo_2;
39
if
(statusServo_2) myServo2.write(angle_2_1);
40
else
myServo2.write(angle_2_0);
41
oldMillis_2=millis();
// перезапуск второго секундомера ( миллисекундмера )
42
}
43
}
44
//=====================================================
45
// кодили дети - им захотелось ТАК объяснить :)
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
http://arduino.ru/forum/obshchii/sokhranenie-kartinok-na-forume
01
#include<Servo.h>
02
Servo myservo;
03
int
led = 9;
04
int
button_array[4] = {2,3,4,5};
//массив пинво кнопок
05
int
servo_position[4]={0,90,135,180};
// какие позиции у нас есть
06
int
time_pause= 300000;
//в пяти минутах 300 сек, соотвтственно 300 000 мс
07
unsigned
long
time_next=0;
//флаг времени и меряем прошло пять минут или нет
08
int
prev_position=1000;
//предыдущая позиция используем как флаг круить не крутить ставим значение от балды но такое которого у вас никогда в жизни не будет
09
int
current_position=0;
//предполагаем что стартовое значение сервы ноль - можно поменять
10
void
setup
()
11
{
12
pinMode(led, OUTPUT);
13
for
(
int
i=0;i<4;i++)pinMode(button_array[i], INPUT);
//указали тип пинов кнопок
14
myservo.attach(8);
//указали где обитает серва
15
myservo.write(current_position);
//ставим серву на старовую позицию
16
delay(1000);
17
}
18
19
void
loop
()
20
{
21
22
for
(
int
i=0;i<4;i++){
// крутим массив с кнопками и палим какая кнопка нажмется
23
if
(digitalRead(button_array[i]) && current_position!=prev_position ){
//если кнопка нажата и положения разные то работаем зачем гонять серву если она уже и так стоит согласно "купленного билета"
24
myservo.write(servo_position[i]);
//поворачиваем серву согласно индекса сработавшей кнопки
25
prev_position=current_position;
////запоминаем прошлое состоние сервы
26
current_position=servo_position[i];
//запоминаем текущее состоние сервы
27
time_next=millis()+time_pause;
//увеличиваем флаг на пять минут
28
digitalWrite(led, HIGH);
//поджигаем фонарь
29
delay(1000);
30
}
31
}
32
if
(millis() >time_next & prev_position!=current_position){
//если время вышло и позиця прошлая и текущая различаются то возвращаем серву в прошлую позицю
33
myservo.write(prev_position);
34
prev_position=1000;
//запираем таймер
35
digitalWrite(led, LOW);
//тушим лампу
36
delay(1000);
37
}
38
}
Нарыл в cвоей кладовой немного подправил и сделал коменарии, нужно конечно еще дребезг кнопки побороть - пошукайте на амперке есть там есть пример.
1SANTER1,
ваша задача какая ?
5 возможных положений сервы ( 90 - это постоянное состояние ) , 4 кнопки для установки сервы на заданные углы , 4 СД для индикации текущего положения сервы ? так ?
по нажатию любой кнопки серва отрабатывает заданный угол и через 5 мин неактивности кнопок занимает угол 90 ?
после крайнего нажатия кнопок - снова ждём 5 мин и уводим серву на 90 ?
1SANTER1,
ваша задача какая ?
5 возможных положений сервы ( 90 - это постоянное состояние ) , 4 кнопки для установки сервы на заданные углы , 4 СД для индикации текущего положения сервы ? так ?
по нажатию любой кнопки серва отрабатывает заданный угол и через 5 мин неактивности кнопок занимает угол 90 ?
после крайнего нажатия кнопок - снова ждём 5 мин и уводим серву на 90 ?
А ну да если всегда вертать на 90гр то я промахнулся.. У меня задача была немного другая, тут попроще..
Ща поправим...
01
#include<Servo.h>
02
Servo myservo;
03
int
led = 9;
04
int
button_array[4] = {2,3,4,5};
//массив пинво кнопок
05
int
servo_position[4]={0,90,135,180};
// какие позиции у нас есть
06
int
time_pause= 300000;
//в пяти минутах 300 сек, соотвтственно 300 000 мс
07
unsigned
long
time_next=0;
//флаг времени и меряем прошло пять минут или нет
08
int
current_position=0;
//предполагаем что старовое значение сервы ноль - можно поменять
09
int
back_position=90;
//куда всегда возвращаемся
10
void
setup
()
11
{
12
pinMode(led, OUTPUT);
13
for
(
int
i=0;i<4;i++)pinMode(button_array[i], INPUT);
//указали тип пинов кнопок
14
myservo.attach(8);
//указали где обитает серва
15
myservo.write(current_position);
//ставим серву на старовую позицию
16
delay(1000);
17
}
18
void
loop
()
19
{
20
21
for
(
int
i=0;i<4;i++){
// крутим массив с кнопками и палим какая кнопка нажмется
22
if
(digitalRead(button_array[i]) & current_position!=servo_position[i]){
//если кнопка нажата и мотор не в том положении в котором сработала кнопка
23
myservo.write(servo_position[i]);
//поворачиваем серву согласно индекса сработавшей кнопки
24
current_position=servo_position[i];
//запоминаем текущее состоние сервы
25
time_next=millis()+time_pause;
//увеличиваем флаг на пять минут
26
digitalWrite(led, HIGH);
//поджигаем фонарь
27
28
}
29
}
30
if
(millis() >time_next & current_position!=back_position){
//если время вышло и не 90гр
31
myservo.write(back_position);
//крутим на 90
32
current_position=back_position;
//ставим текущей 90 тем самым запираем таймер
33
digitalWrite(led, LOW);
//тушим лампу
34
}
35
}
Теперь всегда возвращаемся на 90гр
переделанный код ТС ( чёбы меньше вникать )
01
#include<Servo.h>
02
#define led 9
03
#define button1 2
04
#define button2 3
05
#define button3 4
06
#define button4 5
07
Servo myServo;
08
unsigned
long
oldMillis;
09
//==========================================================
10
void
setup
()
11
{
12
pinMode(led,OUTPUT);
13
pinMode(button1,INPUT);
14
pinMode(button2,INPUT);
15
pinMode(button3,INPUT);
16
pinMode(button4,INPUT);
17
// myServo.attach(8);
18
oldMillis=millis();
19
}
20
//==========================================================
21
void
loop
()
22
{
23
if
(digitalRead(button1))
24
{
25
digitalWrite(led,HIGH);
26
myservo.write(0);
27
oldMillis=millis();
// обнуляем секундомер
28
}
29
if
(digitalRead(button2))
30
{
31
digitalWrite(led,HIGH);
32
myservo.write(45);
33
oldMillis=millis();
// обнуляем секундомер
34
}
35
if
(digitalRead(button3))
36
{
37
digitalWrite(led,HIGH);
38
myservo.write(135);
39
oldMillis=millis();
// обнуляем секундомер
40
}
41
if
(digitalRead(button4))
42
{
43
digitalWrite(led,HIGH);
44
myservo.write(180);
45
oldMillis=millis();
// обнуляем секундомер
46
}
47
48
if
((millis()-oldMillis)>5000)
// это сработает после 5 мин после крайнего обнуления секундомера
49
{
50
myservo.write(90);
51
digitalWrite(led, LOW);
52
}
53
}
54
//==========================================================
не скомпилится :( - 1SANTER1 , сам подправь где надо..... направление мыслей указано :)-
.....и прописано для 5 сек , а не мин :) ( ни умею пириводить меллесекунды ф менуты ) :)
не скомпилится :( - 1SANTER1 , сам подправь где надо..... направление мыслей указано :)-
.....и прописано для 5 сек , а не мин :) ( ни умею пириводить меллесекунды ф менуты ) :)
В последнем условии можно еще добавить oldMillis=millis(); а то поледнее условие будет всегда выполняться, в принципе по фигу, но...
да, не подумал.... незачем лишний раз командовать сервой :) спасибо :)
01
#include<Servo.h>
02
#define led 9
03
#define button1 2
04
#define button2 3
05
#define button3 4
06
#define button4 5
07
Servo myServo;
08
unsigned
long
oldMillis;
09
//==========================================================
10
void
setup
()
11
{
12
pinMode(led,OUTPUT);
13
pinMode(button1,INPUT);
14
pinMode(button2,INPUT);
15
pinMode(button3,INPUT);
16
pinMode(button4,INPUT);
17
myServo.attach(8);
18
oldMillis=millis();
19
}
20
//==========================================================
21
void
loop
()
22
{
23
if
(digitalRead(button1))
24
{
25
digitalWrite(led,HIGH);
26
myServo.write(0);
27
oldMillis=millis();
// обнуляем секундомер
28
}
29
if
(digitalRead(button2))
30
{
31
digitalWrite(led,HIGH);
32
myServo.write(45);
33
oldMillis=millis();
// обнуляем секундомер
34
}
35
if
(digitalRead(button3))
36
{
37
digitalWrite(led,HIGH);
38
myServo.write(135);
39
oldMillis=millis();
// обнуляем секундомер
40
}
41
if
(digitalRead(button4))
42
{
43
digitalWrite(led,HIGH);
44
myServo.write(180);
45
oldMillis=millis();
// обнуляем секундомер
46
}
47
48
if
((millis()-oldMillis)>300000)
// это сработает после 5 мин после крайнего обнуления секундомера
49
{
50
myServo.write(90);
51
digitalWrite(led, LOW);
52
oldMillis=millis();
// обнуляем секундомер
53
}
54
}
55
//==========================================================
1SANTER1,
переходите к схеме подключения кнопок по схеме "кнопка на землю, кнопка на пин, пин через внутренний подтягивающий резистор к VCC" - схема проще, но код надо поменять ( обратная логика )
Да но нужно будет не забыть в setup() включить эти подтягивающие резисторы на самой плате подав на пин с кнопкой HIGH иначе получим шиш при нажатии, а не 0.
воооооот ! ШИШ это вовсе не LOW и не HIGH - ШИШ ближе к Z-состоянию :) ( образно )
перейдёт на другую схему - не поймёт - спросит :)
....всё не объяснить сразу же, а может оно и не нано ему ? :(
Да но нужно будет не забыть в setup() включить эти подтягивающие резисторы на самой плате подав на пин с кнопкой HIGH иначе получим шиш при нажатии, а не 0.
при нажатии - 0 получим качественный ! а при отжатой кнопке - на пине будет розовый шум - почти что ШИШ.....
замена ШИШу - вовсе не ..й - а лексема русского языка - "ДА..., НЕТ....., НАВЕРНОЕ...."
:)
Всем большое спасибо. Пока немогу проверить, на даче пиво пью :) доберусь до дому отпишусь.
1
01
#include<Servo.h>
02
#define led 9
03
#define button1 2
04
#define button2 3
05
#define button3 4
06
#define button4 5
07
Servo myServo;
08
unsigned
long
oldMillis;
09
//==========================================================
10
void
setup
()
11
{
12
pinMode(led,OUTPUT);
//выход на св.диод
13
pinMode(button1,INPUT);
//кнопка на 0гр
14
pinMode(button2,INPUT);
//кнопка на 45гр
15
pinMode(button3,INPUT);
//кнопка на 135гр
16
pinMode(button4,INPUT);
//кнопка на 180гр
17
digitalWrite(2, HIGH);
//включаем подтягивающий резистор
18
digitalWrite(3, HIGH);
//включаем подтягивающий резистор
19
digitalWrite(4, HIGH);
//включаем подтягивающий резистор
20
digitalWrite(5, HIGH);
//включаем подтягивающий резистор
21
22
myServo.attach(8);
23
oldMillis=millis();
24
}
25
//==========================================================
26
void
loop
()
27
{
28
if
(digitalRead(button1))
29
{
30
digitalWrite(led,HIGH);
// включаем св.диод
31
myServo.write(0);
// серву на 0гр
32
oldMillis=millis();
// обнуляем секундомер
33
}
34
if
(digitalRead(button2))
35
{
36
digitalWrite(led,HIGH);
// включаем св.диод
37
myServo.write(45);
// серву на 45гр
38
oldMillis=millis();
// обнуляем секундомер
39
}
40
if
(digitalRead(button3))
41
{
42
digitalWrite(led,HIGH);
// включаем св.диод
43
myServo.write(135);
// серву на 135гр
44
oldMillis=millis();
// обнуляем секундомер
45
}
46
if
(digitalRead(button4))
47
{
48
digitalWrite(led,HIGH);
// включаем св.диод
49
myServo.write(180);
// серву на 180гр
50
oldMillis=millis();
// обнуляем секундомер
51
}
52
53
if
((millis()-oldMillis)>300000)
// это сработает после 5 мин после крайнего обнуления секундомера
54
{
55
myServo.write(90);
// серву на 90гр
56
digitalWrite(led, LOW);
// выключаем св.диод
57
oldMillis=millis();
// обнуляем секундомер
58
}
59
}
if
(digitalRead(button1)) >>>>>>>>
if
(digitalRead(!button1)) ( ! )
второе - при включенной подтяжке и кнопки к пину и земле
digitalWrite(2, HIGH); >>>>>>>>> digitalWrite(button1, HIGH);
потому что - #define button1 2
Знаков восклицательных тут наставьте
if
(!digitalRead(button1))
и кнопки на землю перекиньте.
А хотите я вам сделаю красиво?
01
#include<Servo.h>
02
03
// buttons pin connecting
04
#define led 9
05
#define btn0pin 2
06
#define btn45pin 3
07
#define btn135pin 4
08
#define btn180pin 5
09
10
// destination angle reading from buttons
11
#define dest0 !digitalRead(btn0pin)
12
#define dest45 !digitalRead(btn45pin)
13
#define dest135 !digitalRead(btn135pin)
14
#define dest180 !digitalRead(btn180pin)
15
16
// led control
17
#define ledON digitalWrite(led,HIGH)
18
#define ledOFF digitalWrite(led, LOW)
19
20
// servo positions " presets"
21
#define pos0 myServo.write(0)
22
#define pos45 myServo.write(45)
23
#define pos90 myServo.write(90)
24
#define pos135 myServo.write(135)
25
#define pos180 myServo.write(180)
26
27
28
29
Servo myServo;
30
unsigned
long
oldMillis;
31
//==========================================================
32
void
setup
()
33
{
34
pinMode( led , OUTPUT);
//выход на св.диод
35
pinMode( btn0pin , INPUT_PULLUP );
//кнопка на 0гр включаем подтягивающий резистор
36
pinMode( btn45pin , INPUT_PULLUP );
//кнопка на 45гр включаем подтягивающий резистор
37
pinMode( btn135pin , INPUT_PULLUP );
//кнопка на 135гр включаем подтягивающий резистор
38
pinMode( btn180pin , INPUT_PULLUP );
//кнопка на 180гр включаем подтягивающий резистор
39
40
41
myServo.attach(8);
42
oldMillis=millis();
43
}
44
//==========================================================
45
void
loop
(){
46
if
(dest0){
47
ledON;
48
pos0;
49
oldMillis=millis();
// обнуляем секундомер
50
}
51
if
(dest45){
52
ledON;
53
pos45;
54
oldMillis=millis();
// обнуляем секундомер
55
}
56
if
(dest135){
57
ledON;
58
pos135;
59
oldMillis=millis();
// обнуляем секундомер
60
}
61
if
(dest180){
62
ledON;
63
pos180;
64
oldMillis=millis();
// обнуляем секундомер
65
}
66
67
if
((millis()-oldMillis)>300000){
// это сработает после 5 мин после крайнего обнуления секундомера
68
ledOFF;
69
pos90;
70
oldMillis=millis();
// обнуляем секундомер
71
}
72
}
да сделай еще красивее. пока не заметил человек))
Уж подумать точно прийдётся..... Главное чтобы толк был, надеюсь не зря копипастил...
:) торопился в бассейн....
Уж подумать точно прийдётся..... Главное чтобы толк был, надеюсь не зря копипастил...
#define clear oldMillis=millis()
так тоже можно ? :)
myServo.detach();
и при каждом нажатии надо будет её снова подключать, лишние действия ( для вашей задачи )
#define clear oldMillis=millis()
так тоже можно ? :)
А почему нельзя собственно? Можно. Проверил, "clear" подсветилось как чьё-то ключевое слово. От греха подальше:
#define clearTime oldMillis=millis() работает.
И даже #define myDelay millis()-oldMillis
И даже #define myDelay millis()-oldMillis>30000
Главное не запутаться самому. Я бы с миллисом так не поступал. Чтобы видно было , он в глаза бросается, но это глобальная переменная и с ней поосторожней надо!!!
А вот пины-кнопки всякие- сам бог велел в события обратить
спасибо :)
myServo.detach();
и при каждом нажатии надо будет её снова подключать, лишние действия ( для вашей задачи )
Зато когда стоит- дёргаться не будет!
Кстати, открыл новую фичу при написании вот этого всего на форуме:
Если надо сделать перенос строки и нажать "Энтэр"- вставляется пустая стока.
А если нажать с "Шифтом"- не вставляется. !
myServo.detach();
и при каждом нажатии надо будет её снова подключать, лишние действия ( для вашей задачи )
Зато когда стоит- дёргаться не будет!
Кстати, открыл новую фичу при написании вот этого всего на форуме:
Если надо сделать перенос строки и нажать "Энтэр"- вставляется пустая стока.
А если нажать с "Шифтом"- не вставляется. !
Вот меня это и интересует чтоб недёргался и как это прописать ?
во всех ифах - сразу аттач
после команды на серву - задержка на время поворота сервы
потом - детач
энтер работает с шифтом !!!! :) Дадим увеличение плотности сообщений !!!!!!!!
а после аттач перед выставлением угла не будет случайное положение? если каждый раз так делать
Уже проходили. В библиотеке запоминается состояние в момент детача. После аттача оно-же и подаётся.
Даже больше, если после детача серву свернуть с пути истинного силой, то после аттача она поедет в запомненное положение
хорошо. продумали)
Всем огромное спасибо, всё работает как надо! Отдельное спасибо Pochemushka, SU-27-16, trembo. Помогли во многом разобраться! trembo мне очень понравился как вы нарисовали красивый код :) я почти дописал свою новую программку, оказалось не так всё сложно, если включить мозги :) Ещё раз спасибо. Закрываем тему.