Помогите с сервой
- Войдите на сайт для отправки комментариев
Сб, 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 дней назад, можно поподробней или пример, если не сложно конечно.
Подробнее здесь
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
http://arduino.ru/forum/obshchii/sokhranenie-kartinok-na-forume
Нарыл в cвоей кладовой немного подправил и сделал коменарии, нужно конечно еще дребезг кнопки побороть - пошукайте на амперке есть там есть пример.
1SANTER1,
ваша задача какая ?
5 возможных положений сервы ( 90 - это постоянное состояние ) , 4 кнопки для установки сервы на заданные углы , 4 СД для индикации текущего положения сервы ? так ?
по нажатию любой кнопки серва отрабатывает заданный угол и через 5 мин неактивности кнопок занимает угол 90 ?
после крайнего нажатия кнопок - снова ждём 5 мин и уводим серву на 90 ?
1SANTER1,
ваша задача какая ?
5 возможных положений сервы ( 90 - это постоянное состояние ) , 4 кнопки для установки сервы на заданные углы , 4 СД для индикации текущего положения сервы ? так ?
по нажатию любой кнопки серва отрабатывает заданный угол и через 5 мин неактивности кнопок занимает угол 90 ?
после крайнего нажатия кнопок - снова ждём 5 мин и уводим серву на 90 ?
А ну да если всегда вертать на 90гр то я промахнулся.. У меня задача была немного другая, тут попроще..
Ща поправим...
Теперь всегда возвращаемся на 90гр
переделанный код ТС ( чёбы меньше вникать )
не скомпилится :( - 1SANTER1 , сам подправь где надо..... направление мыслей указано :)-
.....и прописано для 5 сек , а не мин :) ( ни умею пириводить меллесекунды ф менуты ) :)
не скомпилится :( - 1SANTER1 , сам подправь где надо..... направление мыслей указано :)-
.....и прописано для 5 сек , а не мин :) ( ни умею пириводить меллесекунды ф менуты ) :)
В последнем условии можно еще добавить oldMillis=millis(); а то поледнее условие будет всегда выполняться, в принципе по фигу, но...
да, не подумал.... незачем лишний раз командовать сервой :) спасибо :)
1SANTER1,
переходите к схеме подключения кнопок по схеме "кнопка на землю, кнопка на пин, пин через внутренний подтягивающий резистор к VCC" - схема проще, но код надо поменять ( обратная логика )
Да но нужно будет не забыть в setup() включить эти подтягивающие резисторы на самой плате подав на пин с кнопкой HIGH иначе получим шиш при нажатии, а не 0.
воооооот ! ШИШ это вовсе не LOW и не HIGH - ШИШ ближе к Z-состоянию :) ( образно )
перейдёт на другую схему - не поймёт - спросит :)
....всё не объяснить сразу же, а может оно и не нано ему ? :(
Да но нужно будет не забыть в setup() включить эти подтягивающие резисторы на самой плате подав на пин с кнопкой HIGH иначе получим шиш при нажатии, а не 0.
при нажатии - 0 получим качественный ! а при отжатой кнопке - на пине будет розовый шум - почти что ШИШ.....
замена ШИШу - вовсе не ..й - а лексема русского языка - "ДА..., НЕТ....., НАВЕРНОЕ...."
:)
Всем большое спасибо. Пока немогу проверить, на даче пиво пью :) доберусь до дому отпишусь.
if
(digitalRead(button1)) >>>>>>>>
if
(digitalRead(!button1)) ( ! )
второе - при включенной подтяжке и кнопки к пину и земле
digitalWrite(2, HIGH); >>>>>>>>> digitalWrite(button1, HIGH);
потому что - #define button1 2
Знаков восклицательных тут наставьте
if
(!digitalRead(button1))
и кнопки на землю перекиньте.
А хотите я вам сделаю красиво?
да сделай еще красивее. пока не заметил человек))
Уж подумать точно прийдётся..... Главное чтобы толк был, надеюсь не зря копипастил...
:) торопился в бассейн....
Уж подумать точно прийдётся..... Главное чтобы толк был, надеюсь не зря копипастил...
#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 мне очень понравился как вы нарисовали красивый код :) я почти дописал свою новую программку, оказалось не так всё сложно, если включить мозги :) Ещё раз спасибо. Закрываем тему.